OSDN Git Service

日本語入力を可能にした
[beyond-jp/beyond-jp.git] / TRANS.PAS
1 function FindWord(var cur : integer; var cat : integer; var index : integer; var word : Str16) : boolean;
2 var i, j, s, l, fs, fl : integer;
3 begin
4   cat := -1;
5   index := -1;
6   word := '';
7   fs := 0;
8   fl := 0;
9
10   if ('A' <= Line[0]) and (Line[0] <= 'z') then
11     FindWord := False;
12
13   for s := cur to Length(Line) do
14   begin
15     { \90\94\8e\9a(\96¼\8e\8c)\82©? }
16     if (('0' <= Line[s]) and (Line[s] <= '9')) or (('A' <= Line[s]) and (Line[s] <= 'z')) then
17     begin
18       cur := s;
19       cat := 1;
20       while (('0' <= Line[cur]) and (Line[cur] <= '9')) or (('A' <= Line[cur]) and (Line[cur] <= 'z')) do
21       begin
22         word := word + Line[cur];
23         cur := cur + 1;
24       end;
25       FindWord := True;
26       exit;
27     end;
28
29     { \93®\8e\8c\82©? }
30     for i := 0 to VMax do
31     begin
32       for j := 1 to 5 do
33       begin
34         l := Length(d[i, j]);
35         if l > fl then
36         begin
37           if Copy(Line, s, l) = d[i, j] then
38           begin
39             cat := 0;
40             index := i;
41             word := v[i, 1];
42             fs := s;
43             fl := l;
44           end;
45         end;
46       end;
47     end;
48
49     { \96¼\8e\8c\82©? }
50     for i := 0 to NMax do
51     begin
52       for j := 1 to 5 do
53       begin
54         l := Length(m[i, j]);
55         if l > fl then
56         begin
57           if Copy(Line, s, l) = m[i, j] then
58           begin
59             cat := 1;
60             index := i;
61             word := n[i, 1];
62             fs := s;
63             fl := l;
64           end;
65         end;
66       end;
67     end;
68
69     { \8f\95\8e\8c\81u\82É\81v\82©? }
70     l := Length('\82É');
71     if (l > fl) and (Copy(Line, s, l) = '\82É') then
72     begin
73       cat := 2;
74       word := '';
75       fs := s;
76       fl := l;
77     end;
78
79     { \8f\95\8e\8c\81u\82Å\81v\82©? }
80     l := Length('\82Å');
81     if (l > fl) and (Copy(Line, s, l) = '\82Å') then
82     begin
83       cat := 2;
84       word := 'with';
85       fs := s;
86       fl := l;
87     end;
88
89     { \92P\8cê\82ª\8c©\82Â\82©\82Á\82½ }
90     if fs > 0 then
91     begin
92       cur := fs + fl;
93       FindWord := True;
94       exit;
95     end;
96   end;
97
98   { \92P\8cê\82ª\8c©\82Â\82©\82ç\82È\82©\82Á\82½ }
99   FindWord := False;
100   exit;
101 end;
102
103 procedure ParseJ(var verb : Str16; var noun1 : Str16; var prepos : Str16; var noun2 : Str16);
104 var cur, cat, index : integer;
105 var word : Str16;
106 begin
107   verb := '';
108   noun1 := '';
109   prepos := '';
110   noun2 := '';
111
112   cur := 1;
113
114   if not FindWord(cur, cat, index, word) then
115     exit;
116   if cat = 0 then
117   begin
118     verb := word;
119     exit;
120   end;
121   if cat = 1 then
122     noun1 := word;
123
124   if not FindWord(cur, cat, index, word) then
125     exit;
126   if cat = 0 then
127   begin
128     verb := word;
129     exit;
130   end;
131   if cat = 1 then
132     noun2 := word;
133   if cat = 2 then
134   begin
135     prepos := word;
136     noun2 := noun1;
137     noun1 := '';
138   end;
139
140   if not FindWord(cur, cat, index, word) then
141     exit;
142   if cat = 0 then
143   begin
144     if (noun2 <> '') and (prepos = '') then
145       prepos := prep[index];
146     verb := word;
147     exit;
148   end;
149   if cat = 1 then
150     noun1 := word;
151   if cat = 2 then
152     prepos := word;
153
154   if not FindWord(cur, cat, index, word) then
155     exit;
156   if cat = 0 then
157   begin
158     if prepos = '' then
159       prepos := prep[index];
160     verb := word;
161   end;
162 end;
163
164 procedure SayJ(var message : Str16);
165 var i : integer;
166 begin
167   message := '';
168   i := Pos(d[31,1], Line);
169   if i <= 0 then
170     exit;
171
172   message := Copy(Line, 1, i - 1);
173   if (message = '\83P\83\89\83q\83\88\83`\83~') or (message = '\83P\83\89\83\83\88\83`\83~') or (message = '\82¯\82ç\82Ð\82æ\82¿\82Ý') or (message = '\82¯\82ç\82Р\82æ\82¿\82Ý') then
174     message := 'nepo egassap'
175   else if message = '\82±\82ñ\82É\82¿\82Í' then
176     message := 'hello'
177   else if message = '\82³\82æ\82¤\82È\82ç' then
178     message := 'bye';
179 end;
180
181 procedure Translate;
182 var message, verb, noun1, prepos, noun2 : Str16;
183 begin
184   SayJ(message);
185   if message <> '' then
186   begin
187     Line := 'say ' + message;
188     exit;
189   end;
190
191   ParseJ(verb, noun1, prepos, noun2);
192
193   if verb = '' then
194   begin
195     if noun1 <> '' then
196       Line := noun1;
197     exit;
198   end;
199
200   if noun2 <> '' then
201   begin
202     Line := verb + ' ' + noun1 + ' ' + prepos + ' ' + noun2;
203     exit;
204   end;
205
206   if noun1 <> '' then
207   begin
208     Line := verb + ' ' + noun1;
209     exit;
210   end;
211
212   Line := verb;
213 end;