github.com/archlabjp/eeslism-go@v0.0.0-20231109122333-4bb7bfcdf292/eeslism/eespre.go (about) 1 package eeslism 2 3 import ( 4 "bufio" 5 "fmt" 6 "io" 7 "os" 8 "path/filepath" 9 "strings" 10 11 "golang.org/x/exp/slices" 12 ) 13 14 /* 注釈文の除去 */ 15 16 // Eesprera removes comments from the input file. 17 func Eesprera(file string) string { 18 // 設定ファイルを開く 19 fi, err := os.Open(file) 20 if err != nil { 21 wd, _ := os.Getwd() 22 fmt.Printf(wd) 23 fmt.Printf("File not found '%s'\n", file) 24 os.Exit(1) 25 } 26 defer fi.Close() 27 28 // 注釈文の除去語の設定ファイルを作成 29 RET := strings.TrimSuffix(file, filepath.Ext(file)) 30 fb := new(strings.Builder) 31 32 scanner := bufio.NewScanner(fi) 33 34 // 各行を処理 35 for scanner.Scan() { 36 processedLine := processLine(scanner.Text()) 37 if processedLine != "" { 38 _, err := fb.WriteString(processedLine + "\n") 39 if err != nil { 40 panic(err) 41 } 42 } 43 } 44 45 if err := scanner.Err(); err != nil { 46 panic(err) 47 } 48 // var s string 49 // var c byte 50 // for scanner.Scan() { 51 // s = scanner.Text() 52 53 // if s == "!" { 54 // //改行するまで読み進める 55 // for _, err := fmt.Fscanf(fi, "%c", &c); err == nil && c != '\n'; _, err = fmt.Fscanf(fi, "%c", &c) { 56 // } 57 // } else { 58 // if s == " " { 59 // //全角スペースは半角に置き換える 60 // fmt.Fprint(fb, " \n") 61 // } else if s != "" { 62 // fmt.Fprintf(fb, " %s ", strings.TrimSpace(s)) 63 // } 64 65 // if s == ";" || strings.HasSuffix(s, ";") { 66 // fmt.Fprintln(fb) 67 // } else if s == "#" || strings.HasSuffix(s, "#") { 68 // fmt.Fprintln(fb) 69 // } else if s == "*" || strings.HasSuffix(s, "*") { 70 // fmt.Fprintln(fb) 71 // } else if s == "*debug" { 72 // DEBUG = true 73 // } else { 74 // fmt.Fprintln(fb) 75 // } 76 // } 77 // } 78 79 // fmt.Fprintln(fb, " ") 80 81 //互換性のために出力 82 fbo, err := os.Create(strings.Join([]string{RET, "bdata0.ewk"}, "")) 83 if err != nil { 84 fmt.Println("Error creating file: ", err) 85 } else { 86 fmt.Fprint(fbo, fb) 87 } 88 defer fbo.Close() 89 90 return fb.String() 91 } 92 93 func processLine(line string) string { 94 // "!"以降を削除 95 if index := strings.Index(line, "!"); index != -1 { 96 line = line[:index] 97 } 98 return line 99 } 100 101 /* ---------------------------------------------------------- */ 102 103 /* スケジュ-ルデ-タファイルの作成 */ 104 105 // Eespre creates a schedule data file. 106 // 入力: 107 // bdata0: コメント除去済みの入力テキスト 108 // 出力: 109 // (1) %s または %sn から始まる論理行を除いた入力テキスト -> bdata.ewk 110 // (2) %sから始まる論理行のみを収録したテキスト -> schtba.ewk 111 // (3) %snから始まる論理行のみを収録したテキスト -> schenma.ewk 112 // (4) WEEKデータセット -> week.ewk 113 func Eespre(bdata0 string, Ipath string, key *int) (string, string, string, string) { 114 fi := strings.NewReader(bdata0) //bdata0.ewk 相当 115 116 syspth := 0 117 syscmp := 0 118 119 Syscheck(fi, &syspth, &syscmp) 120 121 fb := new(strings.Builder) //bdata.ewk 相当 122 fs := new(strings.Builder) //schtba.ewk 相当 => %s を拾う 123 fsn := new(strings.Builder) //schenma.ewk 相当 => %sn を拾う 124 fw := new(strings.Builder) //week.ewk 相当 125 126 var st int 127 128 var section_marker = []string{"TITLE", "GDAT", "RUN", "PRINT", "SCHTB", "EXSRF", "PCM", 129 "WALL", "WINDOW", "SUNBRK", "ROOM", "RESI", "APPL", "VENT", "SYSCMP", "SYSPTH", "CONTL"} 130 131 // %s, %sn を先に分離しておく。 132 // 理由: 微妙な位置にある場合にうまく分離できない。 133 tokens := NewEeTokens(bdata0) 134 sb := new(strings.Builder) 135 for !tokens.IsEnd() { 136 137 line := tokens.GetLogicalLine() 138 if line[0] == "*" { 139 sb.WriteString("*\n") 140 line = line[1:] 141 } 142 143 if slices.Contains(section_marker, line[0]) { 144 sb.WriteString(line[0]) 145 sb.WriteString("\n") 146 line = line[1:] 147 } 148 149 if line[0] == "%s" { 150 for _, item := range line[1:] { 151 fmt.Fprintf(fs, "%s ", item) 152 } 153 fs.WriteString(";\n") 154 } else if line[0] == "%sn" { 155 for _, item := range line[1:] { 156 fmt.Fprintf(fsn, "%s ", item) 157 } 158 fsn.WriteString(";\n") 159 } else { 160 for _, item := range line { 161 fmt.Fprintf(sb, "%s ", item) 162 } 163 sb.WriteString(";\n") 164 } 165 } 166 167 // トークン分割 168 tokens = NewEeTokens(sb.String()) 169 for !tokens.IsEnd() { 170 171 s := tokens.GetToken() 172 if s == "\n" { 173 continue 174 } 175 176 // 壁体の材料定義リストを指定 177 if strings.HasPrefix(s, "wbmlist=") { 178 if st = strings.IndexRune(s, ';'); st != -1 { 179 s = s[:st+1] 180 } else { 181 fmt.Fscanf(fi, "%*s") 182 } 183 184 Fbmlist = s[8:] 185 } else if s == "WEEK" { 186 *key = 1 187 line := tokens.GetLogicalLine() 188 for _, item := range line { 189 fmt.Fprintf(fw, "%s ", item) 190 } 191 fw.WriteByte(';') 192 } else if s == "*" { 193 fb.WriteString("*\n") 194 } else { 195 fb.WriteString(s) 196 line := tokens.GetLogicalLine() 197 198 for _, item := range line { 199 fmt.Fprintf(fb, " %s", item) 200 } 201 202 fb.WriteString(" ; \n") 203 } 204 } 205 206 fmt.Fprintln(fb, "") 207 //fb.Seek(0, 1) 208 209 fmt.Fprintln(fb, " *") 210 fmt.Fprintln(fw, "") 211 fmt.Fprintln(fs, "*") 212 fmt.Fprintln(fsn, "*") 213 214 // ファイルに保存する(互換性のため) 215 fbo, err := os.Create(strings.Join([]string{Ipath, "bdata.ewk"}, "")) 216 if err != nil { 217 fmt.Println("Error creating file: ", err) 218 } else { 219 fmt.Fprint(fbo, fb) 220 defer fbo.Close() 221 } 222 223 // SCHTBデータセット 224 fso, err := os.Create(strings.Join([]string{Ipath, "schtba.ewk"}, "")) 225 if err != nil { 226 fmt.Println("Error creating file: ", err) 227 } else { 228 fmt.Fprint(fso, fs) 229 defer fso.Close() 230 } 231 232 // SCHNMAデータセット 233 fsno, err := os.Create(strings.Join([]string{Ipath, "schnma.ewk"}, "")) 234 if err != nil { 235 fmt.Println("Error creating file: ", err) 236 } else { 237 fmt.Fprint(fsno, fsn) 238 defer fsno.Close() 239 } 240 241 // WEEKデータセット 242 fwo, err := os.Create(strings.Join([]string{Ipath, "week.ewk"}, "")) 243 if err != nil { 244 fmt.Println("Error creating file: ", err) 245 } else { 246 fmt.Fprint(fwo, fw) 247 defer fwo.Close() 248 } 249 250 return fb.String(), fs.String(), fsn.String(), fw.String() 251 } 252 253 /******************************************************************/ 254 255 func Syscheck(fi io.ReadSeeker, syspth *int, syscmp *int) { 256 var s string 257 for _, err := fmt.Fscanf(fi, "%s", &s); err == nil; _, err = fmt.Fscanf(fi, "%s", &s) { 258 if s == "SYSPTH" { 259 *syspth = 1 260 } else if s == "SYSCMP" { 261 *syscmp = 1 262 } 263 } 264 fi.Seek(0, 0) 265 }