Files
耗子andClaude Fable 5.1 e596f3b4bf refactor(webserver): 抽出共享配置语法树,nginx 改为手写解析器
- 新增 pkg/webserver/conf:指令、参数(含引号风格)、子块与注释的统一模型,
  查询、修改与排序方法各方言共用,方法对 nil 安全便于链式取值
- nginx 去掉 gonginx,自写分词与解析:分号指令、花括号块、引号转义、行尾注释、
  lua 块原样保留;vhost 主文件仍就地修改保留用户手写指令,片段改为构建语法树后渲染,
  map 迭代改为排序输出,缺失 ssl_protocols 时不再空指针
- apache、OLS、caddy 的解析器改为产出共享语法树,各自只保留分词与渲染
- nginx 应用的 stream 配置读写同步迁移

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-14 21:17:53 +08:00

32 lines
765 B
Go

package conf
import "slices"
// Sort 按 key 稳定排序指令,注释与空行吸附到其后的指令一起移动,末尾孤立的注释保留在最后
func Sort(nodes []Node, key func(*Directive) int) []Node {
type group struct {
lead []Node
main *Directive
key int
}
var groups []group
var pending []Node
for _, n := range nodes {
d, ok := n.(*Directive)
if !ok {
pending = append(pending, n)
continue
}
groups = append(groups, group{lead: pending, main: d, key: key(d)})
pending = nil
}
slices.SortStableFunc(groups, func(a, b group) int { return a.key - b.key })
out := make([]Node, 0, len(nodes))
for _, g := range groups {
out = append(out, g.lead...)
out = append(out, g.main)
}
return append(out, pending...)
}