126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package nginx
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	components "github.com/1Panel-dev/1Panel/backend/utils/nginx/components"
 | |
| 	"io/ioutil"
 | |
| 	"sort"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	//NoIndentStyle default style
 | |
| 	NoIndentStyle = &Style{
 | |
| 		SortDirectives: false,
 | |
| 		StartIndent:    0,
 | |
| 		Indent:         0,
 | |
| 	}
 | |
| 
 | |
| 	//IndentedStyle default style
 | |
| 	IndentedStyle = &Style{
 | |
| 		SortDirectives: false,
 | |
| 		StartIndent:    0,
 | |
| 		Indent:         4,
 | |
| 	}
 | |
| 
 | |
| 	//NoIndentSortedStyle default style
 | |
| 	NoIndentSortedStyle = &Style{
 | |
| 		SortDirectives: true,
 | |
| 		StartIndent:    0,
 | |
| 		Indent:         0,
 | |
| 	}
 | |
| 
 | |
| 	//NoIndentSortedSpaceStyle default style
 | |
| 	NoIndentSortedSpaceStyle = &Style{
 | |
| 		SortDirectives:    true,
 | |
| 		SpaceBeforeBlocks: true,
 | |
| 		StartIndent:       0,
 | |
| 		Indent:            0,
 | |
| 	}
 | |
| )
 | |
| 
 | |
| type Style struct {
 | |
| 	SortDirectives    bool
 | |
| 	SpaceBeforeBlocks bool
 | |
| 	StartIndent       int
 | |
| 	Indent            int
 | |
| }
 | |
| 
 | |
| func NewStyle() *Style {
 | |
| 	style := &Style{
 | |
| 		SortDirectives: false,
 | |
| 		StartIndent:    0,
 | |
| 		Indent:         4,
 | |
| 	}
 | |
| 	return style
 | |
| }
 | |
| 
 | |
| func (s *Style) Iterate() *Style {
 | |
| 	newStyle := &Style{
 | |
| 		SortDirectives:    s.SortDirectives,
 | |
| 		SpaceBeforeBlocks: s.SpaceBeforeBlocks,
 | |
| 		StartIndent:       s.StartIndent + s.Indent,
 | |
| 		Indent:            s.Indent,
 | |
| 	}
 | |
| 	return newStyle
 | |
| }
 | |
| 
 | |
| func DumpDirective(d components.IDirective, style *Style) string {
 | |
| 	var buf bytes.Buffer
 | |
| 
 | |
| 	if style.SpaceBeforeBlocks && d.GetBlock() != nil {
 | |
| 		buf.WriteString("\n")
 | |
| 	}
 | |
| 	buf.WriteString(fmt.Sprintf("%s%s", strings.Repeat(" ", style.StartIndent), d.GetName()))
 | |
| 	if len(d.GetParameters()) > 0 {
 | |
| 		buf.WriteString(fmt.Sprintf(" %s", strings.Join(d.GetParameters(), " ")))
 | |
| 	}
 | |
| 	if d.GetBlock() == nil {
 | |
| 		if d.GetName() != "" {
 | |
| 			buf.WriteRune(';')
 | |
| 			buf.WriteString(" ")
 | |
| 		}
 | |
| 		if d.GetComment() != "" {
 | |
| 			buf.WriteString(d.GetComment())
 | |
| 		}
 | |
| 	} else {
 | |
| 		buf.WriteString(" {")
 | |
| 		if d.GetComment() != "" {
 | |
| 			buf.WriteString(" ")
 | |
| 			buf.WriteString(d.GetComment())
 | |
| 		}
 | |
| 		buf.WriteString("\n")
 | |
| 		buf.WriteString(DumpBlock(d.GetBlock(), style.Iterate()))
 | |
| 		buf.WriteString(fmt.Sprintf("\n%s}", strings.Repeat(" ", style.StartIndent)))
 | |
| 	}
 | |
| 	return buf.String()
 | |
| }
 | |
| 
 | |
| func DumpBlock(b components.IBlock, style *Style) string {
 | |
| 	var buf bytes.Buffer
 | |
| 
 | |
| 	directives := b.GetDirectives()
 | |
| 	if style.SortDirectives {
 | |
| 		sort.SliceStable(directives, func(i, j int) bool {
 | |
| 			return directives[i].GetName() < directives[j].GetName()
 | |
| 		})
 | |
| 	}
 | |
| 
 | |
| 	for i, directive := range directives {
 | |
| 		buf.WriteString(DumpDirective(directive, style))
 | |
| 		if i != len(directives)-1 {
 | |
| 			buf.WriteString("\n")
 | |
| 		}
 | |
| 	}
 | |
| 	return buf.String()
 | |
| }
 | |
| 
 | |
| func DumpConfig(c *components.Config, style *Style) string {
 | |
| 	return DumpBlock(c.Block, style)
 | |
| }
 | |
| 
 | |
| func WriteConfig(c *components.Config, style *Style) error {
 | |
| 	return ioutil.WriteFile(c.FilePath, []byte(DumpConfig(c, style)), 0644)
 | |
| }
 | 
