Nya.vn

Thư viện thiết kế bỏ túi

HuyKTS.com - Thư viện thiết kế bỏ túi

Thẻ GSUB trong ngôn ngữ lập trình AFDKO (Phần 2)

Chào các bạn! Tôi là HuyKTS, một người yêu thích công việc thiết kế.
Đây là bài viết về AFDKO, một ngôn ngữ lập trình tính năng cho Font chữ OpenType. Các tính năng như Font chữ biến đổi, điều chỉnh Kerning, tự động thay thế chữ kiểu trong một Font chữ OpenType đều được mô tả trong thông tin đính kèm theo tệp phông chữ, được trình bày bằng ngôn ngữ AFDKO.
Các bạn xem bài viết chỉ cần xem phần hình ảnh. Hình ảnh đã được sắp xếp và trình bày nội dung bài viết, dễ xem và dễ hiểu. Phần văn bản dùng để tối ưu hóa nội dung.

Thẻ tra cứu tính năng GSUB trong ngôn ngữ AFDKO dùng để là gì?

Bài này giới thiệu một số thẻ tra cứu tính năng trong ngôn ngữ lập trình AFDKO cơ bản nhất. Cụ thể là thẻ GSUB với chức năng tra cứu kiểu thay thế ký tự.

Trong chữ viết Latin, một số ký tự cần được thay thế bằng ký tự nối. Ví dụ f f i đổi thành ffi. Tính năng thay thế chữ kiểu A thành ᴀ hoặc Ɐ. Việc thay thế ký tự nối trong chữ viết Ả Rập. Biết chức năng của thẻ tra cứu tính năng GSUB giúp bạn hiểu được tính năng thay thế ký tự nào đang được thêm vào Font chữ. Có tám loại thẻ tra cứu tính năng GSUB trong lập trình AFDKO. Trong bài này, tôi giới thiệu thêm các loại thẻ GSUB còn lại. Bao gồm thẻ tính năng GSUB LookupType 5, 6, 7, 8.

Thẻ tính năng GSUB LookupType 5 trong ngôn ngữ lập trình AFDKO

Thẻ tính năng loại [GSUB LookupType 5] chỉ là một tập hợp con trong thẻ tính năng loại [GSUB LookupType 6].

Thẻ tính năng GSUB LookupType 6 trong ngôn ngữ lập trình AFDKO

Giới thiệu thẻ GSUB LookupType 6:

Thẻ tính năng loại [GSUB LookupType 6] chỉ định thay thế ký tự dựa theo ngữ cảnh chuỗi ký tự xuất hiện. Tính năng này dựa vào ngữ cảnh chuỗi ký tự xuất hiện để thay thế một hoặc vài ký tự trong chuỗi ký tự đó.
Tính năng [GSUB LookupType 6] rất linh hoạt và có cách sử dụng đa dạng nên không có mẫu cú pháp chung. Cách sử dụng có thể dựa theo các ví dụ sau:

Ví dụ 1:

lookup CNTXT_LIGS {        # Danh sách tra cứu hành động số 1
     substitute f i by f_i;
     substitute c t by c_t;
} CNTXT_LIGS;

lookup CNTXT_SUB {         # Danh sách tra cứu hành động số 2
     substitute n by n.end;
     substitute s by s.end;
} CNTXT_SUB;

feature test {             # Danh sách ngữ cảnh để chỉ ra hành động được tra cứu
     substitute [ a e i o u] f' lookup CNTXT_LIGS i' n' lookup CNTXT_SUB;
     substitute [ a e i o u] c' lookup CNTXT_LIGS t' s' lookup CNTXT_SUB;
} test;
  • Diễn giải ví dụ 1:
    • Trong thẻ tra cứu hành động đầu tiên chứa hai thẻ thay thế theo ngữ cảnh. Thay thế “f” “i” bởi “f_i” và thế “c” “t” bởi “c_t”.
    • Trong thẻ tra cứu hành động thứ hai chứa hai thẻ thay thế theo ngữ cảnh, thay thế “n” bởi “n.end” và thay thế “s” bởi “s.end”.
    • Khối lệnh khai báo hai trường hợp ngữ cảnh được xét hành động. Dãy “f i n” được bắt đầu bởi một trong các Glyph “a e i o u” thì hành động thay thế “f_i” và “n.end” sẽ được kích hoạt. Dãy “c t s” được bắt đầu bởi một trong các Glyph “a e i o u” thì hành động thay thế “c_t” và “s.end” sẽ được kích hoạt.

Ví dụ 2:

substitute [a e n] d' by d.alt;
  • Diễn giải ví dụ 2: Khi một trong các ký tự “a e n” đứng trước ký tự “d” thì ký tự “d” sẽ bị thay thế bởi ký tự “d.alt”.

Ví dụ 3:

substitute [A-Z] [A.sc-Z.sc]' by [a-z];
  • Diễn giải ví dụ 3: Khi ký tự “A” đứng trước ký tự “A.sc” thì ký tự “A.sc” sẽ bị thay thế bởi ký tự “a”. Quy tắc hành động tương tự với các ký tự còn lại trong dải ký tự.

Ví dụ 4:

substitute [e e.begin]' t' c by ampersand;
  • Diễn giải ví dụ 4: Khi xuất hiện chuỗi “e t c” hoặc “e.begin t c” thì hai ký tự đầu tiên sẽ bị thay thế bởi ký tự “ampersand”.

Ví dụ 5:

lookup REMOVE_CAKRA {      # Danh sách tra cứu hành động số 1
     sub ka ka.pas_cakra.ns by ka;
} REMOVE_CAKRA;

lookup REORDER_CAKRA {     # Danh sách tra cứu hành động số 2
     sub ka by ka.pas_cakra ka;
} REORDER_CAKRA;

lookup REORDER_CHAIN {     # Danh sách ngữ cảnh để chỉ ra hành động được tra cứu
     sub ka' lookup REMOVE_CAKRA lookup REORDER_CAKRA ka.pas_cakra.ns' ;
} REORDER_CHAIN;
  • Diễn giải ví dụ 5:
    • Trong thẻ tra cứu hành động đầu tiên chứa thẻ thay thế chuỗi ký tự “ka” “ka.pas_cakra.ns” bởi ký tự “ka”.
    • Trong thẻ tra cứu hành động thứ hai chứa thẻ thay thế ký tự “ka” bằng chuỗi ký tự “ka.pas_cakra.ns” “ka”.
    • Trong thẻ tra cứu hành động thứ ba chứa lệnh thay thế theo ngữ cảnh. Khi xuất hiện ký tự “ka” đứng trước ký tự “ka.pas_cakra.ns” thì ký tự “ka.pas_cakra.ns”
    • sẽ bị xóa đi, phía trước ký tự “ka” sẽ được thêm vào ký tự “ka.pas_cakra.ns”.
    • Dữ liệu đầu vào là “ka” “ka.pas_cakra.ns” sẽ cho ra kết quả đầu ra là “ka.pas_cakra.ns” “ka”.

Giới thiệu thẻ <ignore substitute>:

Thẻ <ignore substitute> dùng để chỉ định trường hợp ngoại lệ khi thực hiện thay thế ký tự dựa theo ngữ cảnh chuỗi ký tự xuất hiện.
Cú pháp của thẻ <ignore substitute> là:

ignore substitute     <backtrack glyph sequence>*
                      <marked glyph sequence>
                      <lookahead glyph sequence>*;
  • Trong đó:
    • <backtrack glyph sequence> là Glyph hoặc nhóm Glyph khi xuất hiện sẽ đủ điều kiện loại trừ ngữ cảnh.
    • <marked glyph sequence> là Glyph được đánh dấu thay thế khi xuất hiện ngữ cảnh thay thế Glyph.
    • <lookahead glyph sequence> là Glyph hoặc chuỗi Glyph ngữ cảnh được khai báo trong lệnh thay thế Glyph theo ngữ cảnh.

Ví dụ 6:

ignore substitute f [a e] d';
ignore substitute a d' d;
substitute [a e n] d' by d.alt;
  • Diễn giải ví dụ 6:
    • Thẻ thứ nhất chỉ định loại trừ ngữ cảnh “f a d” và “f e d” khi xét ngữ cảnh thay thế ký tự “d”.
    • Thẻ thứ hai chỉ định loại trừ ngữ cảnh “a d d” khi xét ngữ cảnh thay thế ký tự “d” đứng giữa chuỗi ký tự.
    • Thẻ chỉ định một trong các ký tự “a e n” đứng trước ký tự “d” thì ký tự “d” bị thay thế bởi ký tự “d.alt”.
    • Như vậy, có thể hiểu là nếu xuất hiện chuỗi ký tự “f a d”, “f e d” hoặc “a d d” thì hành động thay thế ký tự “d” sẽ không được thực hiện.

Cách rút gọn thẻ khi chỉ định trường hợp ngoại lệ:

ignore substitute <match sequence1>;
ignore substitute <match sequence2>;
ignore substitute <match sequence3>;

Được viết gọn là:

ignore substitute <match sequence1>, <match sequence2>, <match sequence3>;

Ví dụ:

ignore substitute f [a e] d';
ignore substitute a d' d;

Được viết gọn là:

ignore substitute f [a e] d', a d' d;

Ví dụ 7:

ignore substitute @LETTER f' i';
substitute f' i' by f_i.begin;
  • Diễn giải ví dụ 7:
    • Thẻ chỉ định loại trừ ngữ cảnh xuất hiện chuỗi ký tự “@LETTER f i” khi xét ngữ cảnh thay thế chuỗi ký tự “f i”.
    • Thẻ chỉ định khi xuất hiện chuỗi ký tự “f i” thì ký tự “f” sẽ bị thay thế bởi ký tự “f_i.begin”. Ký tự “i” sẽ bị xóa.
    • Như vậy, có thể hiểu là nếu xuất hiện chuỗi ký tự “@LETTER f i” thì hành động thay thế chuỗi ký tự “f i” sẽ không được thực hiện.

Ví dụ 8:

ignore substitute @LETTER a' n' d', a' n' d' @LETTER;
substitute a' n' d' by a_n_d;
  • Diễn giải ví dụ 8:
    • Thẻ chỉ định loại trừ ngữ cảnh xuất hiện chuỗi ký tự “@LETTER a n d” và “a n d @LETTER” khi xét ngữ cảnh thay thế chuỗi ký tự “a n d”.
    • Thẻ chỉ định khi xuất hiện chuỗi ký tự “a n d” thì ký tự “a” sẽ bị thay thế bởi ký tự dính “a_n_d”. Ký tự “n” và “d” sẽ bị xóa.
    • Như vậy, có thể hiểu là nếu xuất hiện chuỗi ký tự “@LETTER a n d” hoặc “a n d @LETTER” thì hành động thay thế chuỗi ký tự “a n d” sẽ không được thực hiện.

Ví dụ 9:

# --- Glyph classes used in this feature:
@LETTER = [a-z A-Z];
@BEGINNINGS = [A-N P-Z Th m];
@BEGINNINGS_SWASH = [A.swash-N.swash P.swash-Z.swash T_h.swash m.begin];
@ENDINGS = [a e z];
@ENDINGS_SWASH = [a.end e.end z.end];

# --- Beginning-of-word swashes:
ignore substitute @LETTER @BEGINNINGS';
substitute @BEGINNINGS' by @BEGINNINGS_SWASH;

# --- End-of-word swashes:
ignore substitute @ENDINGS' @LETTER;
substitute @ENDINGS' by @ENDINGS_SWASH;
  • Diễn giải ví dụ 9:
    • Nhóm lệnh đầu tiên gán tên cho nhóm ký tự.
    • Nhóm lệnh thứ hai chỉ định thay thế ký tự “@BEGINNINGS” bởi ký tự “@BEGINNINGS_SWASH”. Nhưng nếu xuất hiện chuỗi ký tự “@LETTER @BEGINNINGS” thì hành động thay thế ký tự “@BEGINNINGS” sẽ không được thực hiện.
    • Nhóm lệnh thứ ba chỉ định thay thế ký tự “@ENDINGS” bởi “@ENDINGS_SWASH”. Nhưng nếu xuất hiện chuỗi ký tự “@ENDINGS @LETTER” thì hành động thay thế ký tự “@ENDINGS” sẽ không được thực hiện.

Thẻ tính năng GSUB LookupType 7 trong ngôn ngữ lập trình AFDKO

Thẻ tính năng loại [GSUB LookupType 7] được sử dụng để thay thế ký tự kết hợp với các thẻ tính năng mở rộng khác. Không cần thiết cho thiết kế Font chữ Latin.

Thẻ tính năng GSUB LookupType 8 trong ngôn ngữ lập trình AFDKO

Thẻ tính năng loại [GSUB LookupType 8] có trình tự ngữ cảnh ngược lại với ngữ cảnh của thẻ tính năng loại [GSUB LookupType 6]. Tức là thay thế ký tự phía trước dựa theo ngữ cảnh của ký tự phía sau.
Cú pháp của [GSUB LookupType 8] là:

reversesub <glyphclass|glyph> <glyph>' by <glyph>;

Được viết gọn là:

rsub <glyph>' <glyphclass|glyph> by <glyph>;

Ví dụ 10:

rsub [0 - 9]' <fraction> by <0.subs – 9.subs>;
  • Diễn giải ví dụ 10:
    • Nếu phía sau ký tự trong dải từ “0 – 9” xuất hiện ký tự “fraction” thì ký tự đầu tiên sẽ bị thay thế bởi ký tự tương ứng trong dải “0.subs – 9.subs”.

Tổng kết:

Trên đây là bài giới thiệu thẻ tra cứu tính năng GSUB LookupType 5, 6, 7, 8 trong ngôn ngữ lập trình AFDKO.

Thẻ GSUB cần thiết cho Font chữ trình bày chữ viết Latin.

Bài viết có liên quan:

Thẻ GPOS LookupType 1 trong ngôn ngữ lập trình AFDKO

Thẻ GPOS LookupType 1

Thẻ dán nhãn aalt trong ngôn ngữ lập trình AFDKO

Thẻ dán nhãn ‘aalt’

Thẻ dán nhãn cswh trong ngôn ngữ lập trình AFDKO

Thẻ dán nhãn ‘cswh’

Thẻ dán nhãn kern trong ngôn ngữ lập trình AFDKO

Thẻ dán nhãn ‘kern’

Huy KTS - Thư viện thiết kế bỏ túi

Nya.vn – Thư viện thiết kế bỏ túi
Và tôi là HuyKTS, một người yêu thích công việc thiết kế.
Chúc các bạn sức khỏe và thành công!

Nya Store - Viên gạch dựng xây ý tưởng
Nya Home - Bộ sưu tập mẫu nhà đẹp
Nya Decor - Kiến tạo không gian cảm xúc
HuyKTS.com - Thư viện thiết kế bỏ túi

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Chuyển lên trên