// 변환 및 저장 public void DoReplace() { string replacersJson = GetReplacersJson(); string[][] replacers = GetReplacers(replacersJson); string filesString = Script("getFiles"); if (filesString == null) { Script("alert", new object[] { "파일이 없습니다." }); return; } string[] files = filesString.Split('?'); foreach (string file in files) { Encoding encoding = BOM.DetectEncoding(file); string[] replaced = GetReplaced(file, encoding, replacers); if (!replaced[0].Equals(replaced[2])) { StreamWriter sw = null; try { // 원본 파일의 인코딩대로 저장 sw = new StreamWriter(file, false, encoding); sw.Write(replaced[2]); } catch (Exception e) { Console.WriteLine(e); } finally { if (sw != null) { sw.Close(); } } } } // 변환했으면 변환 문자열 쌍을 기억해둠 SaveDefaultReplacers(replacersJson); Script("alert", new object[] { "작업이 완료됐습니다." }); }
// 변환 및 저장 public void DoReplace() { string replacersJson = GetReplacersJson(); string[] replacer = GetReplacers(replacersJson)[0]; List <Smi> originRange = new SmiFile().FromTxt(replacer[0]).body; List <Smi> targetRange = new SmiFile().FromTxt(replacer[1]).body; bool complete = true; Dictionary <int, int> matches = new Dictionary <int, int>(); { int i = 0, j = 0; for (; j < targetRange.Count; j++) { if (targetRange[j].syncType != SyncType.frame) { continue; } while (i < originRange.Count && originRange[i].start < targetRange[j].start) { i++; } if (i >= originRange.Count) { break; } if (originRange[i].syncType != SyncType.frame) { // 목표 화면 싱크가 원본 화면 싱크와 겹치지 않으면 -1 matches.Add(j, -1); complete = false; continue; } if (originRange[i].start == targetRange[j].start) { // 목표 화면 싱크가 원본 화면 싱크와 겹치는 경우 matches.Add(j, i); } else { // 목표 화면 싱크가 원본 화면 싱크와 겹치지 않으면 -1 matches.Add(j, -1); complete = false; } } } string filesString = Script("getFiles").ToString(); if (filesString.Length == 0) { Script("alert", new object[] { "파일이 없습니다." }); return; } string[] files = filesString.Split('?'); int success = 0; List <string> skips = new List <string>(); foreach (string file in files) { Encoding encoding = BOM.DetectEncoding(file); bool isChanged = false; SmiFile originSmi = null; int i = 0, j = 0, shift = 0; StreamReader sr = null; try { sr = new StreamReader(file, encoding); string origin = sr.ReadToEnd(); originSmi = new SmiFile().FromTxt(origin); for (; i < originSmi.body.Count; i++) { if (originSmi.body[i].text.Equals(originRange[0].text)) { shift = originSmi.body[i].start - originRange[0].start; bool isCorrect = true; for (; j < originRange.Count; j++) { if (!originSmi.body[i + j].text.Equals(originRange[j].text)) { isCorrect = false; break; } if ((originSmi.body[i + j].syncType == SyncType.normal) && (originSmi.body[i + j].start != originRange[j].start + shift)) { isCorrect = false; break; } } if (isCorrect) { isChanged = true; break; } } } } catch { } finally { if (sr != null) { sr.Close(); } } if (isChanged) { SmiFile targetSmi = new SmiFile() { header = originSmi.header, footer = originSmi.footer }; for (int k = 0; k < i; k++) { targetSmi.body.Add(originSmi.body[k]); } for (int k = 0; k < targetRange.Count; k++) { if (targetRange[k].syncType == SyncType.frame && matches[k] >= 0) { targetSmi.body.Add(new Smi() { start = originSmi.body[i + matches[k]].start , syncType = targetRange[k].syncType , text = targetRange[k].text }); } else { targetSmi.body.Add(new Smi() { start = targetRange[k].start + shift , syncType = targetRange[k].syncType , text = targetRange[k].text }); } } for (int k = i + j; k < originSmi.body.Count; k++) { targetSmi.body.Add(originSmi.body[k]); } StreamWriter sw = null; try { // 원본 파일의 인코딩대로 저장 sw = new StreamWriter(file, false, encoding); sw.Write(targetSmi.ToTxt()); success++; } catch (Exception e) { Console.WriteLine(e); } finally { if (sw != null) { sw.Close(); } } } else { skips.Add(file); } } // 변환했으면 변환 문자열 쌍을 기억해둠 SaveDefaultReplacers(replacersJson); string msg = "파일 " + files.Length + "개 중 " + success + "개의 작업이 완료됐습니다."; if (!complete) { msg += "\n화면 싱크를 조정할 부분이 있습니다."; } if (skips.Count > 0) { msg += "\n제외 파일"; foreach (string file in skips) { msg += "\n" + file; } } Script("alert", new object[] { msg }); }
/* * string file: 파일 경로 * string[][2] replacers: 문자열 쌍 * return string[4]: 원본 / 원본 미리보기 / 결과 / 결과 미리보기 * ... 사실 string 4개짜리 class 만들기 귀찮아서 string[4]로 처리한 거임 */ public string[] GetReplaced(string file, string[][] replacers) { return(GetReplaced(file, BOM.DetectEncoding(file), replacers)); }