OSDN Git Service

This commit was manufactured by cvs2svn to create branch 'Bb62'.
[gikonavigoeson/gikonavi.git] / ReplaceDataModule.pas
1 unit ReplaceDataModule;
2
3 interface
4
5 uses
6   SysUtils, Classes;
7
8 type
9   TReplaceDM = class(TDataModule)
10     procedure DataModuleCreate(Sender: TObject);
11     procedure DataModuleDestroy(Sender: TObject);
12   private
13     { Private \90é\8c¾ }
14     //! \92u\8a·\83\8a\83X\83g
15     FReplaceList: TList;
16   public
17     { Public \90é\8c¾ }
18     procedure LoadFromFile(const filePath: String);
19     function Replace(const source: String): String;
20   end;
21   TReplace = class(TObject)
22   private
23     FTarget: String;
24     FReplace: String;
25   public
26     constructor Create(const line: String);
27     property Target: String read FTarget write FTarget;
28     property Replace: String read FReplace write FReplace;
29   end;
30
31 var
32   ReplaceDM: TReplaceDM;
33
34 implementation
35
36 uses
37     MojuUtils, Dialogs, StrUtils;
38
39
40 {$R *.dfm}
41
42 //! \83G\83X\83P\81[\83v\95\8e\9a\95\9c\8c³\8f\88\97\9d
43 function UnEscape(const source: String): String;
44 begin
45     // \90Ý\92è\83t\83@\83C\83\8b\82É\82»\82Ì\82Ü\82Ü\8f\91\82­\82Æ\90Ý\92è\83t\83@\83C\83\8b\8e©\91Ì\82ª\8dí\8f\9c\82³\82ê\82é\82Ì\82ð
46     // \96h\82®\82½\82ß\82É\89º\8bL\82Ì\95\8e\9a\82ð\83G\83X\83P\81[\83v\82Å\82«\82é\82æ\82¤\82É\82·\82é
47     // \. \( \) \{ \} \/ \" \\
48     Result := MojuUtils.CustomStringReplace(source, '\.', '.');
49     Result := MojuUtils.CustomStringReplace(Result, '\(', '(');
50     Result := MojuUtils.CustomStringReplace(Result, '\)', ')');
51     Result := MojuUtils.CustomStringReplace(Result, '\{', '{');
52     Result := MojuUtils.CustomStringReplace(Result, '\}', '}');
53     Result := MojuUtils.CustomStringReplace(Result, '\"', '"');
54     Result := MojuUtils.CustomStringReplace(Result, '\/', '/');
55     Result := MojuUtils.CustomStringReplace(Result, '\\', '\');
56 end;
57
58 //! \83R\83\93\83X\83g\83\89\83N\83^
59 procedure TReplaceDM.DataModuleCreate(Sender: TObject);
60 begin
61     // \92u\8a·\91Î\8fÛ\95\8e\9a\97ñ\95Û\8e\9d\83\8a\83X\83g\82Ì\90\90¬
62     FReplaceList := TList.Create;
63 end;
64 //! \83f\83X\83g\83\89\83N\83^
65 procedure TReplaceDM.DataModuleDestroy(Sender: TObject);
66 var
67     i: Integer;
68 begin
69     if (FReplaceList <> nil) then begin
70         // \83\8a\83X\83g\82Ì\92\86\90g\82Ìfree\82ð\8cÄ\82Ñ\8fo\82·
71         for i := FReplaceList.Count - 1 downto 0 do begin
72             TObject(FReplaceList.Items[i]).Free;
73         end;
74         // \83\8a\83X\83g\82ð\8dí\8f\9c\82·\82é
75         FReplaceList.Clear;
76         FReplaceList.Capacity := 0;
77         FreeAndNil(FReplaceList);
78     end;
79 end;
80 //! \83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý\8f\88\97\9d
81 procedure TReplaceDM.LoadFromFile(const filePath: String);
82 var
83     fileStrings: TStringList;
84     i: Integer;
85     rep: TReplace;
86     ignored: Boolean;
87 begin
88     // \83t\83@\83C\83\8b\82Ì\91\8dÝ\83`\83F\83b\83N
89     if (FileExists(filePath)) then begin
90         ignored := False;
91         fileStrings := TStringList.Create;
92         fileStrings.LoadFromFile(filePath);
93         try
94             // \82·\82×\82Ä\82Ì\8ds\82Ì\82Ü\82í\82·
95             for i := 0 to fileStrings.Count - 1 do begin
96                 rep := TReplace.Create(fileStrings[i]);
97                 // <> \82ª\8aÜ\82Ü\82ê\82Ä\82¢\82é\82©\83`\83F\83b\83N
98                 if (AnsiPos('<>', rep.Target) > 0) or
99                     (AnsiPos('<>', rep.Replace) > 0) then begin
100                     ignored := True;
101                 end else begin
102                     FReplaceList.Add(rep);
103                 end;
104             end;
105         finally
106             fileStrings.Free;
107         end;
108         if (ignored) then begin
109             ShowMessage('<>\82ð\8aÜ\82Þ\95\8e\9a\97ñ\82ð/\82É\92u\8a·\82·\82é\82±\82Æ\82Í\82Å\82«\82Ü\82¹\82ñ\81B'#13#10'\90Ý\92è\83t\83@\83C\83\8b\82ð\8am\94F\82µ\82Ä\82­\82¾\82³\82¢\81B');
110         end;
111     end;
112 end;
113
114 //! \92u\8a·\8f\88\97\9d
115 function TReplaceDM.Replace(const source: String): String;
116 var
117     i: Integer;
118     rep: TReplace;
119 begin
120     Result := source;
121     // nil\82Å\82 \82é\82±\82Æ\82Í\96³\82¢\82ª\94O\82Ì\82½\82ß
122     if (FReplaceList <> nil) then begin
123         for i := FReplaceList.Count - 1 downto 0 do begin
124             rep := TReplace(FReplaceList.Items[i]);
125             Result := MojuUtils.CustomStringReplace(Result, rep.Target, rep.Replace);
126         end;
127     end;
128 end;
129 //! \83R\83\93\83X\83g\83\89\83N\83^
130 constructor TReplace.Create(const line: String);
131 begin
132     Replace := '';
133     // 1\8ds\82ð\83^\83u\82Å\8bæ\90Ø\82é
134     if (AnsiPos(#9, line) > 0) then begin
135         Target  := Copy(line, 0, AnsiPos(#9, line) - 1);
136         Replace := Copy(line, AnsiPos(#9, line) + 1, Length(line));
137     end else begin
138         Target := line;
139     end;
140     // Target\82Ì\83G\83X\83P\81[\83v\82ð\8c³\82Ì\95\8e\9a\82É\96ß\82·
141     Target := UnEscape(Target);
142     // replace\82ª''\82Ì\8e\9e\82Í\81A\93¯\82\95\8e\9a\90\94\82Ì\83X\83y\81[\83X\82É\90Ý\92è
143     if (Replace = '') then begin
144         Replace := StrUtils.DupeString(' ', Length(Target));
145     end;
146 end;
147
148 end.