diff --git a/.editorconfig b/.editorconfig index 968b3d5..429d8e6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true -[project.json] +[{project.json,appsettings.json,appsettings.*.json}] indent_size = 2 [*.{yaml,yml}] diff --git a/YaeBlog.slnx b/YaeBlog.slnx index 4cf5583..8b6679e 100644 --- a/YaeBlog.slnx +++ b/YaeBlog.slnx @@ -7,9 +7,17 @@ + - - + + + + + + + + + diff --git a/YaeBlog/Extensions/ServiceCollectionExtensions.cs b/YaeBlog/Extensions/ServiceCollectionExtensions.cs deleted file mode 100644 index fbd2a34..0000000 --- a/YaeBlog/Extensions/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Markdig; -using YamlDotNet.Serialization; -using YamlDotNet.Serialization.NamingConventions; - -namespace YaeBlog.Extensions; - -public static class ServiceCollectionExtensions -{ - public static IServiceCollection AddMarkdig(this IServiceCollection collection) - { - MarkdownPipelineBuilder builder = new(); - - builder.UseAdvancedExtensions(); - - collection.AddSingleton(_ => builder.Build()); - - return collection; - } - - public static IServiceCollection AddYamlParser(this IServiceCollection collection) - { - DeserializerBuilder deserializerBuilder = new(); - deserializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); - deserializerBuilder.IgnoreUnmatchedProperties(); - collection.AddSingleton(deserializerBuilder.Build()); - - SerializerBuilder serializerBuilder = new(); - serializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); - collection.AddSingleton(serializerBuilder.Build()); - - return collection; - } -} diff --git a/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs b/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs deleted file mode 100644 index 078c89a..0000000 --- a/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -using AngleSharp; -using Microsoft.Extensions.Options; -using YaeBlog.Abstraction; -using YaeBlog.Services; -using YaeBlog.Models; -using YaeBlog.Processors; - -namespace YaeBlog.Extensions; - -public static class WebApplicationBuilderExtensions -{ - public static WebApplicationBuilder AddYaeBlog(this WebApplicationBuilder builder) - { - builder.Services.Configure(builder.Configuration.GetSection(BlogOptions.OptionName)); - - builder.Services.AddHttpClient(); - - builder.Services.AddMarkdig(); - builder.Services.AddYamlParser(); - builder.Services.AddSingleton(_ => Configuration.Default); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(); - builder.Services.AddTransient(provider => - provider.GetRequiredService>().Value); - - return builder; - } - - public static WebApplicationBuilder AddServer(this WebApplicationBuilder builder) - { - builder.Services.AddHostedService(); - - return builder; - } - - public static WebApplicationBuilder AddWatcher(this WebApplicationBuilder builder) - { - builder.Services.AddTransient(); - builder.Services.AddHostedService(); - - return builder; - } -} diff --git a/YaeBlog/Models/BlogEssay.cs b/YaeBlog/Models/BlogEssay.cs deleted file mode 100644 index becd55b..0000000 --- a/YaeBlog/Models/BlogEssay.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace YaeBlog.Models; - -public class BlogEssay : IComparable -{ - public required string Title { get; init; } - - public required string FileName { get; init; } - - public required bool IsDraft { get; init; } - - public required DateTimeOffset PublishTime { get; init; } - - public required DateTimeOffset UpdateTime { get; init; } - - public required string Description { get; init; } - - public required uint WordCount { get; init; } - - public required string ReadTime { get; init; } - - public List Tags { get; } = []; - - public required string HtmlContent { get; init; } - - public string EssayLink => $"/blog/essays/{FileName}"; - - public BlogEssay WithNewHtmlContent(string newHtmlContent) - { - var essay = new BlogEssay - { - Title = Title, - FileName = FileName, - IsDraft = IsDraft, - PublishTime = PublishTime, - UpdateTime = UpdateTime, - Description = Description, - WordCount = WordCount, - ReadTime = ReadTime, - HtmlContent = newHtmlContent - }; - essay.Tags.AddRange(Tags); - - return essay; - } - - public int CompareTo(BlogEssay? other) - { - if (other is null) - { - return -1; - } - - // 草稿文章应当排在前面 - if (IsDraft != other.IsDraft) - { - return IsDraft ? -1 : 1; - } - - return other.PublishTime.CompareTo(PublishTime); - } - - public override string ToString() - { - return $"{Title}-{PublishTime}"; - } -} diff --git a/YaeBlog/Models/BlogOptions.cs b/YaeBlog/Models/BlogOptions.cs deleted file mode 100644 index 0789f7a..0000000 --- a/YaeBlog/Models/BlogOptions.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace YaeBlog.Models; - -public class BlogOptions -{ - public const string OptionName = "Blog"; - - /// - /// 博客markdown文件的根目录 - /// - public required string Root { get; set; } - - /// - /// 博客正文的广而告之 - /// - public required string Announcement { get; set; } - - /// - /// 博客的起始年份 - /// - public required int StartYear { get; set; } - - /// - /// 博客的友链 - /// - public required List Links { get; set; } -} diff --git a/YaeBlog/Models/FriendLink.cs b/YaeBlog/Models/FriendLink.cs deleted file mode 100644 index e1f4640..0000000 --- a/YaeBlog/Models/FriendLink.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace YaeBlog.Models; - -/// -/// 友链模型类 -/// -public class FriendLink -{ - /// - /// 友链名称 - /// - public required string Name { get; set; } - - /// - /// 友链的简单介绍 - /// - public required string Description { get; set; } - - /// - /// 友链地址 - /// - public required string Link { get; set; } - - /// - /// 头像地址 - /// - public required string AvatarImage { get; set; } -} diff --git a/YaeBlog/appsettings.json b/YaeBlog/appsettings.json deleted file mode 100644 index dd6a150..0000000 --- a/YaeBlog/appsettings.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", - "Tailwind": { - "InputFile": "wwwroot/input.css", - "OutputFile": "wwwroot/output.css" - }, - "Blog": { - "Root": "source", - "Announcement": "博客锐意装修中,敬请期待!测试阶段如有问题还请海涵。", - "StartYear": 2021, - "Links": [ - { - "Name": "Ichirinko", - "Description": "这是个大哥", - "Link": "https://ichirinko.top", - "AvatarImage": "https://ichirinko-blog-img-1.oss-cn-shenzhen.aliyuncs.com/Pic_res/img/202209122110798.png" - }, - { - "Name": "不会写程序的晨旭", - "Description": "一个普通大学生", - "Link": "https://chenxutalk.top", - "AvatarImage": "https://www.chenxutalk.top/img/photo.png" - }, - { - "Name": "万木长风", - "Description": "世界渲染中...", - "Link": "https://ryohai.fun", - "AvatarImage": "https://ryohai.fun/static/favicons/favicon-32x32.png" - } - ] - } -} diff --git a/YaeBlog/build.ps1 b/build.ps1 similarity index 79% rename from YaeBlog/build.ps1 rename to build.ps1 index 7e4b350..ee766f1 100755 --- a/YaeBlog/build.ps1 +++ b/build.ps1 @@ -3,14 +3,32 @@ [cmdletbinding()] param( [Parameter(Mandatory = $true, Position = 0, HelpMessage = "Specify the build target")] - [ValidateSet("tailwind", "publish", "compress", "build", "dev", "new")] + [ValidateSet("tailwind", "publish", "compress", "build", "dev", "new", "watch", "serve", "list")] [string]$Target, [string]$Output = "wwwroot", [string]$Essay, - [switch]$Compress + [switch]$Compress, + [string]$Root = "source" ) begin { + if ($Target -eq "tailwind") + { + # Handle tailwind specially. + return + } + + # Set the content root. + $fullRootPath = Join-Path $(Get-Location) $Root + if (-not (Test-Path $fullRootPath)) + { + Write-Error "Content root $fullRootPath not existed." + exit 1 + } + + Write-Host "Use content from" $fullRootPath + $env:BLOG__ROOT=$fullRootPath + Write-Host "Building $Target..." if ($Target -eq "publish") @@ -30,6 +48,9 @@ begin { exit 1 } } + + # Set to the current location. + Push-Location src/YaeBlog } process { @@ -87,6 +108,7 @@ process { } } + switch ($Target) { "tailwind" { @@ -119,6 +141,21 @@ process { "new" { dotnet run -- new $Essay } + "watch" { + dotnet run -- watch + break + } + "serve" { + dotnet run -- serve + break + } + "list" { + dotnet run -- list + break + } } } +end { + Pop-Location +} diff --git a/YaeBlog/source/drafts/.gitkeep b/source/drafts/.gitkeep similarity index 100% rename from YaeBlog/source/drafts/.gitkeep rename to source/drafts/.gitkeep diff --git a/YaeBlog/source/posts/.gitkeep b/source/posts/.gitkeep similarity index 100% rename from YaeBlog/source/posts/.gitkeep rename to source/posts/.gitkeep diff --git a/YaeBlog/source/posts/2021-final.md b/source/posts/2021-final.md similarity index 100% rename from YaeBlog/source/posts/2021-final.md rename to source/posts/2021-final.md diff --git a/YaeBlog/source/posts/2021-final/1.webp b/source/posts/2021-final/1.webp similarity index 100% rename from YaeBlog/source/posts/2021-final/1.webp rename to source/posts/2021-final/1.webp diff --git a/YaeBlog/source/posts/2022-final.md b/source/posts/2022-final.md similarity index 100% rename from YaeBlog/source/posts/2022-final.md rename to source/posts/2022-final.md diff --git a/YaeBlog/source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.webp b/source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.webp similarity index 100% rename from YaeBlog/source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.webp rename to source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.webp diff --git a/YaeBlog/source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.webp b/source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.webp similarity index 100% rename from YaeBlog/source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.webp rename to source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.webp diff --git a/YaeBlog/source/posts/2022-summer-vacation.md b/source/posts/2022-summer-vacation.md similarity index 100% rename from YaeBlog/source/posts/2022-summer-vacation.md rename to source/posts/2022-summer-vacation.md diff --git a/YaeBlog/source/posts/2022-summer-vacation/result1.webp b/source/posts/2022-summer-vacation/result1.webp similarity index 100% rename from YaeBlog/source/posts/2022-summer-vacation/result1.webp rename to source/posts/2022-summer-vacation/result1.webp diff --git a/YaeBlog/source/posts/2023-final.md b/source/posts/2023-final.md similarity index 100% rename from YaeBlog/source/posts/2023-final.md rename to source/posts/2023-final.md diff --git a/YaeBlog/source/posts/2023-final/image-20240303165826486.webp b/source/posts/2023-final/image-20240303165826486.webp similarity index 100% rename from YaeBlog/source/posts/2023-final/image-20240303165826486.webp rename to source/posts/2023-final/image-20240303165826486.webp diff --git a/YaeBlog/source/posts/2024-final.md b/source/posts/2024-final.md similarity index 100% rename from YaeBlog/source/posts/2024-final.md rename to source/posts/2024-final.md diff --git a/YaeBlog/source/posts/2024-final/image-20250115171809775.webp b/source/posts/2024-final/image-20250115171809775.webp similarity index 100% rename from YaeBlog/source/posts/2024-final/image-20250115171809775.webp rename to source/posts/2024-final/image-20250115171809775.webp diff --git a/YaeBlog/source/posts/archlinux-sop.md b/source/posts/archlinux-sop.md similarity index 100% rename from YaeBlog/source/posts/archlinux-sop.md rename to source/posts/archlinux-sop.md diff --git a/YaeBlog/source/posts/aspnet-authorization.md b/source/posts/aspnet-authorization.md similarity index 100% rename from YaeBlog/source/posts/aspnet-authorization.md rename to source/posts/aspnet-authorization.md diff --git a/YaeBlog/source/posts/aspnet-authorization/middleware-pipeline.svg b/source/posts/aspnet-authorization/middleware-pipeline.svg similarity index 100% rename from YaeBlog/source/posts/aspnet-authorization/middleware-pipeline.svg rename to source/posts/aspnet-authorization/middleware-pipeline.svg diff --git a/YaeBlog/source/posts/aspnetcore-swa.md b/source/posts/aspnetcore-swa.md similarity index 100% rename from YaeBlog/source/posts/aspnetcore-swa.md rename to source/posts/aspnetcore-swa.md diff --git a/YaeBlog/source/posts/aspnetcore-swa/image-20251231225433184.webp b/source/posts/aspnetcore-swa/image-20251231225433184.webp similarity index 100% rename from YaeBlog/source/posts/aspnetcore-swa/image-20251231225433184.webp rename to source/posts/aspnetcore-swa/image-20251231225433184.webp diff --git a/YaeBlog/source/posts/big-homework.md b/source/posts/big-homework.md similarity index 100% rename from YaeBlog/source/posts/big-homework.md rename to source/posts/big-homework.md diff --git a/YaeBlog/source/posts/big-homework/1.webp b/source/posts/big-homework/1.webp similarity index 100% rename from YaeBlog/source/posts/big-homework/1.webp rename to source/posts/big-homework/1.webp diff --git a/YaeBlog/source/posts/build-blog-record.md b/source/posts/build-blog-record.md similarity index 100% rename from YaeBlog/source/posts/build-blog-record.md rename to source/posts/build-blog-record.md diff --git a/YaeBlog/source/posts/build-blog-record/1.webp b/source/posts/build-blog-record/1.webp similarity index 100% rename from YaeBlog/source/posts/build-blog-record/1.webp rename to source/posts/build-blog-record/1.webp diff --git a/YaeBlog/source/posts/build-blog-record/2.webp b/source/posts/build-blog-record/2.webp similarity index 100% rename from YaeBlog/source/posts/build-blog-record/2.webp rename to source/posts/build-blog-record/2.webp diff --git a/YaeBlog/source/posts/build-dotnet-from-source.md b/source/posts/build-dotnet-from-source.md similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source.md rename to source/posts/build-dotnet-from-source.md diff --git a/YaeBlog/source/posts/build-dotnet-from-source/image-20240824120646587.webp b/source/posts/build-dotnet-from-source/image-20240824120646587.webp similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source/image-20240824120646587.webp rename to source/posts/build-dotnet-from-source/image-20240824120646587.webp diff --git a/YaeBlog/source/posts/build-dotnet-from-source/image-20240824121425007.webp b/source/posts/build-dotnet-from-source/image-20240824121425007.webp similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source/image-20240824121425007.webp rename to source/posts/build-dotnet-from-source/image-20240824121425007.webp diff --git a/YaeBlog/source/posts/build-dotnet-from-source/image-20240824134158262.webp b/source/posts/build-dotnet-from-source/image-20240824134158262.webp similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source/image-20240824134158262.webp rename to source/posts/build-dotnet-from-source/image-20240824134158262.webp diff --git a/YaeBlog/source/posts/build-dotnet-from-source/image-20240824153514149.webp b/source/posts/build-dotnet-from-source/image-20240824153514149.webp similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source/image-20240824153514149.webp rename to source/posts/build-dotnet-from-source/image-20240824153514149.webp diff --git a/YaeBlog/source/posts/build-dotnet-from-source/image-20240824214145759.webp b/source/posts/build-dotnet-from-source/image-20240824214145759.webp similarity index 100% rename from YaeBlog/source/posts/build-dotnet-from-source/image-20240824214145759.webp rename to source/posts/build-dotnet-from-source/image-20240824214145759.webp diff --git a/YaeBlog/source/posts/c-include-problems.md b/source/posts/c-include-problems.md similarity index 100% rename from YaeBlog/source/posts/c-include-problems.md rename to source/posts/c-include-problems.md diff --git a/YaeBlog/source/posts/c-include-problems/1.webp b/source/posts/c-include-problems/1.webp similarity index 100% rename from YaeBlog/source/posts/c-include-problems/1.webp rename to source/posts/c-include-problems/1.webp diff --git a/YaeBlog/source/posts/c-include-problems/2.webp b/source/posts/c-include-problems/2.webp similarity index 100% rename from YaeBlog/source/posts/c-include-problems/2.webp rename to source/posts/c-include-problems/2.webp diff --git a/YaeBlog/source/posts/cncc-2024.md b/source/posts/cncc-2024.md similarity index 100% rename from YaeBlog/source/posts/cncc-2024.md rename to source/posts/cncc-2024.md diff --git a/YaeBlog/source/posts/cncc-2024/image-20241102211959206.webp b/source/posts/cncc-2024/image-20241102211959206.webp similarity index 100% rename from YaeBlog/source/posts/cncc-2024/image-20241102211959206.webp rename to source/posts/cncc-2024/image-20241102211959206.webp diff --git a/YaeBlog/source/posts/cncc-2024/image-20241102212355390.webp b/source/posts/cncc-2024/image-20241102212355390.webp similarity index 100% rename from YaeBlog/source/posts/cncc-2024/image-20241102212355390.webp rename to source/posts/cncc-2024/image-20241102212355390.webp diff --git a/YaeBlog/source/posts/cncc-2024/image-20241102212536635.webp b/source/posts/cncc-2024/image-20241102212536635.webp similarity index 100% rename from YaeBlog/source/posts/cncc-2024/image-20241102212536635.webp rename to source/posts/cncc-2024/image-20241102212536635.webp diff --git a/YaeBlog/source/posts/cncc-2024/image-20241102212738598.webp b/source/posts/cncc-2024/image-20241102212738598.webp similarity index 100% rename from YaeBlog/source/posts/cncc-2024/image-20241102212738598.webp rename to source/posts/cncc-2024/image-20241102212738598.webp diff --git a/YaeBlog/source/posts/compile-mediapipe.md b/source/posts/compile-mediapipe.md similarity index 100% rename from YaeBlog/source/posts/compile-mediapipe.md rename to source/posts/compile-mediapipe.md diff --git a/YaeBlog/source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.webp b/source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.webp similarity index 100% rename from YaeBlog/source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.webp rename to source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.webp diff --git a/YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.webp b/source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.webp similarity index 100% rename from YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.webp rename to source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.webp diff --git a/YaeBlog/source/posts/computer-architecture-pipeline.md b/source/posts/computer-architecture-pipeline.md similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline.md rename to source/posts/computer-architecture-pipeline.md diff --git a/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184855300.webp b/source/posts/computer-architecture-pipeline/image-20240612184855300.webp similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184855300.webp rename to source/posts/computer-architecture-pipeline/image-20240612184855300.webp diff --git a/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184949777.webp b/source/posts/computer-architecture-pipeline/image-20240612184949777.webp similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184949777.webp rename to source/posts/computer-architecture-pipeline/image-20240612184949777.webp diff --git a/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612190426368.webp b/source/posts/computer-architecture-pipeline/image-20240612190426368.webp similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline/image-20240612190426368.webp rename to source/posts/computer-architecture-pipeline/image-20240612190426368.webp diff --git a/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612192700169.webp b/source/posts/computer-architecture-pipeline/image-20240612192700169.webp similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline/image-20240612192700169.webp rename to source/posts/computer-architecture-pipeline/image-20240612192700169.webp diff --git a/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612193301372.webp b/source/posts/computer-architecture-pipeline/image-20240612193301372.webp similarity index 100% rename from YaeBlog/source/posts/computer-architecture-pipeline/image-20240612193301372.webp rename to source/posts/computer-architecture-pipeline/image-20240612193301372.webp diff --git a/YaeBlog/source/posts/daily-linux-0.md b/source/posts/daily-linux-0.md similarity index 100% rename from YaeBlog/source/posts/daily-linux-0.md rename to source/posts/daily-linux-0.md diff --git a/YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.webp b/source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.webp rename to source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.webp diff --git a/YaeBlog/source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.webp b/source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.webp rename to source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.webp diff --git a/YaeBlog/source/posts/daily-linux-1.md b/source/posts/daily-linux-1.md similarity index 100% rename from YaeBlog/source/posts/daily-linux-1.md rename to source/posts/daily-linux-1.md diff --git a/YaeBlog/source/posts/daily-linux-2.md b/source/posts/daily-linux-2.md similarity index 100% rename from YaeBlog/source/posts/daily-linux-2.md rename to source/posts/daily-linux-2.md diff --git a/YaeBlog/source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.avif b/source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.avif similarity index 100% rename from YaeBlog/source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.avif rename to source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.avif diff --git a/YaeBlog/source/posts/daily-linux-2/image-20230702205919301.webp b/source/posts/daily-linux-2/image-20230702205919301.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-2/image-20230702205919301.webp rename to source/posts/daily-linux-2/image-20230702205919301.webp diff --git a/YaeBlog/source/posts/daily-linux-3.md b/source/posts/daily-linux-3.md similarity index 100% rename from YaeBlog/source/posts/daily-linux-3.md rename to source/posts/daily-linux-3.md diff --git a/YaeBlog/source/posts/daily-linux-3/Screenshot_20230904_144149.webp b/source/posts/daily-linux-3/Screenshot_20230904_144149.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-3/Screenshot_20230904_144149.webp rename to source/posts/daily-linux-3/Screenshot_20230904_144149.webp diff --git a/YaeBlog/source/posts/daily-linux-4.md b/source/posts/daily-linux-4.md similarity index 100% rename from YaeBlog/source/posts/daily-linux-4.md rename to source/posts/daily-linux-4.md diff --git a/YaeBlog/source/posts/daily-linux-4/Screenshot_20240309_115143.webp b/source/posts/daily-linux-4/Screenshot_20240309_115143.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-4/Screenshot_20240309_115143.webp rename to source/posts/daily-linux-4/Screenshot_20240309_115143.webp diff --git a/YaeBlog/source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.webp b/source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.webp rename to source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.webp diff --git a/YaeBlog/source/posts/daily-linux-4/image-20240309130329784.webp b/source/posts/daily-linux-4/image-20240309130329784.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-4/image-20240309130329784.webp rename to source/posts/daily-linux-4/image-20240309130329784.webp diff --git a/YaeBlog/source/posts/daily-linux-4/image-20240309131750535.webp b/source/posts/daily-linux-4/image-20240309131750535.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-4/image-20240309131750535.webp rename to source/posts/daily-linux-4/image-20240309131750535.webp diff --git a/YaeBlog/source/posts/daily-linux-4/image-20240309134847166.webp b/source/posts/daily-linux-4/image-20240309134847166.webp similarity index 100% rename from YaeBlog/source/posts/daily-linux-4/image-20240309134847166.webp rename to source/posts/daily-linux-4/image-20240309134847166.webp diff --git a/YaeBlog/source/posts/dotnet-performance-8.md b/source/posts/dotnet-performance-8.md similarity index 100% rename from YaeBlog/source/posts/dotnet-performance-8.md rename to source/posts/dotnet-performance-8.md diff --git a/YaeBlog/source/posts/dotnet-performance-8/HeapsWhereNetObjectsLive.webp b/source/posts/dotnet-performance-8/HeapsWhereNetObjectsLive.webp similarity index 100% rename from YaeBlog/source/posts/dotnet-performance-8/HeapsWhereNetObjectsLive.webp rename to source/posts/dotnet-performance-8/HeapsWhereNetObjectsLive.webp diff --git a/YaeBlog/source/posts/dotnet-performance-8/image-20240828135354598.webp b/source/posts/dotnet-performance-8/image-20240828135354598.webp similarity index 100% rename from YaeBlog/source/posts/dotnet-performance-8/image-20240828135354598.webp rename to source/posts/dotnet-performance-8/image-20240828135354598.webp diff --git a/YaeBlog/source/posts/dotnet-performance-8/image-20240828155556375.webp b/source/posts/dotnet-performance-8/image-20240828155556375.webp similarity index 100% rename from YaeBlog/source/posts/dotnet-performance-8/image-20240828155556375.webp rename to source/posts/dotnet-performance-8/image-20240828155556375.webp diff --git a/YaeBlog/source/posts/environment-setting.md b/source/posts/environment-setting.md similarity index 100% rename from YaeBlog/source/posts/environment-setting.md rename to source/posts/environment-setting.md diff --git a/YaeBlog/source/posts/environment-setting/6.webp b/source/posts/environment-setting/6.webp similarity index 100% rename from YaeBlog/source/posts/environment-setting/6.webp rename to source/posts/environment-setting/6.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1.md b/source/posts/genshin-gacha-1.md similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1.md rename to source/posts/genshin-gacha-1.md diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.webp b/source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.webp b/source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.webp b/source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.webp b/source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.webp b/source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.webp b/source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.webp diff --git a/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.webp b/source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.webp similarity index 100% rename from YaeBlog/source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.webp rename to source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model.md b/source/posts/heterogeneous-programming-model.md similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model.md rename to source/posts/heterogeneous-programming-model.md diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/83ee1d254d638536d0fb4197ff63e758.webp b/source/posts/heterogeneous-programming-model/83ee1d254d638536d0fb4197ff63e758.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/83ee1d254d638536d0fb4197ff63e758.webp rename to source/posts/heterogeneous-programming-model/83ee1d254d638536d0fb4197ff63e758.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/9eb06d8be92ddef3db33e040163c67a7.webp b/source/posts/heterogeneous-programming-model/9eb06d8be92ddef3db33e040163c67a7.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/9eb06d8be92ddef3db33e040163c67a7.webp rename to source/posts/heterogeneous-programming-model/9eb06d8be92ddef3db33e040163c67a7.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/Screenshot_20241016_214139.webp b/source/posts/heterogeneous-programming-model/Screenshot_20241016_214139.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/Screenshot_20241016_214139.webp rename to source/posts/heterogeneous-programming-model/Screenshot_20241016_214139.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/Screenshot_20241016_214939.webp b/source/posts/heterogeneous-programming-model/Screenshot_20241016_214939.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/Screenshot_20241016_214939.webp rename to source/posts/heterogeneous-programming-model/Screenshot_20241016_214939.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/eab553f9e30d8d866a1ddd201b5e4c85.webp b/source/posts/heterogeneous-programming-model/eab553f9e30d8d866a1ddd201b5e4c85.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/eab553f9e30d8d866a1ddd201b5e4c85.webp rename to source/posts/heterogeneous-programming-model/eab553f9e30d8d866a1ddd201b5e4c85.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/image-20241020142938110.webp b/source/posts/heterogeneous-programming-model/image-20241020142938110.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/image-20241020142938110.webp rename to source/posts/heterogeneous-programming-model/image-20241020142938110.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/image-20241020155656219.webp b/source/posts/heterogeneous-programming-model/image-20241020155656219.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/image-20241020155656219.webp rename to source/posts/heterogeneous-programming-model/image-20241020155656219.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/image-20241029123308139.webp b/source/posts/heterogeneous-programming-model/image-20241029123308139.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/image-20241029123308139.webp rename to source/posts/heterogeneous-programming-model/image-20241029123308139.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/image-20241029163654675.webp b/source/posts/heterogeneous-programming-model/image-20241029163654675.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/image-20241029163654675.webp rename to source/posts/heterogeneous-programming-model/image-20241029163654675.webp diff --git a/YaeBlog/source/posts/heterogeneous-programming-model/image-20241103162259981.webp b/source/posts/heterogeneous-programming-model/image-20241103162259981.webp similarity index 100% rename from YaeBlog/source/posts/heterogeneous-programming-model/image-20241103162259981.webp rename to source/posts/heterogeneous-programming-model/image-20241103162259981.webp diff --git a/YaeBlog/source/posts/hpc-2025-cpu-architecture.md b/source/posts/hpc-2025-cpu-architecture.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cpu-architecture.md rename to source/posts/hpc-2025-cpu-architecture.md diff --git a/YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313184421305.webp b/source/posts/hpc-2025-cpu-architecture/image-20250313184421305.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313184421305.webp rename to source/posts/hpc-2025-cpu-architecture/image-20250313184421305.webp diff --git a/YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313184732892.webp b/source/posts/hpc-2025-cpu-architecture/image-20250313184732892.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313184732892.webp rename to source/posts/hpc-2025-cpu-architecture/image-20250313184732892.webp diff --git a/YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313190913475.webp b/source/posts/hpc-2025-cpu-architecture/image-20250313190913475.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cpu-architecture/image-20250313190913475.webp rename to source/posts/hpc-2025-cpu-architecture/image-20250313190913475.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda.md b/source/posts/hpc-2025-cuda.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda.md rename to source/posts/hpc-2025-cuda.md diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424192311202.webp b/source/posts/hpc-2025-cuda/image-20250424192311202.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424192311202.webp rename to source/posts/hpc-2025-cuda/image-20250424192311202.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424192825010.webp b/source/posts/hpc-2025-cuda/image-20250424192825010.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424192825010.webp rename to source/posts/hpc-2025-cuda/image-20250424192825010.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424193125125.webp b/source/posts/hpc-2025-cuda/image-20250424193125125.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424193125125.webp rename to source/posts/hpc-2025-cuda/image-20250424193125125.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424195111341.webp b/source/posts/hpc-2025-cuda/image-20250424195111341.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424195111341.webp rename to source/posts/hpc-2025-cuda/image-20250424195111341.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424195221886.webp b/source/posts/hpc-2025-cuda/image-20250424195221886.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424195221886.webp rename to source/posts/hpc-2025-cuda/image-20250424195221886.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424200022880.webp b/source/posts/hpc-2025-cuda/image-20250424200022880.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424200022880.webp rename to source/posts/hpc-2025-cuda/image-20250424200022880.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250424200330783.webp b/source/posts/hpc-2025-cuda/image-20250424200330783.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250424200330783.webp rename to source/posts/hpc-2025-cuda/image-20250424200330783.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508183446257.webp b/source/posts/hpc-2025-cuda/image-20250508183446257.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508183446257.webp rename to source/posts/hpc-2025-cuda/image-20250508183446257.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508183528381.webp b/source/posts/hpc-2025-cuda/image-20250508183528381.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508183528381.webp rename to source/posts/hpc-2025-cuda/image-20250508183528381.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508183724162.webp b/source/posts/hpc-2025-cuda/image-20250508183724162.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508183724162.webp rename to source/posts/hpc-2025-cuda/image-20250508183724162.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508183931464.webp b/source/posts/hpc-2025-cuda/image-20250508183931464.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508183931464.webp rename to source/posts/hpc-2025-cuda/image-20250508183931464.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508184155087.webp b/source/posts/hpc-2025-cuda/image-20250508184155087.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508184155087.webp rename to source/posts/hpc-2025-cuda/image-20250508184155087.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508184455215.webp b/source/posts/hpc-2025-cuda/image-20250508184455215.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508184455215.webp rename to source/posts/hpc-2025-cuda/image-20250508184455215.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508185236920.webp b/source/posts/hpc-2025-cuda/image-20250508185236920.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508185236920.webp rename to source/posts/hpc-2025-cuda/image-20250508185236920.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508185812302.webp b/source/posts/hpc-2025-cuda/image-20250508185812302.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508185812302.webp rename to source/posts/hpc-2025-cuda/image-20250508185812302.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508193756274.webp b/source/posts/hpc-2025-cuda/image-20250508193756274.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508193756274.webp rename to source/posts/hpc-2025-cuda/image-20250508193756274.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508194350572.webp b/source/posts/hpc-2025-cuda/image-20250508194350572.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508194350572.webp rename to source/posts/hpc-2025-cuda/image-20250508194350572.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508195840957.webp b/source/posts/hpc-2025-cuda/image-20250508195840957.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508195840957.webp rename to source/posts/hpc-2025-cuda/image-20250508195840957.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508195938546.webp b/source/posts/hpc-2025-cuda/image-20250508195938546.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508195938546.webp rename to source/posts/hpc-2025-cuda/image-20250508195938546.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250508200041910.webp b/source/posts/hpc-2025-cuda/image-20250508200041910.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250508200041910.webp rename to source/posts/hpc-2025-cuda/image-20250508200041910.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515183524043.webp b/source/posts/hpc-2025-cuda/image-20250515183524043.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515183524043.webp rename to source/posts/hpc-2025-cuda/image-20250515183524043.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515184225475.webp b/source/posts/hpc-2025-cuda/image-20250515184225475.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515184225475.webp rename to source/posts/hpc-2025-cuda/image-20250515184225475.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515184621914.webp b/source/posts/hpc-2025-cuda/image-20250515184621914.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515184621914.webp rename to source/posts/hpc-2025-cuda/image-20250515184621914.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515184714663.webp b/source/posts/hpc-2025-cuda/image-20250515184714663.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515184714663.webp rename to source/posts/hpc-2025-cuda/image-20250515184714663.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515185019590.webp b/source/posts/hpc-2025-cuda/image-20250515185019590.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515185019590.webp rename to source/posts/hpc-2025-cuda/image-20250515185019590.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515185034758.webp b/source/posts/hpc-2025-cuda/image-20250515185034758.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515185034758.webp rename to source/posts/hpc-2025-cuda/image-20250515185034758.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515185212184.webp b/source/posts/hpc-2025-cuda/image-20250515185212184.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515185212184.webp rename to source/posts/hpc-2025-cuda/image-20250515185212184.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515185801775.webp b/source/posts/hpc-2025-cuda/image-20250515185801775.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515185801775.webp rename to source/posts/hpc-2025-cuda/image-20250515185801775.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515190244112.webp b/source/posts/hpc-2025-cuda/image-20250515190244112.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515190244112.webp rename to source/posts/hpc-2025-cuda/image-20250515190244112.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515190507199.webp b/source/posts/hpc-2025-cuda/image-20250515190507199.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515190507199.webp rename to source/posts/hpc-2025-cuda/image-20250515190507199.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515190703918.webp b/source/posts/hpc-2025-cuda/image-20250515190703918.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515190703918.webp rename to source/posts/hpc-2025-cuda/image-20250515190703918.webp diff --git a/YaeBlog/source/posts/hpc-2025-cuda/image-20250515191142384.webp b/source/posts/hpc-2025-cuda/image-20250515191142384.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-cuda/image-20250515191142384.webp rename to source/posts/hpc-2025-cuda/image-20250515191142384.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system.md b/source/posts/hpc-2025-distributed-system.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system.md rename to source/posts/hpc-2025-distributed-system.md diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250410193527994.webp b/source/posts/hpc-2025-distributed-system/image-20250410193527994.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250410193527994.webp rename to source/posts/hpc-2025-distributed-system/image-20250410193527994.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417184421464.webp b/source/posts/hpc-2025-distributed-system/image-20250417184421464.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417184421464.webp rename to source/posts/hpc-2025-distributed-system/image-20250417184421464.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417185200176.webp b/source/posts/hpc-2025-distributed-system/image-20250417185200176.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417185200176.webp rename to source/posts/hpc-2025-distributed-system/image-20250417185200176.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417190247790.webp b/source/posts/hpc-2025-distributed-system/image-20250417190247790.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417190247790.webp rename to source/posts/hpc-2025-distributed-system/image-20250417190247790.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417191509682.webp b/source/posts/hpc-2025-distributed-system/image-20250417191509682.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417191509682.webp rename to source/posts/hpc-2025-distributed-system/image-20250417191509682.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417191526416.webp b/source/posts/hpc-2025-distributed-system/image-20250417191526416.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417191526416.webp rename to source/posts/hpc-2025-distributed-system/image-20250417191526416.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417192453944.webp b/source/posts/hpc-2025-distributed-system/image-20250417192453944.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250417192453944.webp rename to source/posts/hpc-2025-distributed-system/image-20250417192453944.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183610157.webp b/source/posts/hpc-2025-distributed-system/image-20250424183610157.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183610157.webp rename to source/posts/hpc-2025-distributed-system/image-20250424183610157.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183629681.webp b/source/posts/hpc-2025-distributed-system/image-20250424183629681.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183629681.webp rename to source/posts/hpc-2025-distributed-system/image-20250424183629681.webp diff --git a/YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183645210.webp b/source/posts/hpc-2025-distributed-system/image-20250424183645210.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-distributed-system/image-20250424183645210.webp rename to source/posts/hpc-2025-distributed-system/image-20250424183645210.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system.md b/source/posts/hpc-2025-heterogeneous-system.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system.md rename to source/posts/hpc-2025-heterogeneous-system.md diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250417195644624.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250417195644624.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250417195644624.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250417195644624.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250417200241703.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250417200241703.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250417200241703.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250417200241703.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424184701573.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424184701573.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424184701573.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424184701573.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185022360.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185022360.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185022360.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185022360.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185048036.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185048036.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185048036.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185048036.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185152081.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185152081.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185152081.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185152081.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185219673.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185219673.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185219673.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185219673.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185322963.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185322963.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185322963.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185322963.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185354247.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185354247.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185354247.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185354247.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185449577.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185449577.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185449577.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185449577.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185541483.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424185541483.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424185541483.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424185541483.webp diff --git a/YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424190159059.webp b/source/posts/hpc-2025-heterogeneous-system/image-20250424190159059.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-heterogeneous-system/image-20250424190159059.webp rename to source/posts/hpc-2025-heterogeneous-system/image-20250424190159059.webp diff --git a/YaeBlog/source/posts/hpc-2025-intro.md b/source/posts/hpc-2025-intro.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-intro.md rename to source/posts/hpc-2025-intro.md diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing.md b/source/posts/hpc-2025-non-stored-program-computing.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing.md rename to source/posts/hpc-2025-non-stored-program-computing.md diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250605185212740.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250605185212740.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250605185212740.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250605185212740.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250612184120333.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250612184120333.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250612184120333.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250612184120333.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250815093113115.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250815093113115.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250815093113115.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250815093113115.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817183832472.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817183832472.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817183832472.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817183832472.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817184419856.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817184419856.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817184419856.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817184419856.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817185111521.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817185111521.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817185111521.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817185111521.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817185859510.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817185859510.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817185859510.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817185859510.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817192006784.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817192006784.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817192006784.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817192006784.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817194355228.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817194355228.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817194355228.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817194355228.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817195139631.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817195139631.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817195139631.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817195139631.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817195714935.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817195714935.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817195714935.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817195714935.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817200350750.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250817200350750.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250817200350750.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250817200350750.webp diff --git a/YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250829210329225.webp b/source/posts/hpc-2025-non-stored-program-computing/image-20250829210329225.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-non-stored-program-computing/image-20250829210329225.webp rename to source/posts/hpc-2025-non-stored-program-computing/image-20250829210329225.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl.md b/source/posts/hpc-2025-opencl.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl.md rename to source/posts/hpc-2025-opencl.md diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529185915068.webp b/source/posts/hpc-2025-opencl/image-20250529185915068.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529185915068.webp rename to source/posts/hpc-2025-opencl/image-20250529185915068.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529191215424.webp b/source/posts/hpc-2025-opencl/image-20250529191215424.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529191215424.webp rename to source/posts/hpc-2025-opencl/image-20250529191215424.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529191414250.webp b/source/posts/hpc-2025-opencl/image-20250529191414250.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529191414250.webp rename to source/posts/hpc-2025-opencl/image-20250529191414250.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529191512490.webp b/source/posts/hpc-2025-opencl/image-20250529191512490.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529191512490.webp rename to source/posts/hpc-2025-opencl/image-20250529191512490.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529192022613.webp b/source/posts/hpc-2025-opencl/image-20250529192022613.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529192022613.webp rename to source/posts/hpc-2025-opencl/image-20250529192022613.webp diff --git a/YaeBlog/source/posts/hpc-2025-opencl/image-20250529192056388.webp b/source/posts/hpc-2025-opencl/image-20250529192056388.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-opencl/image-20250529192056388.webp rename to source/posts/hpc-2025-opencl/image-20250529192056388.webp diff --git a/YaeBlog/source/posts/hpc-2025-parallel-computing.md b/source/posts/hpc-2025-parallel-computing.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-parallel-computing.md rename to source/posts/hpc-2025-parallel-computing.md diff --git a/YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250313193604905.webp b/source/posts/hpc-2025-parallel-computing/image-20250313193604905.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250313193604905.webp rename to source/posts/hpc-2025-parallel-computing/image-20250313193604905.webp diff --git a/YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250320200524155.webp b/source/posts/hpc-2025-parallel-computing/image-20250320200524155.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250320200524155.webp rename to source/posts/hpc-2025-parallel-computing/image-20250320200524155.webp diff --git a/YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250327194045418.webp b/source/posts/hpc-2025-parallel-computing/image-20250327194045418.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250327194045418.webp rename to source/posts/hpc-2025-parallel-computing/image-20250327194045418.webp diff --git a/YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250327194312962.webp b/source/posts/hpc-2025-parallel-computing/image-20250327194312962.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-parallel-computing/image-20250327194312962.webp rename to source/posts/hpc-2025-parallel-computing/image-20250327194312962.webp diff --git a/YaeBlog/source/posts/hpc-2025-potpourri.md b/source/posts/hpc-2025-potpourri.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri.md rename to source/posts/hpc-2025-potpourri.md diff --git a/YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185019968.webp b/source/posts/hpc-2025-potpourri/image-20250612185019968.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185019968.webp rename to source/posts/hpc-2025-potpourri/image-20250612185019968.webp diff --git a/YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185221643.webp b/source/posts/hpc-2025-potpourri/image-20250612185221643.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185221643.webp rename to source/posts/hpc-2025-potpourri/image-20250612185221643.webp diff --git a/YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185743675.webp b/source/posts/hpc-2025-potpourri/image-20250612185743675.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri/image-20250612185743675.webp rename to source/posts/hpc-2025-potpourri/image-20250612185743675.webp diff --git a/YaeBlog/source/posts/hpc-2025-potpourri/image-20250612191035632.webp b/source/posts/hpc-2025-potpourri/image-20250612191035632.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri/image-20250612191035632.webp rename to source/posts/hpc-2025-potpourri/image-20250612191035632.webp diff --git a/YaeBlog/source/posts/hpc-2025-potpourri/image-20250612191118473.webp b/source/posts/hpc-2025-potpourri/image-20250612191118473.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-potpourri/image-20250612191118473.webp rename to source/posts/hpc-2025-potpourri/image-20250612191118473.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-cuda.md b/source/posts/hpc-2025-program-cuda.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-cuda.md rename to source/posts/hpc-2025-program-cuda.md diff --git a/YaeBlog/source/posts/hpc-2025-program-cuda/image-20250515195739382.webp b/source/posts/hpc-2025-program-cuda/image-20250515195739382.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-cuda/image-20250515195739382.webp rename to source/posts/hpc-2025-program-cuda/image-20250515195739382.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-cuda/image-20250515195907764.webp b/source/posts/hpc-2025-program-cuda/image-20250515195907764.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-cuda/image-20250515195907764.webp rename to source/posts/hpc-2025-program-cuda/image-20250515195907764.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-smp-platform.md b/source/posts/hpc-2025-program-smp-platform.md similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-smp-platform.md rename to source/posts/hpc-2025-program-smp-platform.md diff --git a/YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250327200344104.webp b/source/posts/hpc-2025-program-smp-platform/image-20250327200344104.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250327200344104.webp rename to source/posts/hpc-2025-program-smp-platform/image-20250327200344104.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403183104279.webp b/source/posts/hpc-2025-program-smp-platform/image-20250403183104279.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403183104279.webp rename to source/posts/hpc-2025-program-smp-platform/image-20250403183104279.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403191254323.webp b/source/posts/hpc-2025-program-smp-platform/image-20250403191254323.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403191254323.webp rename to source/posts/hpc-2025-program-smp-platform/image-20250403191254323.webp diff --git a/YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403195750934.webp b/source/posts/hpc-2025-program-smp-platform/image-20250403195750934.webp similarity index 100% rename from YaeBlog/source/posts/hpc-2025-program-smp-platform/image-20250403195750934.webp rename to source/posts/hpc-2025-program-smp-platform/image-20250403195750934.webp diff --git a/YaeBlog/source/posts/install-pytorch.md b/source/posts/install-pytorch.md similarity index 100% rename from YaeBlog/source/posts/install-pytorch.md rename to source/posts/install-pytorch.md diff --git a/YaeBlog/source/posts/install-pytorch/1.webp b/source/posts/install-pytorch/1.webp similarity index 100% rename from YaeBlog/source/posts/install-pytorch/1.webp rename to source/posts/install-pytorch/1.webp diff --git a/YaeBlog/source/posts/install-pytorch/2.webp b/source/posts/install-pytorch/2.webp similarity index 100% rename from YaeBlog/source/posts/install-pytorch/2.webp rename to source/posts/install-pytorch/2.webp diff --git a/YaeBlog/source/posts/install-pytorch/3.webp b/source/posts/install-pytorch/3.webp similarity index 100% rename from YaeBlog/source/posts/install-pytorch/3.webp rename to source/posts/install-pytorch/3.webp diff --git a/YaeBlog/source/posts/install-pytorch/4.webp b/source/posts/install-pytorch/4.webp similarity index 100% rename from YaeBlog/source/posts/install-pytorch/4.webp rename to source/posts/install-pytorch/4.webp diff --git a/YaeBlog/source/posts/laptop-for-computer.md b/source/posts/laptop-for-computer.md similarity index 100% rename from YaeBlog/source/posts/laptop-for-computer.md rename to source/posts/laptop-for-computer.md diff --git a/YaeBlog/source/posts/laptop-for-computer/c.webp b/source/posts/laptop-for-computer/c.webp similarity index 100% rename from YaeBlog/source/posts/laptop-for-computer/c.webp rename to source/posts/laptop-for-computer/c.webp diff --git a/YaeBlog/source/posts/laptop-for-computer/clion.webp b/source/posts/laptop-for-computer/clion.webp similarity index 100% rename from YaeBlog/source/posts/laptop-for-computer/clion.webp rename to source/posts/laptop-for-computer/clion.webp diff --git a/YaeBlog/source/posts/laptop-for-computer/csharp.webp b/source/posts/laptop-for-computer/csharp.webp similarity index 100% rename from YaeBlog/source/posts/laptop-for-computer/csharp.webp rename to source/posts/laptop-for-computer/csharp.webp diff --git a/YaeBlog/source/posts/laptop-for-computer/web.webp b/source/posts/laptop-for-computer/web.webp similarity index 100% rename from YaeBlog/source/posts/laptop-for-computer/web.webp rename to source/posts/laptop-for-computer/web.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero.md b/source/posts/linux-distribution-from-zero.md similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero.md rename to source/posts/linux-distribution-from-zero.md diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250325160729310.webp b/source/posts/linux-distribution-from-zero/image-20250325160729310.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250325160729310.webp rename to source/posts/linux-distribution-from-zero/image-20250325160729310.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250325161310820.webp b/source/posts/linux-distribution-from-zero/image-20250325161310820.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250325161310820.webp rename to source/posts/linux-distribution-from-zero/image-20250325161310820.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134233659.webp b/source/posts/linux-distribution-from-zero/image-20250527134233659.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134233659.webp rename to source/posts/linux-distribution-from-zero/image-20250527134233659.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134421403.webp b/source/posts/linux-distribution-from-zero/image-20250527134421403.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134421403.webp rename to source/posts/linux-distribution-from-zero/image-20250527134421403.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134540583.webp b/source/posts/linux-distribution-from-zero/image-20250527134540583.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250527134540583.webp rename to source/posts/linux-distribution-from-zero/image-20250527134540583.webp diff --git a/YaeBlog/source/posts/linux-distribution-from-zero/image-20250527135748547.webp b/source/posts/linux-distribution-from-zero/image-20250527135748547.webp similarity index 100% rename from YaeBlog/source/posts/linux-distribution-from-zero/image-20250527135748547.webp rename to source/posts/linux-distribution-from-zero/image-20250527135748547.webp diff --git a/YaeBlog/source/posts/linux-genshin-cloud.md b/source/posts/linux-genshin-cloud.md similarity index 100% rename from YaeBlog/source/posts/linux-genshin-cloud.md rename to source/posts/linux-genshin-cloud.md diff --git a/YaeBlog/source/posts/llvm-naive-0.md b/source/posts/llvm-naive-0.md similarity index 100% rename from YaeBlog/source/posts/llvm-naive-0.md rename to source/posts/llvm-naive-0.md diff --git a/YaeBlog/source/posts/llvm-naive-0/image-20240819213039409.webp b/source/posts/llvm-naive-0/image-20240819213039409.webp similarity index 100% rename from YaeBlog/source/posts/llvm-naive-0/image-20240819213039409.webp rename to source/posts/llvm-naive-0/image-20240819213039409.webp diff --git a/YaeBlog/source/posts/llvm-naive-0/image-20240819213624927.webp b/source/posts/llvm-naive-0/image-20240819213624927.webp similarity index 100% rename from YaeBlog/source/posts/llvm-naive-0/image-20240819213624927.webp rename to source/posts/llvm-naive-0/image-20240819213624927.webp diff --git a/YaeBlog/source/posts/llvm-naive-0/image-20240820221413791.webp b/source/posts/llvm-naive-0/image-20240820221413791.webp similarity index 100% rename from YaeBlog/source/posts/llvm-naive-0/image-20240820221413791.webp rename to source/posts/llvm-naive-0/image-20240820221413791.webp diff --git a/YaeBlog/source/posts/llvm-naive-0/image-20240825171858276.webp b/source/posts/llvm-naive-0/image-20240825171858276.webp similarity index 100% rename from YaeBlog/source/posts/llvm-naive-0/image-20240825171858276.webp rename to source/posts/llvm-naive-0/image-20240825171858276.webp diff --git a/YaeBlog/source/posts/minecraft-wayland.md b/source/posts/minecraft-wayland.md similarity index 100% rename from YaeBlog/source/posts/minecraft-wayland.md rename to source/posts/minecraft-wayland.md diff --git a/YaeBlog/source/posts/minecraft-wayland/image-20240105212744116.webp b/source/posts/minecraft-wayland/image-20240105212744116.webp similarity index 100% rename from YaeBlog/source/posts/minecraft-wayland/image-20240105212744116.webp rename to source/posts/minecraft-wayland/image-20240105212744116.webp diff --git a/YaeBlog/source/posts/minecraft-wayland/image-20240105213439528.webp b/source/posts/minecraft-wayland/image-20240105213439528.webp similarity index 100% rename from YaeBlog/source/posts/minecraft-wayland/image-20240105213439528.webp rename to source/posts/minecraft-wayland/image-20240105213439528.webp diff --git a/YaeBlog/source/posts/minecraft-wayland/image-20240105213942445.webp b/source/posts/minecraft-wayland/image-20240105213942445.webp similarity index 100% rename from YaeBlog/source/posts/minecraft-wayland/image-20240105213942445.webp rename to source/posts/minecraft-wayland/image-20240105213942445.webp diff --git a/YaeBlog/source/posts/mlir-standalone.md b/source/posts/mlir-standalone.md similarity index 100% rename from YaeBlog/source/posts/mlir-standalone.md rename to source/posts/mlir-standalone.md diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319192618697.webp b/source/posts/mlir-standalone/image-20250319192618697.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319192618697.webp rename to source/posts/mlir-standalone/image-20250319192618697.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319194742171.webp b/source/posts/mlir-standalone/image-20250319194742171.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319194742171.webp rename to source/posts/mlir-standalone/image-20250319194742171.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319202218503.webp b/source/posts/mlir-standalone/image-20250319202218503.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319202218503.webp rename to source/posts/mlir-standalone/image-20250319202218503.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319202553644.webp b/source/posts/mlir-standalone/image-20250319202553644.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319202553644.webp rename to source/posts/mlir-standalone/image-20250319202553644.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319204057832.webp b/source/posts/mlir-standalone/image-20250319204057832.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319204057832.webp rename to source/posts/mlir-standalone/image-20250319204057832.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319204522857.webp b/source/posts/mlir-standalone/image-20250319204522857.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319204522857.webp rename to source/posts/mlir-standalone/image-20250319204522857.webp diff --git a/YaeBlog/source/posts/mlir-standalone/image-20250319205520649.webp b/source/posts/mlir-standalone/image-20250319205520649.webp similarity index 100% rename from YaeBlog/source/posts/mlir-standalone/image-20250319205520649.webp rename to source/posts/mlir-standalone/image-20250319205520649.webp diff --git a/YaeBlog/source/posts/msbuild-generate-files.md b/source/posts/msbuild-generate-files.md similarity index 100% rename from YaeBlog/source/posts/msbuild-generate-files.md rename to source/posts/msbuild-generate-files.md diff --git a/YaeBlog/source/posts/msbuild-generate-files/image-20250325150841442.webp b/source/posts/msbuild-generate-files/image-20250325150841442.webp similarity index 100% rename from YaeBlog/source/posts/msbuild-generate-files/image-20250325150841442.webp rename to source/posts/msbuild-generate-files/image-20250325150841442.webp diff --git a/YaeBlog/source/posts/parser-combinator-performance.md b/source/posts/parser-combinator-performance.md similarity index 100% rename from YaeBlog/source/posts/parser-combinator-performance.md rename to source/posts/parser-combinator-performance.md diff --git a/YaeBlog/source/posts/parser-combinator-performance/image-20240819140523087.webp b/source/posts/parser-combinator-performance/image-20240819140523087.webp similarity index 100% rename from YaeBlog/source/posts/parser-combinator-performance/image-20240819140523087.webp rename to source/posts/parser-combinator-performance/image-20240819140523087.webp diff --git a/YaeBlog/source/posts/parser-combinator.md b/source/posts/parser-combinator.md similarity index 100% rename from YaeBlog/source/posts/parser-combinator.md rename to source/posts/parser-combinator.md diff --git a/YaeBlog/source/posts/parser-combinator/image-20240813214315576.webp b/source/posts/parser-combinator/image-20240813214315576.webp similarity index 100% rename from YaeBlog/source/posts/parser-combinator/image-20240813214315576.webp rename to source/posts/parser-combinator/image-20240813214315576.webp diff --git a/YaeBlog/source/posts/parser-combinator/image-20240813220521028.webp b/source/posts/parser-combinator/image-20240813220521028.webp similarity index 100% rename from YaeBlog/source/posts/parser-combinator/image-20240813220521028.webp rename to source/posts/parser-combinator/image-20240813220521028.webp diff --git a/YaeBlog/source/posts/parser-combinator/image-20240813220530717.webp b/source/posts/parser-combinator/image-20240813220530717.webp similarity index 100% rename from YaeBlog/source/posts/parser-combinator/image-20240813220530717.webp rename to source/posts/parser-combinator/image-20240813220530717.webp diff --git a/YaeBlog/source/posts/podman-dns-failed.md b/source/posts/podman-dns-failed.md similarity index 100% rename from YaeBlog/source/posts/podman-dns-failed.md rename to source/posts/podman-dns-failed.md diff --git a/YaeBlog/source/posts/program-design-introduction.md b/source/posts/program-design-introduction.md similarity index 100% rename from YaeBlog/source/posts/program-design-introduction.md rename to source/posts/program-design-introduction.md diff --git a/YaeBlog/source/posts/program-design-introduction/1.webp b/source/posts/program-design-introduction/1.webp similarity index 100% rename from YaeBlog/source/posts/program-design-introduction/1.webp rename to source/posts/program-design-introduction/1.webp diff --git a/YaeBlog/source/posts/program-design-introduction/2.webp b/source/posts/program-design-introduction/2.webp similarity index 100% rename from YaeBlog/source/posts/program-design-introduction/2.webp rename to source/posts/program-design-introduction/2.webp diff --git a/YaeBlog/source/posts/program-design-introduction/3.webp b/source/posts/program-design-introduction/3.webp similarity index 100% rename from YaeBlog/source/posts/program-design-introduction/3.webp rename to source/posts/program-design-introduction/3.webp diff --git a/YaeBlog/source/posts/qt-learning.md b/source/posts/qt-learning.md similarity index 100% rename from YaeBlog/source/posts/qt-learning.md rename to source/posts/qt-learning.md diff --git a/YaeBlog/source/posts/qt-learning/1.webp b/source/posts/qt-learning/1.webp similarity index 100% rename from YaeBlog/source/posts/qt-learning/1.webp rename to source/posts/qt-learning/1.webp diff --git a/YaeBlog/source/posts/question-in-install-vs-2019.md b/source/posts/question-in-install-vs-2019.md similarity index 100% rename from YaeBlog/source/posts/question-in-install-vs-2019.md rename to source/posts/question-in-install-vs-2019.md diff --git a/YaeBlog/source/posts/question-in-install-vs-2019/1.webp b/source/posts/question-in-install-vs-2019/1.webp similarity index 100% rename from YaeBlog/source/posts/question-in-install-vs-2019/1.webp rename to source/posts/question-in-install-vs-2019/1.webp diff --git a/YaeBlog/source/posts/rust-drop-stack-overflow.md b/source/posts/rust-drop-stack-overflow.md similarity index 100% rename from YaeBlog/source/posts/rust-drop-stack-overflow.md rename to source/posts/rust-drop-stack-overflow.md diff --git a/YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105181144993.webp b/source/posts/rust-drop-stack-overflow/image-20241105181144993.webp similarity index 100% rename from YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105181144993.webp rename to source/posts/rust-drop-stack-overflow/image-20241105181144993.webp diff --git a/YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105181612954.webp b/source/posts/rust-drop-stack-overflow/image-20241105181612954.webp similarity index 100% rename from YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105181612954.webp rename to source/posts/rust-drop-stack-overflow/image-20241105181612954.webp diff --git a/YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105182036975.webp b/source/posts/rust-drop-stack-overflow/image-20241105182036975.webp similarity index 100% rename from YaeBlog/source/posts/rust-drop-stack-overflow/image-20241105182036975.webp rename to source/posts/rust-drop-stack-overflow/image-20241105182036975.webp diff --git a/YaeBlog/source/posts/rust-up-trait.md b/source/posts/rust-up-trait.md similarity index 100% rename from YaeBlog/source/posts/rust-up-trait.md rename to source/posts/rust-up-trait.md diff --git a/YaeBlog/source/posts/software-engineer.md b/source/posts/software-engineer.md similarity index 100% rename from YaeBlog/source/posts/software-engineer.md rename to source/posts/software-engineer.md diff --git a/YaeBlog/source/posts/software-engineer/image-20240620211321957.webp b/source/posts/software-engineer/image-20240620211321957.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620211321957.webp rename to source/posts/software-engineer/image-20240620211321957.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620212101864.webp b/source/posts/software-engineer/image-20240620212101864.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620212101864.webp rename to source/posts/software-engineer/image-20240620212101864.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620214307906.webp b/source/posts/software-engineer/image-20240620214307906.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620214307906.webp rename to source/posts/software-engineer/image-20240620214307906.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620214739548.webp b/source/posts/software-engineer/image-20240620214739548.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620214739548.webp rename to source/posts/software-engineer/image-20240620214739548.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620215022645.webp b/source/posts/software-engineer/image-20240620215022645.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620215022645.webp rename to source/posts/software-engineer/image-20240620215022645.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620220155962.webp b/source/posts/software-engineer/image-20240620220155962.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620220155962.webp rename to source/posts/software-engineer/image-20240620220155962.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620224318982.webp b/source/posts/software-engineer/image-20240620224318982.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620224318982.webp rename to source/posts/software-engineer/image-20240620224318982.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240620224519243.webp b/source/posts/software-engineer/image-20240620224519243.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240620224519243.webp rename to source/posts/software-engineer/image-20240620224519243.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240621114540033.webp b/source/posts/software-engineer/image-20240621114540033.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240621114540033.webp rename to source/posts/software-engineer/image-20240621114540033.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240623160826903.webp b/source/posts/software-engineer/image-20240623160826903.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240623160826903.webp rename to source/posts/software-engineer/image-20240623160826903.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240623162229404.webp b/source/posts/software-engineer/image-20240623162229404.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240623162229404.webp rename to source/posts/software-engineer/image-20240623162229404.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240623163647935.webp b/source/posts/software-engineer/image-20240623163647935.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240623163647935.webp rename to source/posts/software-engineer/image-20240623163647935.webp diff --git a/YaeBlog/source/posts/software-engineer/image-20240623170058679.webp b/source/posts/software-engineer/image-20240623170058679.webp similarity index 100% rename from YaeBlog/source/posts/software-engineer/image-20240623170058679.webp rename to source/posts/software-engineer/image-20240623170058679.webp diff --git a/YaeBlog/source/posts/spring-boot-custom-authorize.md b/source/posts/spring-boot-custom-authorize.md similarity index 100% rename from YaeBlog/source/posts/spring-boot-custom-authorize.md rename to source/posts/spring-boot-custom-authorize.md diff --git a/YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175807814.webp b/source/posts/spring-boot-custom-authorize/image-20230727175807814.webp similarity index 100% rename from YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175807814.webp rename to source/posts/spring-boot-custom-authorize/image-20230727175807814.webp diff --git a/YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175955817.webp b/source/posts/spring-boot-custom-authorize/image-20230727175955817.webp similarity index 100% rename from YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175955817.webp rename to source/posts/spring-boot-custom-authorize/image-20230727175955817.webp diff --git a/YaeBlog/source/posts/update-windows-break-archlinux.md b/source/posts/update-windows-break-archlinux.md similarity index 100% rename from YaeBlog/source/posts/update-windows-break-archlinux.md rename to source/posts/update-windows-break-archlinux.md diff --git a/YaeBlog/source/posts/using-vpn-elegant.md b/source/posts/using-vpn-elegant.md similarity index 100% rename from YaeBlog/source/posts/using-vpn-elegant.md rename to source/posts/using-vpn-elegant.md diff --git a/YaeBlog/source/posts/vscode-in-browser.md b/source/posts/vscode-in-browser.md similarity index 100% rename from YaeBlog/source/posts/vscode-in-browser.md rename to source/posts/vscode-in-browser.md diff --git a/YaeBlog/source/posts/vscode-in-browser/1.webp b/source/posts/vscode-in-browser/1.webp similarity index 100% rename from YaeBlog/source/posts/vscode-in-browser/1.webp rename to source/posts/vscode-in-browser/1.webp diff --git a/YaeBlog/source/posts/vscode-in-browser/2.webp b/source/posts/vscode-in-browser/2.webp similarity index 100% rename from YaeBlog/source/posts/vscode-in-browser/2.webp rename to source/posts/vscode-in-browser/2.webp diff --git a/YaeBlog/source/posts/whats-new-of-dotnet-8.md b/source/posts/whats-new-of-dotnet-8.md similarity index 100% rename from YaeBlog/source/posts/whats-new-of-dotnet-8.md rename to source/posts/whats-new-of-dotnet-8.md diff --git a/YaeBlog/source/posts/whats-new-of-dotnet-8/AOTOptimizations4.webp b/source/posts/whats-new-of-dotnet-8/AOTOptimizations4.webp similarity index 100% rename from YaeBlog/source/posts/whats-new-of-dotnet-8/AOTOptimizations4.webp rename to source/posts/whats-new-of-dotnet-8/AOTOptimizations4.webp diff --git a/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122100930849.webp b/source/posts/whats-new-of-dotnet-8/image-20231122100930849.webp similarity index 100% rename from YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122100930849.webp rename to source/posts/whats-new-of-dotnet-8/image-20231122100930849.webp diff --git a/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101012416.webp b/source/posts/whats-new-of-dotnet-8/image-20231122101012416.webp similarity index 100% rename from YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101012416.webp rename to source/posts/whats-new-of-dotnet-8/image-20231122101012416.webp diff --git a/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101142080.webp b/source/posts/whats-new-of-dotnet-8/image-20231122101142080.webp similarity index 100% rename from YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101142080.webp rename to source/posts/whats-new-of-dotnet-8/image-20231122101142080.webp diff --git a/YaeBlog/source/posts/wsl-setup-csapp.md b/source/posts/wsl-setup-csapp.md similarity index 100% rename from YaeBlog/source/posts/wsl-setup-csapp.md rename to source/posts/wsl-setup-csapp.md diff --git a/YaeBlog/source/posts/wsl-setup-csapp/1.webp b/source/posts/wsl-setup-csapp/1.webp similarity index 100% rename from YaeBlog/source/posts/wsl-setup-csapp/1.webp rename to source/posts/wsl-setup-csapp/1.webp diff --git a/YaeBlog/source/posts/wsl-setup-csapp/2.webp b/source/posts/wsl-setup-csapp/2.webp similarity index 100% rename from YaeBlog/source/posts/wsl-setup-csapp/2.webp rename to source/posts/wsl-setup-csapp/2.webp diff --git a/YaeBlog/source/posts/wsl-setup-csapp/3.webp b/source/posts/wsl-setup-csapp/3.webp similarity index 100% rename from YaeBlog/source/posts/wsl-setup-csapp/3.webp rename to source/posts/wsl-setup-csapp/3.webp diff --git a/YaeBlog.Tests/DateTimeOffsetTests.cs b/src/YaeBlog.Tests/DateTimeOffsetTests.cs similarity index 100% rename from YaeBlog.Tests/DateTimeOffsetTests.cs rename to src/YaeBlog.Tests/DateTimeOffsetTests.cs diff --git a/src/YaeBlog.Tests/GiteaFetchServiceTests.cs b/src/YaeBlog.Tests/GiteaFetchServiceTests.cs new file mode 100644 index 0000000..0adfd31 --- /dev/null +++ b/src/YaeBlog.Tests/GiteaFetchServiceTests.cs @@ -0,0 +1,38 @@ +using DotNext; +using Microsoft.Extensions.Options; +using Moq; +using YaeBlog.Models; +using YaeBlog.Services; + +namespace YaeBlog.Tests; + +public sealed class GiteaFetchServiceTests +{ + private static readonly Mock> s_giteaOptionsMock = new(); + private readonly GiteaFetchService _giteaFetchService; + + public GiteaFetchServiceTests() + { + s_giteaOptionsMock.SetupGet(o => o.Value) + .Returns(new GiteaOptions + { + BaseAddress = "https://git.rrricardo.top/api/v1/", + ApiKey = "7e33617e5d084199332fceec3e0cb04c6ddced55", + HeatMapUsername = "jackfiled" + }); + + _giteaFetchService = new GiteaFetchService(s_giteaOptionsMock.Object, new HttpClient()); + } + + [Fact] + public async Task FetchHeapMapTest() + { + Result> r = await _giteaFetchService.FetchGiteaContributions("jackfiled"); + + Assert.Null(r.Error); + Assert.True(r.TryGet(out List? items)); + Assert.NotNull(items); + + Assert.True(items.Count > 0); + } +} diff --git a/src/YaeBlog.Tests/JsonDeserializationTests.cs b/src/YaeBlog.Tests/JsonDeserializationTests.cs new file mode 100644 index 0000000..fdf369f --- /dev/null +++ b/src/YaeBlog.Tests/JsonDeserializationTests.cs @@ -0,0 +1,185 @@ +using System.Text.Json; +using Xunit.Abstractions; + +namespace YaeBlog.Tests; + +public sealed class JsonDeserializationTests(ITestOutputHelper outputHelper) +{ + private record JsonBody(int Code, string Username); + + private static readonly JsonSerializerOptions s_serializerOptions = new() + { + PropertyNameCaseInsensitive = true, + RespectNullableAnnotations = true, + RespectRequiredConstructorParameters = true + }; + + [Fact] + public void DeserializeTest() + { + const string input = """ + { + "code": 111, + "username": "ricardo" + } + """; + + JsonBody? body = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.NotNull(body); + + Assert.Equal(111, body.Code); + Assert.Equal("ricardo", body.Username); + } + + [Fact] + public void DeserializeFromNonexistFieldTest() + { + const string input = """ + { + "code": 111 + } + """; + + Assert.Throws(() => JsonSerializer.Deserialize(input, s_serializerOptions)); + } + + [Fact] + public void DeserializeFromNullValueTest() + { + const string input = """ + { + "code": 111, + "username": null + } + """; + + Assert.Throws(() => JsonSerializer.Deserialize(input, s_serializerOptions)); + } + + [Fact] + public void DeserializeFromUndefinedValueTest() + { + const string input = """ + { + "code": 111, + "username": undefined + } + """; + + Assert.Throws(() => JsonSerializer.Deserialize(input, s_serializerOptions)); + } + + private record JsonListBody(List Names); + + [Fact] + public void DeserializeListTest() + { + const string input = """ + { + "names": [ + "1", + null, + "2" + ] + } + """; + + JsonListBody? body = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.NotNull(body); + + foreach ((int i, string value) in body.Names.Index()) + { + outputHelper.WriteLine($"{i} is null? {value is null}"); + } + } + + private struct JsonStruct + { + public int Id { get; } + + public string Name { get; } + + public JsonStruct(int id, string name) + { + Id = id; + Name = name; + } + } + + [Fact] + public void DeserializeToStructTest() + { + const string input = """ + { + "Id": 1, + "Name": "ricardo" + } + """; + + JsonStruct r = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.Equal(0, r.Id); + Assert.Null(r.Name); + } + + private readonly struct JsonReadonlyStruct + { + public int Id { get; } + + public string Name { get; } + + public JsonReadonlyStruct(int id, string name) + { + Id = id; + Name = name; + } + } + + [Fact] + public void DeserializeToReadonlyStructTest() + { + const string input = """ + { + "Id": 1, + "Name": "ricardo" + } + """; + + JsonReadonlyStruct r = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.Equal(0, r.Id); + Assert.Null(r.Name); + } + + private record struct JsonRecordStruct(int Id, string Name); + + [Fact] + public void DeserializeToRecordStructTest() + { + const string input = """ + { + "Id": 1, + "Name": "ricardo" + } + """; + + JsonRecordStruct r = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.Equal(1, r.Id); + Assert.Equal("ricardo", r.Name); + } + + private readonly record struct JsonReadonlyRecordStruct(int Id, string Name); + + [Fact] + public void DeserializeToReadonlyRecordStructTest() + { + const string input = """ + { + "Id": 1, + "Name": "ricardo" + } + """; + + JsonReadonlyRecordStruct r = JsonSerializer.Deserialize(input, s_serializerOptions); + Assert.Equal(1, r.Id); + Assert.Equal("ricardo", r.Name); + } +} diff --git a/src/YaeBlog.Tests/JsonSerializationTests.cs b/src/YaeBlog.Tests/JsonSerializationTests.cs new file mode 100644 index 0000000..bd7bccc --- /dev/null +++ b/src/YaeBlog.Tests/JsonSerializationTests.cs @@ -0,0 +1,17 @@ +using System.Text.Json; +using Xunit.Abstractions; + +namespace YaeBlog.Tests; + +public sealed class JsonSerializationTests(ITestOutputHelper outputHelper) +{ + private record JsonBody(long Number); + + [Fact] + public void LongSerializeTest() + { + JsonBody body = new(long.MaxValue - 1); + string output = JsonSerializer.Serialize(body); + outputHelper.WriteLine(output); + } +} diff --git a/src/YaeBlog.Tests/OptionsMock.cs b/src/YaeBlog.Tests/OptionsMock.cs new file mode 100644 index 0000000..16238e7 --- /dev/null +++ b/src/YaeBlog.Tests/OptionsMock.cs @@ -0,0 +1,18 @@ +using Microsoft.Extensions.Options; +using Moq; +using YaeBlog.Models; + +namespace YaeBlog.Tests; + +public static class OptionsMock +{ + public static Mock> CreateBlogOptionMock() + { + Mock> mock = new(); + + mock.SetupGet(o => o.Value) + .Returns(new BlogOptions { Root = "source", Announcement = string.Empty, Links = [], StartYear = 2021 }); + + return mock; + } +} diff --git a/YaeBlog.Tests/YaeBlog.Tests.csproj b/src/YaeBlog.Tests/YaeBlog.Tests.csproj similarity index 92% rename from YaeBlog.Tests/YaeBlog.Tests.csproj rename to src/YaeBlog.Tests/YaeBlog.Tests.csproj index 5d5e7c6..5e2af34 100644 --- a/YaeBlog.Tests/YaeBlog.Tests.csproj +++ b/src/YaeBlog.Tests/YaeBlog.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/YaeBlog/Abstraction/IEssayContentService.cs b/src/YaeBlog/Abstraction/IEssayContentService.cs similarity index 100% rename from YaeBlog/Abstraction/IEssayContentService.cs rename to src/YaeBlog/Abstraction/IEssayContentService.cs diff --git a/YaeBlog/Abstraction/IEssayScanService.cs b/src/YaeBlog/Abstraction/IEssayScanService.cs similarity index 100% rename from YaeBlog/Abstraction/IEssayScanService.cs rename to src/YaeBlog/Abstraction/IEssayScanService.cs diff --git a/YaeBlog/Abstraction/IPostRenderProcessor.cs b/src/YaeBlog/Abstraction/IPostRenderProcessor.cs similarity index 100% rename from YaeBlog/Abstraction/IPostRenderProcessor.cs rename to src/YaeBlog/Abstraction/IPostRenderProcessor.cs diff --git a/YaeBlog/Abstraction/IPreRenderProcessor.cs b/src/YaeBlog/Abstraction/IPreRenderProcessor.cs similarity index 100% rename from YaeBlog/Abstraction/IPreRenderProcessor.cs rename to src/YaeBlog/Abstraction/IPreRenderProcessor.cs diff --git a/YaeBlog/Commands/Binders/BlogOptionsBinder.cs b/src/YaeBlog/Commands/Binders/BlogOptionsBinder.cs similarity index 82% rename from YaeBlog/Commands/Binders/BlogOptionsBinder.cs rename to src/YaeBlog/Commands/Binders/BlogOptionsBinder.cs index f6e4af6..ee60ba7 100644 --- a/YaeBlog/Commands/Binders/BlogOptionsBinder.cs +++ b/src/YaeBlog/Commands/Binders/BlogOptionsBinder.cs @@ -23,12 +23,9 @@ public sealed class BlogOptionsBinder : BinderBase> 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 result is null + ? throw new InvalidOperationException("Failed to load YaeBlog configuration in appsettings.json.") + : new OptionsWrapper(result); }); return bindingContext.GetRequiredService>(); diff --git a/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs b/src/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs similarity index 100% rename from YaeBlog/Commands/Binders/EssayScanServiceBinder.cs rename to src/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs diff --git a/YaeBlog/Commands/Binders/ImageCompressServiceBinder.cs b/src/YaeBlog/Commands/Binders/ImageCompressServiceBinder.cs similarity index 100% rename from YaeBlog/Commands/Binders/ImageCompressServiceBinder.cs rename to src/YaeBlog/Commands/Binders/ImageCompressServiceBinder.cs diff --git a/YaeBlog/Commands/Binders/LoggerBinder.cs b/src/YaeBlog/Commands/Binders/LoggerBinder.cs similarity index 100% rename from YaeBlog/Commands/Binders/LoggerBinder.cs rename to src/YaeBlog/Commands/Binders/LoggerBinder.cs diff --git a/YaeBlog/Commands/YaeBlogCommand.cs b/src/YaeBlog/Commands/YaeBlogCommand.cs similarity index 100% rename from YaeBlog/Commands/YaeBlogCommand.cs rename to src/YaeBlog/Commands/YaeBlogCommand.cs diff --git a/YaeBlog/Components/Anchor.razor b/src/YaeBlog/Components/Anchor.razor similarity index 100% rename from YaeBlog/Components/Anchor.razor rename to src/YaeBlog/Components/Anchor.razor diff --git a/YaeBlog/Components/App.razor b/src/YaeBlog/Components/App.razor similarity index 97% rename from YaeBlog/Components/App.razor rename to src/YaeBlog/Components/App.razor index 3f79b8e..ecdce81 100644 --- a/YaeBlog/Components/App.razor +++ b/src/YaeBlog/Components/App.razor @@ -3,7 +3,7 @@ - + diff --git a/YaeBlog/Components/AppreciationCode.razor b/src/YaeBlog/Components/AppreciationCode.razor similarity index 100% rename from YaeBlog/Components/AppreciationCode.razor rename to src/YaeBlog/Components/AppreciationCode.razor diff --git a/YaeBlog/Components/BlogInformationCard.razor b/src/YaeBlog/Components/BlogInformationCard.razor similarity index 89% rename from YaeBlog/Components/BlogInformationCard.razor rename to src/YaeBlog/Components/BlogInformationCard.razor index 11f8a88..2df351d 100644 --- a/YaeBlog/Components/BlogInformationCard.razor +++ b/src/YaeBlog/Components/BlogInformationCard.razor @@ -1,8 +1,9 @@ +@using Microsoft.Extensions.Options @using YaeBlog.Abstraction @using YaeBlog.Models @inject IEssayContentService Contents -@inject BlogOptions Options +@inject IOptions Options
@@ -43,7 +44,7 @@

- @(Options.Announcement) + @(Options.Value.Announcement)

diff --git a/YaeBlog/Components/EssayCard.razor b/src/YaeBlog/Components/EssayCard.razor similarity index 100% rename from YaeBlog/Components/EssayCard.razor rename to src/YaeBlog/Components/EssayCard.razor diff --git a/YaeBlog/Components/Foonter.razor b/src/YaeBlog/Components/Foonter.razor similarity index 100% rename from YaeBlog/Components/Foonter.razor rename to src/YaeBlog/Components/Foonter.razor diff --git a/src/YaeBlog/Components/GitHeatMap.razor b/src/YaeBlog/Components/GitHeatMap.razor new file mode 100644 index 0000000..3051329 --- /dev/null +++ b/src/YaeBlog/Components/GitHeatMap.razor @@ -0,0 +1,122 @@ +@using YaeBlog.Models +@using YaeBlog.Services +@inject GitHeapMapService GitHeapMapInstance + +
+ + + @foreach ((int i, string text) in _monthIndices) + { + + } + + + @foreach ((int i, string text) in Weekdays.Index()) + { + + } + + + @foreach ((int i, GitContributionGroupedByWeek contribution) in _contributions.Index()) + { + + @foreach ((int j, GitContributionItem item) in contribution.Contributions.Index()) + { + + } + + } + + +
+ +@code { + private const int Width = 10; + private const int Spacing = 2; + private const int GridXOffset = 25; + private const int GridYOffset = 15; + + private readonly record struct MonthIndex(int Pos, string Month); + + private readonly List _monthIndices = []; + private readonly List _contributions = []; + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + _contributions.AddRange(await GitHeapMapInstance.GetGitContributionGroupedByWeek()); + + // 遍历寻找月份变化的时候,i指向上一个item + foreach ((int i, GitContributionGroupedByWeek contributionGroupedByWeek) in _contributions.Skip(1).Index()) + { + if (contributionGroupedByWeek.Monday.Month == _contributions[i].Monday.Month) + { + continue; + } + + // 找到当前周和上一周月份不一致 + _monthIndices.Add(new MonthIndex(i + 1, Months[contributionGroupedByWeek.Monday.Month - 1])); + } + } + + private SvgViewBox CalculateViewBox() + { + int width = GridXOffset + Width * _contributions.Count + Spacing * (_contributions.Count - 1); + const int height = GridYOffset + Width * 7 + Spacing * 6; + + // 添加一个10px的额外大小防止出现意外问题 + return new SvgViewBox(0, 0, width + 10, height + 10); + } + + private static SvgTransform GlobalMonthTransform => SvgTransform.CreateBuilder().Translate(23, 10).Build(); + + private static SvgTransform GlobalWeekTransform => SvgTransform.CreateBuilder().Translate(2, 24).Build(); + + private static SvgTransform GlobalMapTransform => SvgTransform.CreateBuilder().Translate(GridXOffset, GridYOffset).Build(); + + private static readonly List Months = + [ + "1月", "2月", "3月", "4月", "5月", "6月", + "7月", "8月", "9月", "10月", "11月", "12月" + ]; + + // private static readonly List Weekdays = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]; + private static readonly List Weekdays = ["周一", "周三", "周五"]; + + private static SvgTransform WeekdayGridTransform(int y) + { + return SvgTransform.CreateBuilder().Translate(0, y * (Width + Spacing)).Build(); + } + + private static SvgTransform WeekGridTransform(int x) + { + return SvgTransform.CreateBuilder().Translate(x * (Width + Spacing)).Build(); + } + + private static SvgTransform MonthTextTransform(int x) + { + return SvgTransform.CreateBuilder().Translate(x * (Width + Spacing)).Build(); + } + + private static SvgTransform DayTextTransform(int y) + { + // We only show Monday, Wednesday and Friday, so there are two days between texts. + return SvgTransform.CreateBuilder().Translate(0, y * 2 * (Width + Spacing)).Build(); + } + + private static string GetColorByContribution(long contribution) + { + return contribution switch + { + 0 => "fill-gray-200", + 1 or 2 => "fill-blue-100", + 3 or 4 => "fill-blue-300", + 5 or 6 => "fill-blue-500", + 7 or 8 => "fill-blue-700", + _ => "fill-blue-800" + }; + } + +} diff --git a/YaeBlog/Components/Layout/BlogLayout.razor b/src/YaeBlog/Components/Layout/BlogLayout.razor similarity index 100% rename from YaeBlog/Components/Layout/BlogLayout.razor rename to src/YaeBlog/Components/Layout/BlogLayout.razor diff --git a/YaeBlog/Components/Layout/MainLayout.razor b/src/YaeBlog/Components/Layout/MainLayout.razor similarity index 100% rename from YaeBlog/Components/Layout/MainLayout.razor rename to src/YaeBlog/Components/Layout/MainLayout.razor diff --git a/YaeBlog/Components/LicenseDisclaimer.razor b/src/YaeBlog/Components/LicenseDisclaimer.razor similarity index 93% rename from YaeBlog/Components/LicenseDisclaimer.razor rename to src/YaeBlog/Components/LicenseDisclaimer.razor index 3318a39..2fb886e 100644 --- a/YaeBlog/Components/LicenseDisclaimer.razor +++ b/src/YaeBlog/Components/LicenseDisclaimer.razor @@ -1,7 +1,7 @@
- 文章作者:Ricardo Ren + 文章作者:初冬的朝阳
@@ -18,7 +18,7 @@ 许可协议,诸位读者如有兴趣可任意转载,不必征询许可,但请注明“转载自 - Ricardo's Blog + Jackfiled's Blog ”。
diff --git a/YaeBlog/Components/PageAnchor.razor b/src/YaeBlog/Components/PageAnchor.razor similarity index 100% rename from YaeBlog/Components/PageAnchor.razor rename to src/YaeBlog/Components/PageAnchor.razor diff --git a/YaeBlog/Components/Pages/About.razor b/src/YaeBlog/Components/Pages/About.razor similarity index 100% rename from YaeBlog/Components/Pages/About.razor rename to src/YaeBlog/Components/Pages/About.razor diff --git a/YaeBlog/Components/Pages/Archives.razor b/src/YaeBlog/Components/Pages/Archives.razor similarity index 100% rename from YaeBlog/Components/Pages/Archives.razor rename to src/YaeBlog/Components/Pages/Archives.razor diff --git a/YaeBlog/Components/Pages/BlogIndex.razor b/src/YaeBlog/Components/Pages/BlogIndex.razor similarity index 98% rename from YaeBlog/Components/Pages/BlogIndex.razor rename to src/YaeBlog/Components/Pages/BlogIndex.razor index c5766c5..f4ff07e 100644 --- a/YaeBlog/Components/Pages/BlogIndex.razor +++ b/src/YaeBlog/Components/Pages/BlogIndex.razor @@ -6,7 +6,7 @@ @inject NavigationManager NavigationInstance - Ricardo's Blog + Jackfiled's Blog
diff --git a/YaeBlog/Components/Pages/Essays.razor b/src/YaeBlog/Components/Pages/Essays.razor similarity index 100% rename from YaeBlog/Components/Pages/Essays.razor rename to src/YaeBlog/Components/Pages/Essays.razor diff --git a/YaeBlog/Components/Pages/Friends.razor b/src/YaeBlog/Components/Pages/Friends.razor similarity index 85% rename from YaeBlog/Components/Pages/Friends.razor rename to src/YaeBlog/Components/Pages/Friends.razor index b46369f..648a198 100644 --- a/YaeBlog/Components/Pages/Friends.razor +++ b/src/YaeBlog/Components/Pages/Friends.razor @@ -1,6 +1,7 @@ @page "/friends" +@using Microsoft.Extensions.Options @using YaeBlog.Models -@inject BlogOptions Options +@inject IOptions BlogOptionInstance 友链 @@ -18,7 +19,7 @@
- @foreach (FriendLink link in Options.Links) + @foreach (FriendLink link in BlogOptionInstance.Value.Links.Where(i => i is not null).Select(i => i!)) {
- -@code { - -} diff --git a/YaeBlog/Components/Pages/Index.razor b/src/YaeBlog/Components/Pages/Index.razor similarity index 97% rename from YaeBlog/Components/Pages/Index.razor rename to src/YaeBlog/Components/Pages/Index.razor index 496def6..d532e69 100644 --- a/YaeBlog/Components/Pages/Index.razor +++ b/src/YaeBlog/Components/Pages/Index.razor @@ -4,7 +4,7 @@ @inject IEssayContentService EssayContentInstance - Ricardo's Index + Jackfiled's Index
@@ -81,7 +81,10 @@ 日常的代码开发使用自建的进行,个人 开发的各种项目都可以在上面找到。

+
+
+
diff --git a/YaeBlog/Components/Pages/Index.razor.css b/src/YaeBlog/Components/Pages/Index.razor.css similarity index 100% rename from YaeBlog/Components/Pages/Index.razor.css rename to src/YaeBlog/Components/Pages/Index.razor.css diff --git a/YaeBlog/Components/Pages/NotFound.razor b/src/YaeBlog/Components/Pages/NotFound.razor similarity index 100% rename from YaeBlog/Components/Pages/NotFound.razor rename to src/YaeBlog/Components/Pages/NotFound.razor diff --git a/YaeBlog/Components/Pages/Tags.razor b/src/YaeBlog/Components/Pages/Tags.razor similarity index 100% rename from YaeBlog/Components/Pages/Tags.razor rename to src/YaeBlog/Components/Pages/Tags.razor diff --git a/YaeBlog/Components/Pagination.razor b/src/YaeBlog/Components/Pagination.razor similarity index 100% rename from YaeBlog/Components/Pagination.razor rename to src/YaeBlog/Components/Pagination.razor diff --git a/YaeBlog/Components/Routes.razor b/src/YaeBlog/Components/Routes.razor similarity index 100% rename from YaeBlog/Components/Routes.razor rename to src/YaeBlog/Components/Routes.razor diff --git a/YaeBlog/Components/_Imports.razor b/src/YaeBlog/Components/_Imports.razor similarity index 85% rename from YaeBlog/Components/_Imports.razor rename to src/YaeBlog/Components/_Imports.razor index e1cbac4..0526866 100644 --- a/YaeBlog/Components/_Imports.razor +++ b/src/YaeBlog/Components/_Imports.razor @@ -7,3 +7,5 @@ @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop @using YaeBlog.Components +@using BlazorSvgComponents +@using BlazorSvgComponents.Models diff --git a/YaeBlog/Controllers/FilesController.cs b/src/YaeBlog/Controllers/FilesController.cs similarity index 100% rename from YaeBlog/Controllers/FilesController.cs rename to src/YaeBlog/Controllers/FilesController.cs diff --git a/YaeBlog/Directory.Build.targets b/src/YaeBlog/Directory.Build.targets similarity index 100% rename from YaeBlog/Directory.Build.targets rename to src/YaeBlog/Directory.Build.targets diff --git a/YaeBlog/Dockerfile b/src/YaeBlog/Dockerfile similarity index 100% rename from YaeBlog/Dockerfile rename to src/YaeBlog/Dockerfile diff --git a/YaeBlog/Exceptions/BlogCommandException.cs b/src/YaeBlog/Exceptions/BlogCommandException.cs similarity index 100% rename from YaeBlog/Exceptions/BlogCommandException.cs rename to src/YaeBlog/Exceptions/BlogCommandException.cs diff --git a/YaeBlog/Exceptions/BlogFileException.cs b/src/YaeBlog/Exceptions/BlogFileException.cs similarity index 100% rename from YaeBlog/Exceptions/BlogFileException.cs rename to src/YaeBlog/Exceptions/BlogFileException.cs diff --git a/src/YaeBlog/Exceptions/GiteaFetchException.cs b/src/YaeBlog/Exceptions/GiteaFetchException.cs new file mode 100644 index 0000000..f795dbf --- /dev/null +++ b/src/YaeBlog/Exceptions/GiteaFetchException.cs @@ -0,0 +1,16 @@ +namespace YaeBlog.Core.Exceptions; + +public class GiteaFetchException : Exception +{ + public GiteaFetchException() : base() + { + } + + public GiteaFetchException(string message) : base(message) + { + } + + public GiteaFetchException(string message, Exception innerException) : base(message, innerException) + { + } +} diff --git a/YaeBlog/Extensions/AngleSharpExtensions.cs b/src/YaeBlog/Extensions/AngleSharpExtensions.cs similarity index 100% rename from YaeBlog/Extensions/AngleSharpExtensions.cs rename to src/YaeBlog/Extensions/AngleSharpExtensions.cs diff --git a/src/YaeBlog/Extensions/DateOnlyExtensions.cs b/src/YaeBlog/Extensions/DateOnlyExtensions.cs new file mode 100644 index 0000000..3568d72 --- /dev/null +++ b/src/YaeBlog/Extensions/DateOnlyExtensions.cs @@ -0,0 +1,22 @@ +namespace YaeBlog.Extensions; + +public static class DateOnlyExtensions +{ + extension(DateOnly date) + { + public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now); + + public DateOnly LastMonday + { + get + { + return date.DayOfWeek switch + { + DayOfWeek.Monday => date, + DayOfWeek.Sunday => date.AddDays(-6), + _ => date.AddDays(1 - (int)date.DayOfWeek) + }; + } + } + } +} diff --git a/src/YaeBlog/Extensions/ServiceCollectionExtensions.cs b/src/YaeBlog/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 0000000..3fefec4 --- /dev/null +++ b/src/YaeBlog/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,36 @@ +using Markdig; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace YaeBlog.Extensions; + +public static class ServiceCollectionExtensions +{ + extension(IServiceCollection collection) + { + public IServiceCollection AddMarkdig() + { + MarkdownPipelineBuilder builder = new(); + + builder.UseAdvancedExtensions(); + + collection.AddSingleton(_ => builder.Build()); + + return collection; + } + + public IServiceCollection AddYamlParser() + { + DeserializerBuilder deserializerBuilder = new(); + deserializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + deserializerBuilder.IgnoreUnmatchedProperties(); + collection.AddSingleton(deserializerBuilder.Build()); + + SerializerBuilder serializerBuilder = new(); + serializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + collection.AddSingleton(serializerBuilder.Build()); + + return collection; + } + } +} diff --git a/src/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs b/src/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs new file mode 100644 index 0000000..e75050a --- /dev/null +++ b/src/YaeBlog/Extensions/WebApplicationBuilderExtensions.cs @@ -0,0 +1,59 @@ +using AngleSharp; +using YaeBlog.Abstraction; +using YaeBlog.Services; +using YaeBlog.Models; +using YaeBlog.Processors; + +namespace YaeBlog.Extensions; + +public static class WebApplicationBuilderExtensions +{ + extension(WebApplicationBuilder builder) + { + public WebApplicationBuilder AddYaeBlog() + { + builder.ConfigureOptions(BlogOptions.OptionName) + .ConfigureOptions(GiteaOptions.OptionName); + + builder.Services.AddHttpClient() + .AddMarkdig() + .AddYamlParser(); + + builder.Services.AddSingleton(_ => Configuration.Default) + .AddSingleton() + .AddSingleton() + .AddSingleton() + .AddTransient() + .AddTransient() + .AddTransient() + .AddTransient() + .AddSingleton(); + + return builder; + } + + public WebApplicationBuilder AddServer() + { + builder.Services.AddHostedService(); + + return builder; + } + + public WebApplicationBuilder AddWatcher() + { + builder.Services.AddTransient(); + builder.Services.AddHostedService(); + + return builder; + } + + private WebApplicationBuilder ConfigureOptions(string optionSectionName) where T : class + { + builder.Services + .AddOptions() + .Bind(builder.Configuration.GetSection(optionSectionName)) + .ValidateDataAnnotations(); + return builder; + } + } +} diff --git a/YaeBlog/Extensions/WebApplicationExtensions.cs b/src/YaeBlog/Extensions/WebApplicationExtensions.cs similarity index 100% rename from YaeBlog/Extensions/WebApplicationExtensions.cs rename to src/YaeBlog/Extensions/WebApplicationExtensions.cs diff --git a/YaeBlog/Models/BlogContent.cs b/src/YaeBlog/Models/BlogContent.cs similarity index 100% rename from YaeBlog/Models/BlogContent.cs rename to src/YaeBlog/Models/BlogContent.cs diff --git a/YaeBlog/Models/BlogContents.cs b/src/YaeBlog/Models/BlogContents.cs similarity index 100% rename from YaeBlog/Models/BlogContents.cs rename to src/YaeBlog/Models/BlogContents.cs diff --git a/src/YaeBlog/Models/BlogEssay.cs b/src/YaeBlog/Models/BlogEssay.cs new file mode 100644 index 0000000..44e7283 --- /dev/null +++ b/src/YaeBlog/Models/BlogEssay.cs @@ -0,0 +1,34 @@ +namespace YaeBlog.Models; + +public record BlogEssay( + string Title, + string FileName, + bool IsDraft, + DateTimeOffset PublishTime, + DateTimeOffset UpdateTime, + string Description, + uint WordCount, + string ReadTime, + List Tags, + string HtmlContent) : IComparable +{ + public string EssayLink => $"/blog/essays/{FileName}"; + + public override string ToString() => $"{Title}-{PublishTime}"; + + public int CompareTo(BlogEssay? other) + { + if (other is null) + { + return -1; + } + + // 草稿文章应当排在前面 + if (IsDraft != other.IsDraft) + { + return IsDraft ? -1 : 1; + } + + return other.PublishTime.CompareTo(PublishTime); + } +} diff --git a/YaeBlog/Models/BlogHeadline.cs b/src/YaeBlog/Models/BlogHeadline.cs similarity index 100% rename from YaeBlog/Models/BlogHeadline.cs rename to src/YaeBlog/Models/BlogHeadline.cs diff --git a/YaeBlog/Models/BlogImageInfo.cs b/src/YaeBlog/Models/BlogImageInfo.cs similarity index 100% rename from YaeBlog/Models/BlogImageInfo.cs rename to src/YaeBlog/Models/BlogImageInfo.cs diff --git a/src/YaeBlog/Models/BlogOptions.cs b/src/YaeBlog/Models/BlogOptions.cs new file mode 100644 index 0000000..e6fd993 --- /dev/null +++ b/src/YaeBlog/Models/BlogOptions.cs @@ -0,0 +1,30 @@ +using System.ComponentModel.DataAnnotations; + +namespace YaeBlog.Models; + +/// +/// 友链模型类 +/// +public class FriendLink +{ + [Required] public required string Name { get; init; } + + [Required] public required string Description { get; init; } + + [Required] public required string Link { get; init; } + + [Required] public required string AvatarImage { get; init; } +} + +public class BlogOptions +{ + public const string OptionName = "Blog"; + + [Required] public required string Root { get; init; } + + [Required] public required string Announcement { get; init; } + + [Required] public required int StartYear { get; init; } + + [Required] public required List Links { get; init; } +} diff --git a/YaeBlog/Models/EssayTag.cs b/src/YaeBlog/Models/EssayTag.cs similarity index 100% rename from YaeBlog/Models/EssayTag.cs rename to src/YaeBlog/Models/EssayTag.cs diff --git a/src/YaeBlog/Models/GiteaOptions.cs b/src/YaeBlog/Models/GiteaOptions.cs new file mode 100644 index 0000000..e333452 --- /dev/null +++ b/src/YaeBlog/Models/GiteaOptions.cs @@ -0,0 +1,14 @@ +using System.ComponentModel.DataAnnotations; + +namespace YaeBlog.Models; + +public class GiteaOptions +{ + public const string OptionName = "Gitea"; + + [Required] public required string BaseAddress { get; init; } + + [Required] public required string ApiKey { get; init; } + + [Required] public required string HeatMapUsername { get; init; } +} diff --git a/src/YaeBlog/Models/HeatMapItem.cs b/src/YaeBlog/Models/HeatMapItem.cs new file mode 100644 index 0000000..c61a30e --- /dev/null +++ b/src/YaeBlog/Models/HeatMapItem.cs @@ -0,0 +1,5 @@ +namespace YaeBlog.Models; + +public record GitContributionItem(DateOnly Time, long ContributionCount); + +public record GitContributionGroupedByWeek(DateOnly Monday, List Contributions); diff --git a/YaeBlog/Models/MarkdownMetadata.cs b/src/YaeBlog/Models/MarkdownMetadata.cs similarity index 100% rename from YaeBlog/Models/MarkdownMetadata.cs rename to src/YaeBlog/Models/MarkdownMetadata.cs diff --git a/YaeBlog/Processors/EssayStylesPostRenderProcessor.cs b/src/YaeBlog/Processors/EssayStylesPostRenderProcessor.cs similarity index 98% rename from YaeBlog/Processors/EssayStylesPostRenderProcessor.cs rename to src/YaeBlog/Processors/EssayStylesPostRenderProcessor.cs index 77a7b4f..ca4d27c 100644 --- a/YaeBlog/Processors/EssayStylesPostRenderProcessor.cs +++ b/src/YaeBlog/Processors/EssayStylesPostRenderProcessor.cs @@ -23,7 +23,7 @@ public sealed class EssayStylesPostRenderProcessor : IPostRenderProcessor BeatifyList(document); BeatifyInlineCode(document); - return essay.WithNewHtmlContent(document.DocumentElement.OuterHtml); + return essay with { HtmlContent = document.DocumentElement.OuterHtml }; } private readonly Dictionary _globalCssStyles = new() diff --git a/YaeBlog/Processors/HeadlinePostRenderProcessor.cs b/src/YaeBlog/Processors/HeadlinePostRenderProcessor.cs similarity index 97% rename from YaeBlog/Processors/HeadlinePostRenderProcessor.cs rename to src/YaeBlog/Processors/HeadlinePostRenderProcessor.cs index 955098e..bd2b76c 100644 --- a/YaeBlog/Processors/HeadlinePostRenderProcessor.cs +++ b/src/YaeBlog/Processors/HeadlinePostRenderProcessor.cs @@ -67,7 +67,7 @@ public class HeadlinePostRenderProcessor( logger.LogWarning("Failed to add headline of {}.", essay.FileName); } - return essay.WithNewHtmlContent(document.DocumentElement.OuterHtml); + return essay with { HtmlContent = document.DocumentElement.OuterHtml }; } private static BlogHeadline ParserHeadlineElement(IElement element) diff --git a/YaeBlog/Processors/ImagePostRenderProcessor.cs b/src/YaeBlog/Processors/ImagePostRenderProcessor.cs similarity index 85% rename from YaeBlog/Processors/ImagePostRenderProcessor.cs rename to src/YaeBlog/Processors/ImagePostRenderProcessor.cs index 7b02d86..75f3389 100644 --- a/YaeBlog/Processors/ImagePostRenderProcessor.cs +++ b/src/YaeBlog/Processors/ImagePostRenderProcessor.cs @@ -7,6 +7,12 @@ using YaeBlog.Models; namespace YaeBlog.Processors; +/// +/// 图片地址路径后处理器 +/// 将本地图片地址修改为图片API地址 +/// +/// +/// public class ImagePostRenderProcessor( ILogger logger, IOptions options) @@ -34,7 +40,7 @@ public class ImagePostRenderProcessor( } } - return essay.WithNewHtmlContent(html.DocumentElement.OuterHtml); + return essay with { HtmlContent = html.DocumentElement.OuterHtml }; } public string Name => nameof(ImagePostRenderProcessor); @@ -59,7 +65,7 @@ public class ImagePostRenderProcessor( } string imageLink = "api/files/" + filename; - logger.LogDebug("Generate image link '{}' for image file '{}'.", + logger.LogDebug("Generate image link '{link}' for image file '{filename}'.", imageLink, filename); return imageLink; diff --git a/YaeBlog/Program.cs b/src/YaeBlog/Program.cs similarity index 100% rename from YaeBlog/Program.cs rename to src/YaeBlog/Program.cs diff --git a/YaeBlog/Properties/launchSettings.json b/src/YaeBlog/Properties/launchSettings.json similarity index 100% rename from YaeBlog/Properties/launchSettings.json rename to src/YaeBlog/Properties/launchSettings.json diff --git a/YaeBlog/Services/BlogChangeWatcher.cs b/src/YaeBlog/Services/BlogChangeWatcher.cs similarity index 100% rename from YaeBlog/Services/BlogChangeWatcher.cs rename to src/YaeBlog/Services/BlogChangeWatcher.cs diff --git a/YaeBlog/Services/BlogHostedService.cs b/src/YaeBlog/Services/BlogHostedService.cs similarity index 100% rename from YaeBlog/Services/BlogHostedService.cs rename to src/YaeBlog/Services/BlogHostedService.cs diff --git a/YaeBlog/Services/BlogHotReloadService.cs b/src/YaeBlog/Services/BlogHotReloadService.cs similarity index 100% rename from YaeBlog/Services/BlogHotReloadService.cs rename to src/YaeBlog/Services/BlogHotReloadService.cs diff --git a/YaeBlog/Services/EssayContentService.cs b/src/YaeBlog/Services/EssayContentService.cs similarity index 100% rename from YaeBlog/Services/EssayContentService.cs rename to src/YaeBlog/Services/EssayContentService.cs diff --git a/YaeBlog/Services/EssayScanService.cs b/src/YaeBlog/Services/EssayScanService.cs similarity index 100% rename from YaeBlog/Services/EssayScanService.cs rename to src/YaeBlog/Services/EssayScanService.cs diff --git a/src/YaeBlog/Services/GitHeatMapService.cs b/src/YaeBlog/Services/GitHeatMapService.cs new file mode 100644 index 0000000..eae9f55 --- /dev/null +++ b/src/YaeBlog/Services/GitHeatMapService.cs @@ -0,0 +1,115 @@ +using DotNext; +using Microsoft.Extensions.Options; +using YaeBlog.Extensions; +using YaeBlog.Models; + +namespace YaeBlog.Services; + +public sealed class GitHeapMapService(IServiceProvider serviceProvider, IOptions giteaOptions, + ILogger logger) +{ + /// + /// 存储贡献列表 + /// 贡献列表采用懒加载和缓存机制,一天之内只请求一次Gitea服务器获得数据并缓存 + /// + private List _gitContributionsGroupedByWeek = []; + + /// + /// 最后一次更新贡献列表的时间 + /// + private DateOnly _updateTime = DateOnly.MinValue; + + public async Task> GetGitContributionGroupedByWeek() + { + DateOnly today = DateOnly.FromDateTime(DateTimeOffset.Now.DateTime); + if (_updateTime == today) + { + logger.LogDebug("Git contribution grouped by week cache is hit."); + return _gitContributionsGroupedByWeek; + } + + // 今天尚未更新 + // 更新一下 + GiteaFetchService giteaFetchService = serviceProvider.GetRequiredService(); + Result> r = + await giteaFetchService.FetchGiteaContributions(giteaOptions.Value.HeatMapUsername); + + if (!r.TryGet(out List? items)) + { + logger.LogError("Failed to fetch heatmap data: {}", r.Error); + return _gitContributionsGroupedByWeek; + } + + // The contribution is not grouped by day, so group them. + IEnumerable groupedItems = items + .GroupBy(i => i.Time) + .Select(group => new GitContributionItem(group.Key, + group.Select(i => i.ContributionCount).Sum())); + + List result = new(52); + + // Consider the input data is in order. + // Start should be one year ago. + GitContributionGroupedByWeek groupedContribution = new(DateOnly.Today.AddDays(-365 - 7).LastMonday, []); + logger.LogDebug("Create new item group by week {}.", groupedContribution.Monday); + + foreach ((DateOnly date, long contributions) in groupedItems) + { + DateOnly mondayOfItem = date.LastMonday; + logger.LogDebug("Current date of item: {item}, monday is {monday}", date, mondayOfItem); + + // If current item is in the same week of last item. + if (mondayOfItem == groupedContribution.Monday) + { + // Fill the spacing of empty days with 0 contribution. + FillSpacing(groupedContribution, date); + + groupedContribution.Contributions.Add(new GitContributionItem(date, contributions)); + continue; + } + + // Current time is in the next (or much more) week of last item. + // Fill the spacing, including the last week inner spacing and outer spacing. + while (groupedContribution.Monday < mondayOfItem) + { + FillSpacing(groupedContribution, date); + result.Add(groupedContribution); + groupedContribution = new GitContributionGroupedByWeek(groupedContribution.Monday.AddDays(7), []); + logger.LogDebug("Create new item group by week {}.", groupedContribution.Monday); + } + + // Now, the inner spacing of one week. + FillSpacing(groupedContribution, date); + groupedContribution.Contributions.Add(new GitContributionItem(date, contributions)); + } + + // Not fill the last item and add directly. + result.Add(groupedContribution); + + _gitContributionsGroupedByWeek = result; + _updateTime = DateOnly.Today; + + return _gitContributionsGroupedByWeek; + } + + private static void FillSpacing(GitContributionGroupedByWeek contribution, in DateOnly date) + { + if (contribution.Monday == date) + { + return; + } + + if (contribution.Contributions.Count == 0) + { + contribution.Contributions.Add(new GitContributionItem(contribution.Monday, 0)); + } + + DateOnly lastDate = contribution.Contributions.Last().Time; + // The day in one week is 7, so th count of items of one week should not bigger than 7. + while (contribution.Contributions.Count < 7 && lastDate < date.AddDays(-1)) + { + lastDate = lastDate.AddDays(1); + contribution.Contributions.Add(new GitContributionItem(lastDate, 0)); + } + } +} diff --git a/src/YaeBlog/Services/GiteaFetchService.cs b/src/YaeBlog/Services/GiteaFetchService.cs new file mode 100644 index 0000000..18ab068 --- /dev/null +++ b/src/YaeBlog/Services/GiteaFetchService.cs @@ -0,0 +1,63 @@ +using System.Net.Http.Headers; +using System.Text.Json; +using DotNext; +using Microsoft.Extensions.Options; +using YaeBlog.Core.Exceptions; +using YaeBlog.Models; + +namespace YaeBlog.Services; + +public sealed class GiteaFetchService +{ + private readonly HttpClient _httpClient; + + private static readonly JsonSerializerOptions s_serializerOptions = new() + { + PropertyNameCaseInsensitive = true, PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, + RespectRequiredConstructorParameters = true, RespectNullableAnnotations = true + }; + + /// + /// For test only. + /// + internal GiteaFetchService(IOptions giteaOptions, HttpClient httpClient) + { + _httpClient = httpClient; + + _httpClient.BaseAddress = new Uri(giteaOptions.Value.BaseAddress); + _httpClient.DefaultRequestHeaders.Authorization = + new AuthenticationHeaderValue("Bearer", giteaOptions.Value.ApiKey); + } + + public GiteaFetchService(IOptions giteaOptions, IHttpClientFactory httpClientFactory) : this( + giteaOptions, httpClientFactory.CreateClient()) + { + } + + private record UserHeatmapData(long Contributions, long Timestamp); + + public async Task>> FetchGiteaContributions(string username) + { + try + { + List? data = + await _httpClient.GetFromJsonAsync>($"users/{username}/heatmap", + s_serializerOptions); + + if (data is null or { Count: 0 }) + { + return Result.FromException>( + new GiteaFetchException("Failed to fetch valid data.")); + } + + return Result.FromValue(data.Select(i => + new GitContributionItem(DateOnly.FromDateTime(DateTimeOffset.FromUnixTimeSeconds(i.Timestamp).DateTime), + i.Contributions)).ToList()); + } + catch (HttpRequestException exception) + { + return Result.FromException>(new GiteaFetchException("Failed to fetch.", + exception)); + } + } +} diff --git a/YaeBlog/Services/ImageCompressService.cs b/src/YaeBlog/Services/ImageCompressService.cs similarity index 100% rename from YaeBlog/Services/ImageCompressService.cs rename to src/YaeBlog/Services/ImageCompressService.cs diff --git a/YaeBlog/Services/MarkdownWordCounter.cs b/src/YaeBlog/Services/MarkdownWordCounter.cs similarity index 100% rename from YaeBlog/Services/MarkdownWordCounter.cs rename to src/YaeBlog/Services/MarkdownWordCounter.cs diff --git a/YaeBlog/Services/RendererService.cs b/src/YaeBlog/Services/RendererService.cs similarity index 83% rename from YaeBlog/Services/RendererService.cs rename to src/YaeBlog/Services/RendererService.cs index 95ab57e..a4054d9 100644 --- a/YaeBlog/Services/RendererService.cs +++ b/src/YaeBlog/Services/RendererService.cs @@ -34,9 +34,9 @@ public sealed partial class RendererService( } IEnumerable preProcessedContents = await PreProcess(posts); + ConcurrentBag essays = []; - List essays = []; - foreach (BlogContent content in preProcessedContents) + Parallel.ForEach(preProcessedContents, content => { (uint wordCount, string readTime) = GetWordCount(content); DateTimeOffset publishDate = content.Metadata.Date is null @@ -46,39 +46,20 @@ public sealed partial class RendererService( DateTimeOffset updateTime = content.Metadata.UpdateTime is null ? publishDate : DateTimeOffset.Parse(content.Metadata.UpdateTime); + string description = GetDescription(content); + List tags = content.Metadata.Tags ?? []; - BlogEssay essay = new() - { - Title = content.Metadata.Title ?? content.BlogName, - FileName = content.BlogName, - IsDraft = content.IsDraft, - Description = GetDescription(content), - WordCount = wordCount, - ReadTime = readTime, - PublishTime = publishDate, - UpdateTime = updateTime, - HtmlContent = content.Content - }; + string originalHtml = Markdown.ToHtml(content.Content, markdownPipeline); - if (content.Metadata.Tags is not null) - { - essay.Tags.AddRange(content.Metadata.Tags); - } + BlogEssay essay = new( + content.Metadata.Title ?? content.BlogName, content.BlogName, content.IsDraft, publishDate, updateTime, + description, wordCount, readTime, tags, originalHtml); + logger.LogDebug("Render essay: {}", essay); essays.Add(essay); - } - - ConcurrentBag postProcessEssays = []; - Parallel.ForEach(essays, essay => - { - BlogEssay newEssay = - essay.WithNewHtmlContent(Markdown.ToHtml(essay.HtmlContent, markdownPipeline)); - - postProcessEssays.Add(newEssay); - logger.LogDebug("Render markdown file {}.", newEssay); }); - IEnumerable postProcessedEssays = await PostProcess(postProcessEssays); + IEnumerable postProcessedEssays = await PostProcess(essays); foreach (BlogEssay essay in postProcessedEssays) { diff --git a/YaeBlog/YaeBlog.csproj b/src/YaeBlog/YaeBlog.csproj similarity index 50% rename from YaeBlog/YaeBlog.csproj rename to src/YaeBlog/YaeBlog.csproj index 642cf90..d25927b 100644 --- a/YaeBlog/YaeBlog.csproj +++ b/src/YaeBlog/YaeBlog.csproj @@ -1,13 +1,22 @@ - - - - - - - + + + + + + + + + + + + + + + + @@ -18,6 +27,6 @@ pnpm install - pwsh build.ps1 tailwind + pwsh ../../build.ps1 tailwind diff --git a/src/YaeBlog/appsettings.json b/src/YaeBlog/appsettings.json new file mode 100644 index 0000000..f55e6fd --- /dev/null +++ b/src/YaeBlog/appsettings.json @@ -0,0 +1,44 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "System.Net.Http.HttpClient": "Warning" + } + }, + "AllowedHosts": "*", + "Tailwind": { + "InputFile": "wwwroot/input.css", + "OutputFile": "wwwroot/output.css" + }, + "Blog": { + "Root": "../../source", + "Announcement": "博客锐意装修中,敬请期待!测试阶段如有问题还请海涵。", + "StartYear": 2021, + "Links": [ + { + "Name": "Ichirinko", + "Description": "这是个大哥", + "Link": "https://ichirinko.top", + "AvatarImage": "https://ichirinko-blog-img-1.oss-cn-shenzhen.aliyuncs.com/Pic_res/img/202209122110798.png" + }, + { + "Name": "不会写程序的晨旭", + "Description": "一个普通大学生", + "Link": "https://chenxutalk.top", + "AvatarImage": "https://www.chenxutalk.top/img/photo.png" + }, + { + "Name": "万木长风", + "Description": "世界渲染中...", + "Link": "https://ryohai.fun", + "AvatarImage": "https://ryohai.fun/static/favicons/favicon-32x32.png" + } + ] + }, + "Gitea": { + "BaseAddress": "https://git.rrricardo.top/api/v1/", + "ApiKey": "7e33617e5d084199332fceec3e0cb04c6ddced55", + "HeatMapUsername": "jackfiled" + } +} diff --git a/YaeBlog/docker-compose.yaml b/src/YaeBlog/docker-compose.yaml similarity index 100% rename from YaeBlog/docker-compose.yaml rename to src/YaeBlog/docker-compose.yaml diff --git a/YaeBlog/package.json b/src/YaeBlog/package.json similarity index 100% rename from YaeBlog/package.json rename to src/YaeBlog/package.json diff --git a/YaeBlog/pnpm-lock.yaml b/src/YaeBlog/pnpm-lock.yaml similarity index 100% rename from YaeBlog/pnpm-lock.yaml rename to src/YaeBlog/pnpm-lock.yaml diff --git a/YaeBlog/wwwroot/fonts/.gitattributes b/src/YaeBlog/wwwroot/fonts/.gitattributes similarity index 100% rename from YaeBlog/wwwroot/fonts/.gitattributes rename to src/YaeBlog/wwwroot/fonts/.gitattributes diff --git a/YaeBlog/wwwroot/fonts/fa-brands-400.woff2 b/src/YaeBlog/wwwroot/fonts/fa-brands-400.woff2 similarity index 100% rename from YaeBlog/wwwroot/fonts/fa-brands-400.woff2 rename to src/YaeBlog/wwwroot/fonts/fa-brands-400.woff2 diff --git a/YaeBlog/wwwroot/fonts/fa-regular-400.woff2 b/src/YaeBlog/wwwroot/fonts/fa-regular-400.woff2 similarity index 100% rename from YaeBlog/wwwroot/fonts/fa-regular-400.woff2 rename to src/YaeBlog/wwwroot/fonts/fa-regular-400.woff2 diff --git a/YaeBlog/wwwroot/fonts/fa-solid-900.woff2 b/src/YaeBlog/wwwroot/fonts/fa-solid-900.woff2 similarity index 100% rename from YaeBlog/wwwroot/fonts/fa-solid-900.woff2 rename to src/YaeBlog/wwwroot/fonts/fa-solid-900.woff2 diff --git a/YaeBlog/wwwroot/images/alipay-code.jpeg b/src/YaeBlog/wwwroot/images/alipay-code.jpeg similarity index 100% rename from YaeBlog/wwwroot/images/alipay-code.jpeg rename to src/YaeBlog/wwwroot/images/alipay-code.jpeg diff --git a/YaeBlog/wwwroot/images/avatar.png b/src/YaeBlog/wwwroot/images/avatar.png similarity index 100% rename from YaeBlog/wwwroot/images/avatar.png rename to src/YaeBlog/wwwroot/images/avatar.png diff --git a/YaeBlog/wwwroot/images/favicon.ico b/src/YaeBlog/wwwroot/images/favicon.ico similarity index 100% rename from YaeBlog/wwwroot/images/favicon.ico rename to src/YaeBlog/wwwroot/images/favicon.ico diff --git a/YaeBlog/wwwroot/images/wechat-code.jpeg b/src/YaeBlog/wwwroot/images/wechat-code.jpeg similarity index 100% rename from YaeBlog/wwwroot/images/wechat-code.jpeg rename to src/YaeBlog/wwwroot/images/wechat-code.jpeg diff --git a/YaeBlog/wwwroot/images/xiaohongshu-seeklogo.svg b/src/YaeBlog/wwwroot/images/xiaohongshu-seeklogo.svg similarity index 100% rename from YaeBlog/wwwroot/images/xiaohongshu-seeklogo.svg rename to src/YaeBlog/wwwroot/images/xiaohongshu-seeklogo.svg diff --git a/YaeBlog/wwwroot/tailwind.css b/src/YaeBlog/wwwroot/tailwind.css similarity index 100% rename from YaeBlog/wwwroot/tailwind.css rename to src/YaeBlog/wwwroot/tailwind.css