Xử lý tác vụ chuyển đổi bảng mã tiếng Việt

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG EXTENSIONS TRÊN MOZILA FIREFOX (Trang 74 - 78)

IV: Xây Dựng Extension Chuyển Mã Tiếng Việt

4. Xử lý tác vụ chuyển đổi bảng mã tiếng Việt

Tác vụ chuyển đổi bảng mã tiếng Việt thực hiện việc duyệt một trang Web đang được hiển thị(hay active, do trên Firefox hỗ trợ duyệt web theo tab). Lấy văn bản đang được hiển trong “content area” chuyển từ bảng mã tiếng Việt gốc sang bảng mã Unicode tương

ứng(nếu có thể).

Dưới đây là những tác vụ chính cần phải làm:

1. Duyệt các tag html và lấy văn bản được hiển thị trên trình duyệt.

2. Chuyển văn bản lấy được sang bảng mã Unicode(nếu bảng mã gốc là bảng mã tiếng Việt, không cùng dạng với bảng mã Unicoe).

3. Văn bản lấy được chuyển sang bảng mã Unicode được đưa trở lại trang web và hiển thị trên trình duyệt

4.1 Duyt trang web được hin th

Cấu trúc trang web được xử lý trên mô hình DOM(Document Oject Model) hỗ trợ bởi W3C.

Nhưđã phân tích ở phần trước, văn bản trong cấu trúc DOM có thể lấy ra từ 2 cách: 1. Sử dụng hàm javascript để lấy thuộc tính textContent, data, hoặc text. Nhưng

nhược điểm của cách này là những thuộc tính trên chỉ có thể truy cập thông qua một đối tượng là các tag thực tếđược tồn tại trong một trang web.Trên thực tế có những văn bản không cần được khai báo trong các tag mà vẫn được trình duyệt xử

lý và hiển thị.

2. Sử dụng đối tượng textNode trong cấu trúc DOM. Nếu sử dụng đối tượng này ta có thểđảm bảo rằng tất cả các văn bản đều sẽđược xử lý.

Giải pháp thứ 2 sẽđược chọn, vì nó tối ưu hơn trong cách duyệt cây. Thuật toán dùng để

duyệt cây DOM có thể dùng theo 2 cách:

1. Thuật toán đệ quy duyệt cây DOM, với ưu điểm là viết mã ngắn gọn dễ hiểu. 2. Thuật toán duyệt cây sử dụng các lệnh vòng lặp. ưu điểm là rút ngắn thời gian

thực thi tác vụ, nhưn khó khăn trong việc viết mã và khá phức tạp.

Trong phiên bản đầu tiên của Extension chuyển mã tiếng việt sử dụng theo thuật toán đệ

quy.

Các bước thực hiện duyệt cây DOM và sử dụng thuật toán đệ quy:

1) Lấy phần tử gốc để bắt đầu duyệt của cây DOM. Ở đây, phần tửđầu tiên được chọn bắt đầu từ thẻ BODY.

2) Duyệt phần tử DOM bắt đầu tử phần tử gốc.

a) Với mỗi phần tử, kiểm tra xem nodeType của phần tử đó là Tag HTML hay không,nếu đúng thì chuyển font(nếu có) của tag HTML này tương ứng sang font Unicode.

b) Nếu nodetype là textnode(type=3), thì chuyển văn bản của node sang mã Unicode tương ứng.

c) Thực hiện lại quá trình trên với mỗi node con bắt đầu từ node cha.

Lấy phần tử Node tại tag BODY. Và thực hiện duyệt các node con của node này:

var child = content.document.getElementsByTagName("BODY")[0]; scanChild(child, 24);

Hàm đệ quy scanChild(node,id):

- node – đối tượng node object - id – id của bảng mã node hiện tại.

scanChild:

function scanChild(node, id){

if(node.nodeType == 3 && node.textContent != "" ) {// node text->>> trans string

var fontSrc =content.document.defaultView.getComputedStyle(node.parentNode,null)

.getPropertyValue("font-family"); var idFontSrc = obj.findVnCodeFromFont(fontSrc);

if(idFontSrc >= 0 ) node.textContent = obj.transStringWithId(node.textContent,idFontSrc); else{ node.textContent = obj.transStringWithId(node.textContent,id); } } else if (node.nodeType == 1)

{//node tag-->>> if has font style ->>> tranfont

if(node.style.fontFamily != "" || node.style.font != ""){ id = obj.findVnCodeFromFont( content.document.defaultView.getComputedStyle(node, null) .getPropertyValue("font-family")); if(id < 0 ) { id = obj.findVnCode(node.textContent); } }

for(var i= 0; i < node.childNodes.length; i++){ scanChild(node.childNodes[i],id);

}

var fontSrc = content.document.defaultView.getComputedStyle(node, null)

.getPropertyValue("font-family"); var idFontSrc = obj.findVnCodeFromFont(fontSrc);

var fontTran = obj.transFont(fontSrc,idFontSrc); node.style.fontFamily = fontTran;

} }

Trong đó obj là đối tượng truy xuất đến Transvn XPCOM được khai báo biến toàn cục: const cid = "@thienthanbattu.org/trans;1";

obj = Components.classes[cid].getService();

4.2 chuyn bng mã và vn đề style

Như ta đã biết, để một chuỗi có thể hiển thị được đúng nội dung của nó theo bảng mã, cần phải có font tương ứng với bảng mã.

Khi chuyển đổi chuỗi sang bảng mã khác, tại node chứa văn bản chuyển đổi cần được cài

đặt font tương ứng với bảng mã đã chuyển sang. Tuy nhiên, với font mới này có thể sẽ

không thể hiện được đúng kiểu dáng của các ký tự tương tự như font cũ của bảng mã cũ, và thậm chí cũng có thể sẽ không thể hiện đúng ký tự cần chuyển. Đây là giới hạn của phương pháp chuyển mã tiếng Việt này.

Font của một textNode có thể khai báo ở các cấp độ khác nhău: - Được khai báo tại tag HTML chứa văn bản đó.

- Được khai báo tại một nơi nào đó định nghĩa style sheet trong cùng một trang tài liệu web.

- Được khai báo tại một file .css liên kết với trang web.

Theo cách duyệt cây DOM như trên, việc ta lấy thuộc tính font của một tag HTML thì thật đơn giản bằng việc truy cập thông qua thuộc tính style của node đó. Nhưng với nodeText không cung cấp thuộc tính nào cho phép nhận biết được style mà nó đang sử

dụng cho văn bản mà nó hiển thị.

Vấn đề giới hạn sử dụng đối với hàm thư viện XPCOM Transvn Code:

- Trong hàm thư viện Transvn.dll cung cấp hàm chuyển font, hàm này cung cấp dịch vụ chuyển font từ một font nguồn với id được chỉ định. Hàm chỉ hoạt đông tốt nếu ta cung cấp mã của bảng mã font chính xác, và font cần chuyển có trong cơ sở dữ liệu của thư viện BKTrans, là những font có sẵn, và thông dụng. nhưng trên thực tế có rất nhiều loại font khác nhău. Vì thế nếu không thể tìm được mã của bảng mã nguồn thì chỉ ta có thể cài đặt font mặc định của Unicode, ví dụ

Times.

- Trong hàm thư viện có cung cấp dịch vụ tìm bảng mã của font, hàm này chỉ hoạt

động tốt nếu font nguồn có trong cơ sở dữ liệu của hàm thư viện BKTrans

- Hàm thư viện tìm mã bảng mã từ một chuỗi tiếng việt, hàm này sẽ tìm bảng mã tiếng việt nào gần giống nhất với bảng mã của chuỗi đưa vào. Do đó vẫn có thể

xảy ra sai sót trong việc tìm bảng mã.

Để giải quyết những vấn đề trên, trong cách duyệt các node đã sử dụng cùng lúc hai giải pháp său:

- Tại mỗi node có định nghĩa font, nếu tìm được mã bảng mã của font,ta dùng một id lưu giữ giá trị của bảng mã hiện tại của font đó. Id này sẽ sử dụng dùng để

chuyển mã các chuỗi trong các node con của nó, và dùng để chuyển font của chính nó. Cách này có thể giải quyết được vấn đề định nghĩa font trong các tag HTML.

- Tìm mã của nodeText đang tham chiếu bằng cách lấy font của nodeText đó thông qua giá trị thực tế của font được tính toán hiển thị trên cửa sổ window, giá trị này

được gọi là “computed value”, và thuộc tính style được lưu trữ trong “Computed Style” được đặc tả bởi tổ chức W3C trong DOM level 2.0. Thuộc tính này có thể được truy cập bằng javascipt tại node cha của node textNode.VD:

var fontSrc = content.document.defaultView.getComputedStyle(node.parentNode, null)

.getPropertyValue("font-family")

Một phần của tài liệu XÂY DỰNG ỨNG DỤNG EXTENSIONS TRÊN MOZILA FIREFOX (Trang 74 - 78)