|
@@ -323,68 +323,76 @@ export default {
|
|
updateDirectoryNumbers() {
|
|
updateDirectoryNumbers() {
|
|
// 按层级分组
|
|
// 按层级分组
|
|
const levelGroups = {};
|
|
const levelGroups = {};
|
|
|
|
+ let globalCounter = 1; // 用于一级目录的编号
|
|
|
|
|
|
// 第一遍遍历:收集并按层级分组
|
|
// 第一遍遍历:收集并按层级分组
|
|
this.extractedAttrs.forEach((attr, index) => {
|
|
this.extractedAttrs.forEach((attr, index) => {
|
|
if (attr.type === "Directory") {
|
|
if (attr.type === "Directory") {
|
|
- if (!levelGroups[attr.level]) {
|
|
|
|
- levelGroups[attr.level] = [];
|
|
|
|
|
|
+ const level = parseInt(attr.level) || 1;
|
|
|
|
+ if (!levelGroups[level]) {
|
|
|
|
+ levelGroups[level] = [];
|
|
}
|
|
}
|
|
attr.originalIndex = index;
|
|
attr.originalIndex = index;
|
|
attr.originalContent = attr.content.replace(/^[\d.]+\s*/, '').trim();
|
|
attr.originalContent = attr.content.replace(/^[\d.]+\s*/, '').trim();
|
|
- levelGroups[attr.level] = [...levelGroups[attr.level], attr];
|
|
|
|
|
|
+ levelGroups[level] = [...levelGroups[level], attr];
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
- // 处理所有层级的目录
|
|
|
|
|
|
+ // 创建一个Map来存储每个层级的计数器
|
|
|
|
+ const levelCounters = new Map();
|
|
|
|
+
|
|
|
|
+ // 处理每个层级的目录
|
|
Object.keys(levelGroups)
|
|
Object.keys(levelGroups)
|
|
.sort((a, b) => Number(a) - Number(b))
|
|
.sort((a, b) => Number(a) - Number(b))
|
|
.forEach(level => {
|
|
.forEach(level => {
|
|
|
|
+ level = parseInt(level);
|
|
const attrs = levelGroups[level];
|
|
const attrs = levelGroups[level];
|
|
|
|
|
|
- if (level === '1') {
|
|
|
|
- // 处理一级目录
|
|
|
|
- attrs.forEach((attr, index) => {
|
|
|
|
- attr.number = (index + 1).toString();
|
|
|
|
- attr.content = `${attr.number} ${attr.originalContent}`;
|
|
|
|
- });
|
|
|
|
- } else {
|
|
|
|
- // 处理其他层级目录
|
|
|
|
- attrs.forEach((attr) => {
|
|
|
|
- // 找到该目录前面最近的上级目录
|
|
|
|
- const parentLevel = (parseInt(level) - 1).toString();
|
|
|
|
- let previousParent = null;
|
|
|
|
|
|
+ // 为每个层级创建一个新的计数器
|
|
|
|
+ if (!levelCounters.has(level)) {
|
|
|
|
+ levelCounters.set(level, new Map());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 处理当前层级的所有目录
|
|
|
|
+ attrs.forEach((attr) => {
|
|
|
|
+ if (level === 1) {
|
|
|
|
+ // 一级目录直接使用全局计数器
|
|
|
|
+ attr.number = globalCounter.toString();
|
|
|
|
+ globalCounter++;
|
|
|
|
+ } else {
|
|
|
|
+ // 获取父级层级
|
|
|
|
+ const parentLevel = level - 1;
|
|
|
|
+ let parentNumber = null;
|
|
|
|
|
|
- for (const parentAttr of levelGroups[parentLevel] || []) {
|
|
|
|
- if (parentAttr.originalIndex < attr.originalIndex) {
|
|
|
|
- previousParent = parentAttr;
|
|
|
|
- } else {
|
|
|
|
|
|
+ // 在父级层级中查找最近的父目录
|
|
|
|
+ for (let i = attr.originalIndex - 1; i >= 0; i--) {
|
|
|
|
+ const potentialParent = this.extractedAttrs[i];
|
|
|
|
+ if (potentialParent &&
|
|
|
|
+ potentialParent.type === "Directory" &&
|
|
|
|
+ parseInt(potentialParent.level) === parentLevel) {
|
|
|
|
+ parentNumber = potentialParent.number;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (previousParent) {
|
|
|
|
- // 找到同属于这个上级目录下的所有同级目录
|
|
|
|
- const siblings = attrs.filter(a => {
|
|
|
|
- // 找到下一个同级别的父级目录
|
|
|
|
- const nextParent = levelGroups[parentLevel].find(p =>
|
|
|
|
- p.originalIndex > previousParent.originalIndex
|
|
|
|
- );
|
|
|
|
- const nextParentIndex = nextParent ? nextParent.originalIndex : Infinity;
|
|
|
|
-
|
|
|
|
- return a.originalIndex > previousParent.originalIndex
|
|
|
|
- && a.originalIndex < nextParentIndex;
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- // 计算在当前层级中的位置
|
|
|
|
- const siblingIndex = siblings.indexOf(attr) + 1;
|
|
|
|
-
|
|
|
|
- // 构建编号
|
|
|
|
- attr.number = `${previousParent.number}.${siblingIndex}`;
|
|
|
|
- attr.content = `${attr.number} ${attr.originalContent}`;
|
|
|
|
|
|
+ if (parentNumber) {
|
|
|
|
+ // 获取或初始化该父级下的计数器
|
|
|
|
+ const parentCounters = levelCounters.get(level);
|
|
|
|
+ if (!parentCounters.has(parentNumber)) {
|
|
|
|
+ parentCounters.set(parentNumber, 1);
|
|
|
|
+ } else {
|
|
|
|
+ parentCounters.set(parentNumber, parentCounters.get(parentNumber) + 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 设置当前目录的编号
|
|
|
|
+ const childNumber = parentCounters.get(parentNumber);
|
|
|
|
+ attr.number = `${parentNumber}.${childNumber}`;
|
|
}
|
|
}
|
|
- });
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 更新目录内容
|
|
|
|
+ attr.content = `${attr.number} ${attr.originalContent}`;
|
|
|
|
+ });
|
|
});
|
|
});
|
|
|
|
|
|
// 更新原始数据中的目录内容
|
|
// 更新原始数据中的目录内容
|
|
@@ -392,11 +400,10 @@ export default {
|
|
if (com.attrs) {
|
|
if (com.attrs) {
|
|
com.attrs.forEach(attr => {
|
|
com.attrs.forEach(attr => {
|
|
if (attr.type === "Directory") {
|
|
if (attr.type === "Directory") {
|
|
- const updatedAttr = this.extractedAttrs.find(a => {
|
|
|
|
- const cleanAttrContent = attr.content.replace(/^[\d.]+\s*/, '').trim();
|
|
|
|
- const cleanUpdatedContent = a.originalContent;
|
|
|
|
- return a.level === attr.level && cleanAttrContent === cleanUpdatedContent;
|
|
|
|
- });
|
|
|
|
|
|
+ // 根据原始索引找到对应的更新后的目录项
|
|
|
|
+ const updatedAttr = this.extractedAttrs.find(a =>
|
|
|
|
+ a.originalIndex === attr.originalIndex
|
|
|
|
+ );
|
|
|
|
|
|
if (updatedAttr) {
|
|
if (updatedAttr) {
|
|
attr.number = updatedAttr.number;
|
|
attr.number = updatedAttr.number;
|