// Copyright 2013 Unknwon//// Licensed under the Apache License, Version 2.0 (the "License"): you may// not use this file except in compliance with the License. You may obtain// a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the// License for the specific language governing permissions and limitations// under the License.package goconfigimport ( "bytes" "io" "os" "strings")// Write spaces around "=" to look better.var PrettyFormat = true// SaveConfigData writes configuration to a writerfunc SaveConfigData(c *ConfigFile, out io.Writer) (err error) { equalSign := "=" if PrettyFormat { equalSign = " = " } buf := bytes.NewBuffer(nil) for _, section := range c.sectionList { // Write section comments. if len(c.GetSectionComments(section)) > 0 { if _, err = buf.WriteString(c.GetSectionComments(section) + LineBreak); err != nil { return err } } if section != DEFAULT_SECTION { // Write section name. if _, err = buf.WriteString("[" + section + "]" + LineBreak); err != nil { return err } } for _, key := range c.keyList[section] { if key != " " { // Write key comments. if len(c.GetKeyComments(section, key)) > 0 { if _, err = buf.WriteString(c.GetKeyComments(section, key) + LineBreak); err != nil { return err } } keyName := key // Check if it's auto increment. if keyName[0] == '#' { keyName = "-" } //[SWH|+]:支持键名包含等号和冒号 if strings.Contains(keyName, `=`) || strings.Contains(keyName, `:`) { if strings.Contains(keyName, "`") { if strings.Contains(keyName, `"`) { keyName = `"""` + keyName + `"""` } else { keyName = `"` + keyName + `"` } } else { keyName = "`" + keyName + "`" } } value := c.data[section][key] // In case key value contains "`" or "\"". if strings.Contains(value, "`") { if strings.Contains(value, `"`) { value = `"""` + value + `"""` } else { value = `"` + value + `"` } } // Write key and value. if _, err = buf.WriteString(keyName + equalSign + value + LineBreak); err != nil { return err } } } // Put a line between sections. if _, err = buf.WriteString(LineBreak); err != nil { return err } } if _, err := buf.WriteTo(out); err != nil { return err } return nil}// SaveConfigFile writes configuration file to local file systemfunc SaveConfigFile(c *ConfigFile, filename string) (err error) { // Write configuration file by filename. var f *os.File if f, err = os.Create(filename); err != nil { return err } if err := SaveConfigData(c, f); err != nil { return err } return f.Close()}
// Copyright 2013 Unknwon
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package goconfig
import (
"bytes"
"io"
"os"
"strings"
)
// Write spaces around "=" to look better.
var PrettyFormat = true
// SaveConfigData writes configuration to a writer
func SaveConfigData(c *ConfigFile, out io.Writer) (err error) {
equalSign := "="
if PrettyFormat {
equalSign = " = "
}
buf := bytes.NewBuffer(nil)
for _, section := range c.sectionList {
// Write section comments.
if len(c.GetSectionComments(section)) > 0 {
if _, err = buf.WriteString(c.GetSectionComments(section) + LineBreak); err != nil {
return err
}
}
if section != DEFAULT_SECTION {
// Write section name.
if _, err = buf.WriteString("[" + section + "]" + LineBreak); err != nil {
return err
}
}
for _, key := range c.keyList[section] {
if key != " " {
// Write key comments.
if len(c.GetKeyComments(section, key)) > 0 {
if _, err = buf.WriteString(c.GetKeyComments(section, key) + LineBreak); err != nil {
return err
}
}
keyName := key
// Check if it's auto increment.
if keyName[0] == '#' {
keyName = "-"
}
//[SWH|+]:支持键名包含等号和冒号
if strings.Contains(keyName, `=`) || strings.Contains(keyName, `:`) {
if strings.Contains(keyName, "`") {
if strings.Contains(keyName, `"`) {
keyName = `"""` + keyName + `"""`
} else {
keyName = `"` + keyName + `"`
}
} else {
keyName = "`" + keyName + "`"
}
}
value := c.data[section][key]
// In case key value contains "`" or "\"".
if strings.Contains(value, "`") {
if strings.Contains(value, `"`) {
value = `"""` + value + `"""`
} else {
value = `"` + value + `"`
}
}
// Write key and value.
if _, err = buf.WriteString(keyName + equalSign + value + LineBreak); err != nil {
return err
}
}
}
// Put a line between sections.
if _, err = buf.WriteString(LineBreak); err != nil {
return err
}
}
if _, err := buf.WriteTo(out); err != nil {
return err
}
return nil
}
// SaveConfigFile writes configuration file to local file system
func SaveConfigFile(c *ConfigFile, filename string) (err error) {
// Write configuration file by filename.
var f *os.File
if f, err = os.Create(filename); err != nil {
return err
}
if err := SaveConfigData(c, f); err != nil {
return err
}
return f.Close()
}