|
|
|
@ -60,18 +60,18 @@ class AnalyzeTxtFile { |
|
|
|
|
var allLength = 0 |
|
|
|
|
|
|
|
|
|
//获取文件中的数据到buffer,直到没有数据为止 |
|
|
|
|
while (bookStream.read(buffer, 0, buffer.size).also { length = it } > 0) { |
|
|
|
|
while (bookStream.read(buffer).also { length = it } > 0) { |
|
|
|
|
blockPos++ |
|
|
|
|
var blockContent = String(buffer, charset) |
|
|
|
|
val lastN = blockContent.lastIndexOf("\n") |
|
|
|
|
if (lastN > 0) { |
|
|
|
|
blockContent = blockContent.substring(0, lastN) |
|
|
|
|
length = blockContent.toByteArray(charset).size |
|
|
|
|
allLength += length |
|
|
|
|
bookStream.seek(allLength.toLong()) |
|
|
|
|
} |
|
|
|
|
//如果存在Chapter |
|
|
|
|
if (rulePattern != null) { //将数据转换成String |
|
|
|
|
var blockContent = String(buffer, charset) |
|
|
|
|
val lastN = blockContent.lastIndexOf("\n") |
|
|
|
|
if (lastN > 0) { |
|
|
|
|
blockContent = blockContent.substring(0, lastN) |
|
|
|
|
length = blockContent.toByteArray(charset).size |
|
|
|
|
allLength += length |
|
|
|
|
bookStream.seek(allLength.toLong()) |
|
|
|
|
} |
|
|
|
|
//当前Block下使过的String的指针 |
|
|
|
|
var seekPos = 0 |
|
|
|
|
//进行正则匹配 |
|
|
|
@ -81,47 +81,62 @@ class AnalyzeTxtFile { |
|
|
|
|
val chapterStart = matcher.start() |
|
|
|
|
//获取章节内容 |
|
|
|
|
val chapterContent = blockContent.substring(seekPos, chapterStart) |
|
|
|
|
if (chapterContent.length > 30000 && pattern == null) { |
|
|
|
|
val chapterLength = chapterContent.toByteArray(charset).size |
|
|
|
|
if (chapterLength > 30000 && pattern == null) { |
|
|
|
|
//移除不匹配的规则 |
|
|
|
|
tocRules.remove(tocRule) |
|
|
|
|
return analyze(bookStream, book, null) |
|
|
|
|
} |
|
|
|
|
//如果 seekPos == 0 && nextChapterPos != 0 表示当前block处前面有一段内容 |
|
|
|
|
//第一种情况一定是序章 第二种情况可能是上一个章节的内容 |
|
|
|
|
//第一种情况一定是序章 第二种情况是上一个章节的内容 |
|
|
|
|
if (seekPos == 0 && chapterStart != 0) { //获取当前章节的内容 |
|
|
|
|
val contentSize = chapterContent.toByteArray(charset).size.toLong() |
|
|
|
|
if (toc.isEmpty()) { |
|
|
|
|
if (toc.isEmpty()) { //如果当前没有章节,那么就是序章 |
|
|
|
|
//加入简介 |
|
|
|
|
if (StringUtils.trim(chapterContent).isNotEmpty()) { |
|
|
|
|
val chapter = BookChapter() |
|
|
|
|
chapter.title = "前言" |
|
|
|
|
chapter.start = 0 |
|
|
|
|
chapter.end = contentSize |
|
|
|
|
toc.add(chapter) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
toc.last().let { |
|
|
|
|
it.end = it.end!! + contentSize |
|
|
|
|
val qyChapter = BookChapter() |
|
|
|
|
qyChapter.title = "前言" |
|
|
|
|
qyChapter.start = 0 |
|
|
|
|
qyChapter.end = chapterLength.toLong() |
|
|
|
|
toc.add(qyChapter) |
|
|
|
|
} |
|
|
|
|
//创建当前章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = chapterLength.toLong() |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} else { //否则就block分割之后,上一个章节的剩余内容 |
|
|
|
|
//获取上一章节 |
|
|
|
|
val lastChapter = toc.last() |
|
|
|
|
//将当前段落添加上一章去 |
|
|
|
|
lastChapter.end = |
|
|
|
|
lastChapter.end!! + chapterLength.toLong() |
|
|
|
|
//创建当前章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = lastChapter.end |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} |
|
|
|
|
//创建当前章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = (toc.lastOrNull()?.end ?: 0) + contentSize |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} else { |
|
|
|
|
val lastChapter = toc.lastOrNull() |
|
|
|
|
lastChapter?.let { |
|
|
|
|
//上一章节结束等于这一章节开始 |
|
|
|
|
it.end = it.start!! + chapterContent.toByteArray(charset).size |
|
|
|
|
if (toc.isNotEmpty()) { //获取章节内容 |
|
|
|
|
//获取上一章节 |
|
|
|
|
val lastChapter = toc.last() |
|
|
|
|
lastChapter.end = |
|
|
|
|
lastChapter.start!! + chapterContent.toByteArray(charset).size.toLong() |
|
|
|
|
//创建当前章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = lastChapter.end |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} else { //如果章节不存在则创建章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = 0 |
|
|
|
|
curChapter.end = 0 |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} |
|
|
|
|
//创建当前章节 |
|
|
|
|
val curChapter = BookChapter() |
|
|
|
|
curChapter.title = matcher.group() |
|
|
|
|
curChapter.start = lastChapter?.end ?: 0 |
|
|
|
|
toc.add(curChapter) |
|
|
|
|
} |
|
|
|
|
//设置指针偏移 |
|
|
|
|
seekPos += chapterContent.length |
|
|
|
|
seekPos += chapterLength |
|
|
|
|
} |
|
|
|
|
} else { //进行本地虚拟分章 |
|
|
|
|
//章节在buffer的偏移量 |
|
|
|
@ -165,7 +180,8 @@ class AnalyzeTxtFile { |
|
|
|
|
//block的偏移点 |
|
|
|
|
curOffset += length.toLong() |
|
|
|
|
|
|
|
|
|
if (rulePattern != null) { //设置上一章的结尾 |
|
|
|
|
if (rulePattern != null) { |
|
|
|
|
//设置上一章的结尾 |
|
|
|
|
val lastChapter = toc.last() |
|
|
|
|
lastChapter.end = curOffset |
|
|
|
|
} |
|
|
|
@ -231,10 +247,9 @@ class AnalyzeTxtFile { |
|
|
|
|
val bookFile = getBookFile(App.INSTANCE, book) |
|
|
|
|
//获取文件流 |
|
|
|
|
val bookStream = RandomAccessFile(bookFile, "r") |
|
|
|
|
bookStream.seek(bookChapter.start ?: 0) |
|
|
|
|
val extent = (bookChapter.end!! - bookChapter.start!!).toInt() |
|
|
|
|
val content = ByteArray(extent) |
|
|
|
|
bookStream.read(content, 0, extent) |
|
|
|
|
val content = ByteArray((bookChapter.end!! - bookChapter.start!!).toInt()) |
|
|
|
|
bookStream.seek(bookChapter.start!!) |
|
|
|
|
bookStream.read(content) |
|
|
|
|
return String(content, book.fileCharset()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|