分类映射管理模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

# ============================================
# 《意识之道》智能文章创建脚本
# 作者:道祖
# 版本:v1
# 日期:2026-02-04 00:10
# 更新日期:2026-02-04 00:10
# ============================================



# 分类映射管理模块

# 获取脚本当前目录
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$rootDir = Split-Path -Parent $scriptDir

# 设置文件路径(相对于项目根目录)
$script:jsonFilePath = Join-Path $rootDir "category_map.json"
$script:yamlConfigPath = Join-Path $rootDir "_config.yml"

$script:VerboseOutput = $false # 默认不输出详细日志

Write-Verbose "模块路径: $scriptDir"
Write-Verbose "项目根目录: $rootDir"
Write-Verbose "JSON文件路径: $script:jsonFilePath"
Write-Verbose "YAML文件路径: $script:yamlConfigPath"

function Get-CategoryMapFromYaml {

if ($script:VerboseOutput) {
Write-Host "📄 从 YAML 文件加载分类映射..." -ForegroundColor Gray
Write-Host " 文件路径: $script:yamlConfigPath" -ForegroundColor DarkGray
}


if (-not (Test-Path $script:yamlConfigPath)) {
Write-Host "❌ 配置文件不存在: $script:yamlConfigPath" -ForegroundColor Red
return @{}
}

try {
# 读取文件内容
$content = Get-Content $script:yamlConfigPath -Raw
Write-Verbose "文件大小: $($content.Length) 字符"

$categoryMap = @{}
$foundCount = 0

# 调试:显示前200个字符
if ($content.Length > 200) {
Write-Verbose "文件前200字符: $($content.Substring(0, 200))"
}

# 查找 category_map 部分
if ($content -match '(?sm)category_map:(.*?)(?=\n[^\s#]|\Z)') {
$mapSection = $matches[1]
Write-Verbose "找到 category_map 配置段"
Write-Verbose "配置段内容: $mapSection"

# 解析每一行
$lines = $mapSection -split "`n"
foreach ($line in $lines) {
$line = $line.Trim()

# 跳过注释行和空行
if ($line -and $line -notmatch '^\s*#') {
# 匹配键值对
if ($line -match '^\s*([^#:]+?)\s*:\s*([^#\s]+)') {
$key = $matches[1].Trim()
$value = $matches[2].Trim()

# 确保不是空键值,且不是 category_map 本身
if ($key -and $value) {
$categoryMap[$key] = $value
$foundCount++
if ($script:VerboseOutput) {
Write-Host " 映射: $key$value" -ForegroundColor Green
}

}
}
}
}
}
else {
Write-Host "❌ 未找到 category_map 配置段" -ForegroundColor Red

# 尝试逐行查找
Write-Host " 尝试逐行查找 category_map..." -ForegroundColor Yellow
$lines = $content -split "`n"
$inCategoryMap = $false

foreach ($line in $lines) {
if ($line.Trim() -eq 'category_map:') {
$inCategoryMap = $true
continue
}

# 结束条件:遇到新的顶级配置项(不以空格开头)
if ($inCategoryMap -and $line -match '^\S' -and $line.Trim() -notmatch '^\s*#') {
$inCategoryMap = $false
continue
}

# 在category_map范围内解析键值对
if ($inCategoryMap -and $line -match '^\s*([^#:]+?)\s*:\s*([^#\s]+)') {
$key = $matches[1].Trim()
$value = $matches[2].Trim()

if ($key -and $value) {
$categoryMap[$key] = $value
$foundCount++
if ($script:VerboseOutput) {
Write-Host " 映射: $key$value" -ForegroundColor Green
}
}
}
}
}

if ($foundCount -gt 0) {
if ($script:VerboseOutput) {
Write-Host "✅ 从 YAML 文件加载了 $foundCount 个分类映射" -ForegroundColor Green
}
return $categoryMap
} else {
Write-Host "⚠️ 从 YAML 文件未找到分类映射" -ForegroundColor Yellow
return @{}
}
}
catch {
Write-Host "❌ 解析 YAML 文件时出错: $_" -ForegroundColor Red
return @{}
}
}

function Get-CategoryMapFromJson {
if ($script:VerboseOutput) {
Write-Host "📄 从 JSON 文件加载分类映射..." -ForegroundColor Gray
Write-Host " 文件路径: $script:jsonFilePath" -ForegroundColor DarkGray
}

if (-not (Test-Path $script:jsonFilePath)) {
Write-Host "📄 JSON 文件不存在: $script:jsonFilePath" -ForegroundColor Gray
return @{}
}

try {
$jsonContent = Get-Content $script:jsonFilePath -Raw
if ([string]::IsNullOrWhiteSpace($jsonContent)) {
Write-Host "⚠️ JSON 文件为空" -ForegroundColor Yellow
return @{}
}

# 移除注释行
$cleanContent = $jsonContent -replace '(?m)^\s*#.*\n?', ''

$jsonMap = $cleanContent | ConvertFrom-Json -AsHashtable

if ($jsonMap -and $jsonMap.Count -gt 0) {
if ($script:VerboseOutput) {
Write-Host "✅ 从 JSON 文件加载了 $($jsonMap.Count) 个分类映射" -ForegroundColor Green
}

return $jsonMap
} else {
Write-Host "⚠️ JSON 文件没有有效数据" -ForegroundColor Yellow
return @{}
}
}
catch {
Write-Host "❌ 解析 JSON 文件时出错: $_" -ForegroundColor Red
return @{}
}
}

function Save-CategoryMapToJson {
param(
[Parameter(Mandatory=$true)]
[hashtable]$CategoryMap,
[switch]$Force = $false
)

if ($CategoryMap.Count -eq 0 -and -not $Force) {
Write-Host "⚠️ 没有映射数据可保存" -ForegroundColor Yellow
return $false
}

try {
# 将 Hashtable 转换为有序对象以便美观输出
$orderedMap = [ordered]@{}
$CategoryMap.Keys | Sort-Object | ForEach-Object {
$orderedMap[$_] = $CategoryMap[$_]
}

$jsonContent = $orderedMap | ConvertTo-Json -Depth 10

# 添加注释和格式
$fullContent = @"
$jsonContent
"@

Set-Content -Path $script:jsonFilePath -Value $fullContent -Encoding UTF8
Write-Host "💾 已保存 $($CategoryMap.Count) 个映射到 $script:jsonFilePath" -ForegroundColor Green

return $true
}
catch {
Write-Host "❌ 保存 JSON 文件时出错: $_" -ForegroundColor Red
return $false
}
}

function Get-CategoryMap {
[CmdletBinding()]
param(
[switch]$Silent = $false
)
$script:VerboseOutput = -not $Silent
# 首先尝试从 YAML 加载
$yamlMap = Get-CategoryMapFromYaml

if ($yamlMap.Count -gt 0) {

if($script:VerboseOutput) {
Write-Host "✅ 成功从 _config.yml 加载分类映射" -ForegroundColor Green
}

# 检查 JSON 文件是否存在
$jsonMap = Get-CategoryMapFromJson

if ($jsonMap.Count -eq 0) {
# JSON 文件不存在或为空,创建新文件
Write-Host "📝 创建新的 JSON 映射文件..." -ForegroundColor Yellow
Save-CategoryMapToJson -CategoryMap $yamlMap | Out-Null
}

return $yamlMap
}
else {
# YAML 加载失败,尝试从 JSON 加载
Write-Host "⚠️ 无法从 _config.yml 加载映射,尝试 JSON 文件..." -ForegroundColor Yellow

$jsonMap = Get-CategoryMapFromJson

if ($jsonMap.Count -gt 0) {
Write-Host "✅ 从 JSON 文件成功加载分类映射" -ForegroundColor Green
return $jsonMap
}
else {
# 两者都失败,创建默认映射
Write-Host "❌ 无法从任何源加载分类映射" -ForegroundColor Red
Write-Host "📝 正在创建默认映射文件..." -ForegroundColor Yellow

$defaultMap = @{
'道经卷' = 'dao-scripture'
'法则篇' = 'principles'
'道演篇' = 'evolution'
'道境卷' = 'dao-state'
'道境之门' = 'gate'
'境界论述' = 'state-discussion'
'实修根本' = 'foundation'
'实修经' = 'scripture'
'实修理术' = 'methods'
'实践方向' = 'practice'
'哲学之道' = 'philosophy'
'科学之道' = 'science'
'技术之道' = 'technology'
'道祖之道' = 'daozu'
'道论' = 'discussion'
'参考' = 'reference'
'网站构建' = 'website-build'
}

# 创建 JSON 文件
Save-CategoryMapToJson -CategoryMap $defaultMap | Out-Null
Write-Host "📄 已创建默认映射文件,请根据实际情况修改" -ForegroundColor Green

return $defaultMap
}
}
}

Export-ModuleMember -Function Get-CategoryMap