115 lines
2.2 KiB
Go
115 lines
2.2 KiB
Go
package excelLanguage
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
assetMeta "language-change/asset-meta"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type ExcelLanguage struct {
|
|
AssetFolder string
|
|
ExcelDataEntry *assetMeta.DataEntry
|
|
ExcelFileEntry *assetMeta.FileEntry
|
|
}
|
|
|
|
func NewExcelLanguage(assetFolder string, dataEntry *assetMeta.DataEntry, fileEntry *assetMeta.FileEntry) *ExcelLanguage {
|
|
return &ExcelLanguage{
|
|
AssetFolder: assetFolder,
|
|
ExcelDataEntry: dataEntry,
|
|
ExcelFileEntry: fileEntry,
|
|
}
|
|
}
|
|
|
|
func (a *ExcelLanguage) Unmarshal(rows []LanguageRow) ([]byte, error) {
|
|
buf := new(bytes.Buffer)
|
|
|
|
buf.WriteByte(0)
|
|
if err := writeI8Varint(buf, int8(len(rows))); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, row := range rows {
|
|
rowData, err := row.Unmarshal()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, err := buf.Write(rowData); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
func (a *ExcelLanguage) Parse() ([]LanguageRow, error) {
|
|
excelPath := filepath.Join(a.AssetFolder, a.ExcelFileEntry.FileByteName+".bytes")
|
|
|
|
f, err := os.Open(excelPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
|
|
if _, err := f.Seek(int64(a.ExcelDataEntry.Offset), io.SeekStart); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
buffer := make([]byte, a.ExcelDataEntry.Size)
|
|
if _, err := io.ReadFull(f, buffer); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
reader := bytes.NewReader(buffer)
|
|
|
|
_, _ = reader.ReadByte() // skip first byte
|
|
count, err := readI8Varint(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rows := make([]LanguageRow, 0, count)
|
|
for i := 0; i < count; i++ {
|
|
bitmask, err := reader.ReadByte()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
row := LanguageRow{}
|
|
|
|
if bitmask&(1<<0) != 0 {
|
|
s, err := readString(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
row.Area = &s
|
|
}
|
|
if bitmask&(1<<1) != 0 {
|
|
t, err := reader.ReadByte()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
row.Type = &t
|
|
}
|
|
if bitmask&(1<<2) != 0 {
|
|
arr, err := readStringArray(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
row.LanguageList = arr
|
|
}
|
|
if bitmask&(1<<3) != 0 {
|
|
s, err := readString(reader)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
row.DefaultLanguage = &s
|
|
}
|
|
|
|
rows = append(rows, row)
|
|
}
|
|
|
|
return rows, nil
|
|
}
|