using CloudBuilder.AI.Entity;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Topshelf.Python;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace CloudBuilder.Topshelf.Task.Novel.Process
{
///
/// 章节分割器
/// 不同的小说有自己的分割方法,可以传入参数
///
public class ChapterSplitter
{
public ChapterSplitter()
{
}
///
/// 按章节分割小说文本
///
public List SplitNovelIntoChapters(string novelText, string chapterPatterns)
{
var chapters = new List();
var lines = novelText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
var currentAiChapterEntity = new StringBuilder();
var currentAiChapterEntityTitle = "未命名章节";
var chapterCount = 1;
foreach (var line in lines)
{
// 检查是否是章节标题
if (IsChapterTitle(line, chapterPatterns))
{
// 如果当前章节有内容,则保存
if (currentAiChapterEntity.Length > 0)
{
chapters.Add(new AiChapterEntity
{
Title = currentAiChapterEntityTitle,
Guid = Guid.NewGuid().ToString(),
Content = currentAiChapterEntity.ToString(),
ChapterIndex = chapterCount
});
currentAiChapterEntity.Clear();
chapterCount++;
}
// 更新章节标题
currentAiChapterEntityTitle = line.Trim();
// 添加章节标题
currentAiChapterEntity.AppendLine(line.Trim());
// 添加一个空行作为分隔,确保章节标题和正文内容分离
currentAiChapterEntity.AppendLine();
}
else
{
// 添加到当前章节,确保每行独立
currentAiChapterEntity.AppendLine(line);
}
}
// 添加最后一个章节
if (currentAiChapterEntity.Length > 0)
{
chapters.Add(new AiChapterEntity
{
Title = currentAiChapterEntityTitle,
Content = currentAiChapterEntity.ToString(),
Guid = Guid.NewGuid().ToString(),
ChapterIndex = chapterCount
});
}
return chapters;
}
///
/// 检查是否为章节标题
///
private bool IsChapterTitle(string line, string cptPattern)
{
// 去除首尾空白字符
var trimmedLine = line.Trim();
// 常见的章节标题模式
var chapterPatterns = new[]
{
@"^第\s*[\u4e00-\u9fa50-9]+\s*章", // 第X章, 第XX章等
@"^第\s*[0-9]+\s*章", // 第1章, 第2章等
};
if (!string.IsNullOrEmpty(cptPattern))
{
Array.Resize(ref chapterPatterns, chapterPatterns.Length + 1);
chapterPatterns[chapterPatterns.Length - 1] = cptPattern;
}
foreach (var pattern in chapterPatterns)
{
if (Regex.IsMatch(trimmedLine, pattern, RegexOptions.IgnoreCase))
{
//第一章内容说明了什么,请描述一下:
if (trimmedLine.Length > 20) return false;
return true;
}
}
return false;
}
///
/// 保存章节到单独的文件
///
public void SaveChaptersToFiles(List chapters, string outputDirectory)
{
// 确保输出目录存在
if (!Directory.Exists(outputDirectory))
{
Directory.CreateDirectory(outputDirectory);
}
foreach (var chapter in chapters)
{
// 使用章节标题作为文件名,清理非法字符
var fileName = CleanFileName(chapter.Title) + ".txt";
var filePath = Path.Combine(outputDirectory, fileName);
File.WriteAllText(filePath, chapter.Content, Encoding.UTF8);
}
}
///
/// 清理文件名中的非法字符
///
private string CleanFileName(string fileName)
{
var invalidChars = Path.GetInvalidFileNameChars();
foreach (var invalidChar in invalidChars)
{
fileName = fileName.Replace(invalidChar, '_');
}
// 限制文件名长度
if (fileName.Length > 100)
{
fileName = fileName.Substring(0, 100);
}
return fileName;
}
}
}