Thảo luận thêm về Bộ hỗ trợ gõ tiếng Việt bằng ngôn ngữ lập trình Pascal
Nguyễn Hoành (
Trong bài viết 'Hỗ trợ gõ tiếng Việt bằngngôn ngữ lập trình Pascal' của tác giả Đỗ
Hồng Ngọc trên tạp chí Tinhọc & Nhà trường số tháng 12 năm 2001 có đề cập đến vấn đề
gõ tiếng Việtdưới môi trường DOS. Trong bài viết này, tác giả đã nêu lên một cách có
hệthống các thành phần mà một chương trình gõ tiếng Việt cần phải có. Tuy nhiêntrong bài
viết có một số chỗ chưa được chi tiết như chưa đề cập đến thủ tụcNewInt09, tải phông chữ
lên bộ nhớ, làm cho độc giả chưa thể tạo được mộtchương trình gõ tiếng Việt hoàn chỉnh.
Tôi xin đề cập lại vấn đề này, và nhìnnhận dưới góc độ chi tiết hơn.
Hoàn toàn đi theo hướng mà tác giả Đỗ Hồng Ngọc đãnêu, tôi xin nêu lên thư viện
KeyVnTrs có chứa các mô đun tải phông chữ Việt,thay đổi ngắt cứng 09h. Thư viện
KeyVnTrs có các môđun chính như sau:
procedure KhoiTaoGoTelex -Khởi tạo và cài đặt phần gõ tiếng Việt.
procedure LoaiBoGoTelex -Trả lại kiểu gõ thông thường cho hệ thống.
functionTaiPhongTuTep(TenTep: string): boolean - Tải phông chữ việt (phông người
sửdụng định nghĩa) từ tệp.
procedure LoaiBoPhong - Loạibỏ tác dụng của phông chữ người sử dụng định nghĩa.
Thư viện KeyVnTrs sử dụngbảng mã TCVN3 - Với bảng mã các chữ cần quan tâm như
sau:
A= 65 E= 69 I= 73 O= 79 U= 85 Y= 89 Â=162 Ă=161 Ê=163 Ô=164 Ơ=165 Ư=166
a= 97 e=101 i=105 o=111 u=117 y=121 â=169 ă=168 ê=170 ô=171 ơ=172 ư=173
á=184 é=208 í=221 ó=227 ú=243 ý=253 ấ=202 ắ=190 ế=213 ố=232 ớ=237 ứ=248
à=181 è=204 ì=215 ò=223 ù=239 ỳ=250 ầ=199 ằ=187 ề=210 ồ=229 ờ=234 ừ=245
ả=182 ẻ=206 ỉ=216 ỏ=225 ủ=241 ỷ=251 ẩ=200 ẳ=188 ể=211 ổ=230 ở=235 ử=246
ã=183 ẽ=207 ĩ=220 õ=226 ũ=242 ỹ=252 ẫ=201 ẵ=189 ễ=212 ỗ=231 ỡ=236 ữ=247
ạ=185 ẹ=209 ị=222 ọ=228 ụ=244 ỵ=254 ậ=203 ă=198 ệ=214 ộ=233 ợ=238 ự=249
Nội dung thư viện KeyVnTrs:
unit KeyVnTrs;
interface
procedure KhoiTaoGoTelex;
procedure LoaiBoGoTelex;
function TaiPhongTuTep(TenTep: string): boolean;
procedure LoaiBoPhong;
implementation
uses crt, dos;
const
dKh = 0; {Khong co dau}
dSa = 1; {Sac (')}
dHu = 2; {Huyen (`)}
dHo = 3; {Hoi (?)}
dNg = 4; {Nga (~)}
dNa = 5; {Nang (.)}
TapKyTuNA: array[1.. 12 * 7] of Char =</p>
('A', 'E', 'I', 'O', 'U', 'Y', 'Â', 'Ă', 'Ê', 'Ô', 'Ơ', 'Ư',
'á, 'é, 'í, 'ó, 'ú, 'ý, 'ấ, 'ắ, 'ế, 'ố, 'ớ, 'ứ,
'á', 'é', 'í', 'ó', 'ú', 'ý', 'ấ', 'ắ', 'ế', 'ố', 'ớ', 'ứ',
'à', 'è', 'ì', 'ò', 'ù', 'ỳ', 'ầ', 'ằ', 'ề', 'ồ', 'ờ', 'ừ',
'ả', 'ẻ', 'ỉ', 'ỏ', 'ủ', 'ỷ', 'ẩ', 'ẳ', 'ể', 'ổ', 'ở', 'ử',
'ã', 'ẽ', 'ĩ', 'õ', 'ũ', 'ỹ', 'ẫ', 'ẵ', 'ễ', 'ỗ', 'ỡ', 'ữ',
'ạ', 'ẹ', 'ị', 'ọ', 'ụ', 'ỵ', 'ậ', 'ặ', 'ệ', 'ộ', 'ợ', 'ự');
var
TuHt: string; {Từ hiện tại đang gõ}
Int09Old: procedure; {Địa chỉ bộ nhớ của ngắt 09h cũ}
FontArr: array[0.. 255, 0.. 15] of byte;
procedure ThemHDP(c:string);
{Thêm một chuỗi vào hàng đợibàn phím}
var i: Byte;
procedure DatChuVaoHDP(kt: Char);
{Đặt một chữ vào hàng đợi bàn phím}
var< > r: registers;
begin
Case kt of
#8: if TuHt <> '' then Delete(TuHt, Length(TuHt), 1);
#0..#31: TuHt:= '';
#32..#255: TuHt:= TuHt + kt;
end;
if Length(TuHt) > 200 then delete(TuHt, 1, 50);
r.ah:= 05;
r.cl:= ord(kt);
r.ch:= 0;
intr($16, r);
end;
begin
for i:= 1 to length(c) do begin
DatChuVaoHDP(c[i]);
end;
end;
procedure ThemHDPMR(PMR:Char);
{Thêm một phím mở rộng vàohàng đợi bàn phím}
var r: registers;
begin
TuHt:= '';
r.ah:= 05;
r.cl:= 0;
r.ch:= ord(PMR);
intr($16, r);
end;
function ViTriNguyenAm(c:Char): Byte;
{Tìm chỉ số của nguyên âm ctrong mảng}
var i: Byte;
begin
for i:= 1 to 12 * 7 do begin
if c = TapKyTuNA[i] then begin
ViTriNguyenAm:= i;
Exit;
end;
end;
VitriNguyenAm:= 0;
end;
function LaNguyenAm(c:Char): boolean;
{Có đúng ký tự c là nguyênâm không}
begin
LaNguyenAm:= (ViTriNguyenAm(c) <> 0);
end;
function BoDauChu(c: Char;DauBo: Byte): Char;
{Bỏ dấu vào chữ}
var Vt, ChuGoc, DauHt: integer;
begin
Vt:= ViTriNguyenAm(c);
ChuGoc:= (Vt mod 12); if ChuGoc = 0 then ChuGoc:= 12;
DauHt:= ((Vt - 1) div 12) - 1; if DauHt = -1 then DauHt:= 0;
if DauHt <> DauBo then BoDauChu:= TapKyTuNA[(DauBo + 1) *12 + ChuGoc]
else BoDauChu:= c;
end;
function LayDau(CumTu:string): Byte;
{Xét xem dấu được bỏ ở đâutrong các nguyên âm trong cụm từ}
const
DauSau: array[1.. 12] of string[2] =</p>
('iế, 'oá, 'oấ, 'oắ, 'oé, 'uý, 'uấ, 'uế, 'uố, 'uớ,'yế', 'ướ);
var i: Byte;
begin
if (CumTu[1] in ['A'..'Z']) then Inc(CumTu[1], 32);