예제 #1
0
        // 변환 및 저장
        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[] { "작업이 완료됐습니다." });
        }
예제 #2
0
        // 변환 및 저장
        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 });
        }
예제 #3
0
 /*
  * 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));
 }