Mecanismo Unificado e Extensível para Processamento de Texto Multilingue

Kenichi Handa, Mikiko Nishikimi, Satoru Tomura, Naoto Takahashi

Electrotechnical Laboratory
Umezono 1-1-4, Tsukuba, 305 JAPAN

Sumário

Pontos de debate mais importantes em torno de sistemas de processamento de texto multilingue são (1) mecanismo unificado para múltiplas línguas e, (2) ajustabilidade e extensibilidade das funções fornecidas pelo sistema. Neste documento, explica-se como esses pontos de debate são resolvidos no sistema chamado Mule (MULtilingual Enhancement to GNU Emacs). Mule é um editor de textos simples que funciona em vários sistemas (UNIX, DOS, Windows and OS/2 em várias plataformas). Ele oferece aos usuários um ambiente flexível de processamento de texto multilingue, que atende não somente a simples edição de textos mas também a leitura/escritura de cartas e notícias para Internet, folhear páginas Web, etc. Todas essas funções são controladas por um único mecanismo, totalmente ajustáveis e extensíveis por usuários.

1. Introdução

Com o avanço marcante de tecnologias relativas a computador, já temos no momento a capacidade de computadores suficiente para trabalhar não somente com o idioma inglês mas também com muitas outras línguas. Muitos países já desenvolveram maneiras para trabalhar com suas línguas nacionais no computador. A maioria dessas maneiras são baseadas em mecanismos locais que causam nenhum problema desde que cada ambiente de computador esteja limitado ao seu próprio. No entanto, como a Internet está conectando mais firmemente o mundo, cresce a necessidade de efetuar a comunicação mais fácil entre vários locais/nações/línguas, e estamos agora diante da dificuldade de trabalhar com múltiplas línguas ao mesmo tempo. Esta dificuldade deve a que cada sistema local foi desenvolvido independentemente, sem se ter preocupação com os outros.

A fim de resolver este problema de trabalhar com múltiplas línguas, desenvolvemos o Mule, editor multilingue de textos simples baseado no GNU Emacs. O GNU Emacs é um dos editores mais famosos e amplamente utilizados no mundo UNIX. A principal característica do Emacs é que ele é equipado com o interpretador Emacs Lisp, e a maioria das funções é implementada em Emacs Lisp, o que significa que é possível realçar o GNU Emacs somente modificando ou adicionando programas Emacs Lisp. O Emacs pode ser usado não somente para trabalhos de edição de textos, mas também para todos os tipos de processamento de texto inclusive leitura/escritura de cartas e notícias para Internet, folhear páginas Web, referência a manuais, procura on-line em dicionários, etc. Todas essas funções são realizadas pelos programas Emacs Lisp, e conseqüentemente, são totalmente adaptáveis.

O Mule herda todas essas funções e pode aproveitá-las em ambiente multilingue. Por exemplo, usuários do Mule podem trocar entre si cartas e ler páginas Web em qualquer língua, desde que essas línguas estejam atendidas pelo Mule.

Durante a projeção do Mule, mantemos os dois seguintes pontos em mente:

O ponto de debate mais difícil mas importante do processamento de texto é fornecer um mecanismo unificado para trabalhar com línguas múltiplas sem perder a vantagem criada durante a localização para cada língua. Trabalhos de processamento de texto em várias línguas pode diferir um do outro em muitos aspectos: qual jogo de caracteres é usado, como o texto é restituído no monitor, como é a entrada do texto a partir do teclado, qual mecanismo de codificação é usado em ficheiros. Variedade de línguas-alvo requer um mecanismo unificado que a cubra.

Outro ponto de debate importante é o de ajustabilidade e extensibilidade, isto é, a facilidade de ajustar ou estender funções. É praticamente impossível projetar e fornecer todas as funções necessárias para todas as línguas já atendidas. O número de línguas atendidas pode mudar no futuro. Nos países em desenvolvimento, até mesmo o ambiente-padrão para suas línguas nacionais pode mudar. Qualquer sistema sem flexibilidade para modificar ou estender suas funções pode rapidamente se tornar inútil, ou se tornar difícil demais para adicionaar novas línguas.

Por essa razão, mesmo que seja necessário providenciar uma nova função para alguma língua, não a adicionamos imediatamente. Primeiro, examinamos se há alguma possibilidade de que outras línguas também necessitem de função semelhante, qual parte da função deve ser generalizada para todas as línguas e qual parte da função deve ser mantida modificável. Depois de todos esses pontos resolvidos, projetamos a função mais versátil.

Processamento de texto é um trabalho complexo. Ele abrange, pelo menos, entrada de texto, armazenamento, re-armazenamento e visualização. Quando afirmamos que o Mule atende a alguma língua, isto significa que o Mule pode, pelo menos:

Aqui, usamos a palavra "padrão" não somente como "padrão oficial", mas também como "padrão de facto". Além disso, enquanto processamos um texto, temos que trabalhar com caracteres, palavras e linhas obedecendo a regras de escritura padrão para cada língua. Todas essas funções são controladas por um mecanismo unificado para trabalhar com conjunto de caracteres (character set), sistemas de codificação, métodos de entrada e rotinas de visualização.

As seções daqui em diante são organizadas da seguinte maneira:

Seção 2
Como o Mule trabalha com caracteres internamente
Seção 3
Como o Mule reage ao mundo externo no qual diferentes mecanismos de codificação estão sendo usados
Seção 4
Como se pode fazer entrada de texto multilingue do teclado normal baseado no idioma inglês
Seção 5
Como o Mule trabalha com regras de escritura de diferentes línguas
Seção 6
Como o Mule restitui texto multilingue na tela do computador
Seção 7
Sumário, o estatus atual do Mule e trabalhos previstos no futuro

2. Representação interna de texto multilingue

Conjunto de caracteres (character set) é um grupo de caracteres usado em conjunto para um texto regional (por exemplo, texto em inglês, texto em japonês). Apesar de um único conjunto de caracteres para todas as línguas ser o sonho mais doce para quem desenvolve sistemas, não há o que o atende no momento. ISO 10646 (ou Unicode) é inútil por enquanto, particularmente para os caracteres chineses, devido a seu trabalho inconsistente com a unificação CJK. É o porquê de termos decidido trabalhar com conjuntos múltiplos de caracteres no Mule.

A maioria dos conjuntos de caracteres do Mule possui correspondência de um por um para os conjuntos registrados no ISO (por exemplo, ISO 8859-1, JIS X0208). Enquanto cada conjunto de caracteres do ISO seja identificado por seu tipo de tamanho (quantos caracteres são incluídos) e caracter final (código de um bite para distinguir conjuntos de caracteres do mesmo tipo de tamanho), o Mule identifica cada conjunto de caracteres por um único número de identificação chamado "charset-id". Desta maneira, definir um conjunto de caracteres no Mule é associar um único charset-id ao conjunto de caracteres ISO correspondente e informar Mule de vários parámetros do conjunto. Esses parámetros, os quais são utilizados para trabalho de edição, abrangem largura de visualização, direção de escritura, etc. A Tabela 1 mostra exemplos de conjuntos de caracteres.

Tabela 1. Exemplo de conjuntos de caracteres
conjunto de caracteres ISO parámetros utilizados no Mule
nome tipo de tamanho caracter final "charset-id" bites largura direção
ASCII 94 'B' 0 1 1 left-to-right
ISO8859-1 (Latin1) 96 'A' 129 2 1 left-to-right
ISO8859-8 (Hebrew) 96 'H' 136 2 1 right-to-left
TIS620 96 'T' 133 2 1 left-to-right
GB2312 94 X 94 'A' 145 3 1 left-to-right
JISX0208 94 X 94 'B' 146 3 1 left-to-right
CNS11643-1 94 X 94 'G' 149 4 1 left-to-right
CNS11643-3 94 X 94 'I' 246 4 1 left-to-right
Na Tabela, bites é comprimento de bite da representação interna do Mule, largura é número de colunas ocupadas no monitor, direção é a direção de restituição: de esquerda para direita, ou de direita para esquerda.

É também possível definir um conjunto de caracteres não registrado no ISO. Neste caso, o Mule usa um caracter final reservado para o uso privativo do ISO. Se um conjunto de caracteres não esteja originalmente de acordo com a exigência técnica do ISO 2022, o conjunto deve ser reorganizado por divisão em conjuntos menores, ou por modificação de pontos de código de caracteres para atender a tal exigência. O exemplo típico deste caso é o conjunto de caracteres vietnamitas, cujo detalhe é descrito na Seção seguinte.

A maneira mais comum e simples para reter um texto na memória do computador é representar cada caracter por uma ordem de elementos de largura fixa (de um a quatro bites). Considerando um texto multilingue, no entanto, usar um ou dois bites para cada caracter é aparentemente insuficiente para atender a todas as formas de caracteres do mundo inteiro. Usar elemento de quatro bites poderia ser suficiente, mas é disperdício de memória para textos escritos somente em inglês. Por essa razão, no lugar de usar representação de largura fixa, adotamos forma de largura variável de multi-bite (daqui em diante, chama-se resumidamente de "forma multi-bite") para representar caracteres no buffer do Mule, tanto para o uso eficiente da memória como para a extensibilidade. (Esta idéia originou-se da nota breve de Stallman.)

Com a forma multi-bite, cada caracter é representado por um ou dois bites de "leading codes(códigos de introdução)" para charset-id e os seguintes um ou dois bites para o "character code(cófigo de caracter)". A única exceção são caracteres ASCII, eles são representados como são, e o charset-id é 0. A Tabela 2 mostra uma definição mais formal da representação interna de caracteres do Mule.

Tabela 2. Definição formal da representação interna de caracteres
    CHARACTER := ASCII_CHAR | MULTIBYTE_CHAR
    MULTIBYTE_CHAR := PRIMARY_CHAR_1 | PRIMARY_CHAR_2
                      | SECONDARY_CHAR_1 | SECONDARY_CHAR_2
    PRIMARY_CHAR_1   := LEADING_CODE_PRI C1
    PRIMARY_CHAR_2   := LEADING_CODE_PRI C1 C2
    SECONDARY_CHAR_1 := LEADING_CODE_SEC LEADING_CODE_EXT C1
    SECONDARY_CHAR_2 := LEADING_CODE_SEC LEADING_CODE_EXT C1 C2
    ASCII_CHAR := 0 | 1 | ... | 127
    LEADING_CODE_PRI := 129 | 130 | ... | 153
    LEADING_CODE_SEC := 154 | 155 | 156 | 157
    C1, C2, LEADING_CODE_EXT := 160 | 161 | ... | 255
 

Na Tabela, PRIMARY_CHAR e SECONDARY_CHAR diferem entre si somente na memória exigida por caracter e durante o trabalho de edição não há diferença entre eles. Charset-id é representado por um único LEADING_CODE_PRI (neste caso, charset-id é de 129 a 154) ou uma seqüência de LEADING_CODE_SEC e LEADING_CODE_EXT (neste caso, charset-id é mais de 160). Um conjunto de caracteres de bite singular pode abranger 96 caracteres no máximo e é representado por seqüência de dois ou três bites, um conjunto de caracteres de bite duplo pode abranger no máximo 9216 (96 x 96) caracteres e é representado por seqüência de três ou quatro bites. Selecionamos conjuntos de caracteres freqüentemente usados e definimo-los como PRIMARY. Todos os conjuntos de caracteres adicionados por usuários são definidos como SECONDARY. Por exemplo, na série de conjunto de caracteres chineses (taiwaneses) CNS11643, primeiros dois planos são PRIMARY mas os outros são SECONDARY (ver a Tabela 1). A Figura 1 mostra o uso da área de código de um bite.

Figura 1. Uso da área de código de um bite
0x00--0x7f character code of ASCII_CHAR
0x80--0x99 LEADING_CODE_PRI
0x9a--0x9f LEADING_CODE_SEC
0xa0--0xff 1st and 2nd charactercodes of MULTIBYTE_CHAR or LEADING_CODE_EXT

3. Sistema de codificação

Sistema de codificação, ou mecanismo de codificação, é uma maneira de codificar textos. Usamos diferentes sistemas de codificação no computador. Diferentes países usam diferentes sistemas de codificação. Por isso, o Mule efetua automaticamente conversão de códigos de vários formatos de representação para a forma multi-bite interna, sempre que ele reage ao mundo externo, lendo/escrevendo ficheiros, comunicando com outros processos, comunicando via rede, recebendo dados de um terminal, ou enviando dados a um terminal.

A fim de constituir um processo de conversão de códigos ajustável e extensível, evitamos equipar o Mule com a rotina de conversão rigidamente codificada. Em vez, montamos um modelo genérico de sistema de codificação para dentro do qual são colocados vários parámetros. Felizmente, a maioria dos sistemas de codificação atualmente utilizados no mundo ajusta-se na estrutura do ISO 2022. Por isso, classificamos sistemas de codificação em tipo ISO-2022 e tipo não-ISO-2022. Para o primeiro tipo, criamos o interpretador ISO 2022 genérico. Para o segundo, projetamos uma linguagem simples de programação CCL (Code Conversion Language) e criamos o interpretador de CCL.

Quando os usuários especificam algum sistema de codificação para algum processamento (por exemplo, leitura de ficheiro ou envio de carta), o Mule automaticamente chama o interpretador ISO 2022 ou o interpretador de CCL, de acordo com o sistema de codificação especificado.

3.1 Sistema de codificação tipo ISO-2022

Embora o ISO 2022 permite numerosas variações para codificar um mesmo texto, somente algumas delas são na verdade utilizadas. Desta maneira, a fim de especificar uma codificação, um pequeno número de parámetros regostrado na Tabela 3 é sugiciente. Por exemplo, variantes de EUC (Extended UNIX Code) chineses, japoneses e coreanos e todas as séries do ISO-8859 (Número de Parte de 1 até 10) diferem entre si somente nas designações iniciais de parámetros e designações reservadas. Outros exemplos são a série 7-bit ISO-2022, tais como ISO-2022-JP, ISO-2022-JP-2, ISO-2022-KR e ISO-2022-CN. Todos eles usam o ambiente 7-bit. Os primeiros dois não usa função "locking shift (apertar shift)", enquanto usam os outros.

Tabela 3. Parámetros do sistema de codificação tipo ISO-2022
parámetro valor significado
desiginações iniciais lista de charset-id Para cada registro gráfico, qual jogo de caracteres é inicialmente designado.
designações reservadas lista de charset-id Para cada registro gráfico, qual jogo de caracteres é designado exclusivamente na codificação
ambiente 7-bit verdadeiro/ falso Usa somente 7-bit rebaixado ou usa 8-bit completo na codificação
locking shift verdadeiro/ falso Usa função locking shift ou não
shift simples verdadeiro/ falso Usa função shift simples ou não
indicação de direção verdadeiro/ falso Usa seqüência de escape de ISO-6429 para indicar direção de escritura na codificação

A Tabela 4 mostra como é fácil definirmos um sistema de codificação tipo ISO-2022 no Mule. Depois de definido o sistema de codificação, ele pode ser especificado para qualquer situação onde conversão de códigos é requerida. Por exemplo, depois da definição da Tabela 4, os usuários podem ler/escrever ficheiros GB e visualizar os caracteres chineses no terminal GB, e trocar cartas no GB.

Tabela 4. Definindo sistema de codificação EUC chinês (chamado GB) no Mule
'*euc-china*		;; Nome do sistema de codificação
2			;; Tipo, '2' significa tipo ISO-2022
?C			;; Caracter mnemónico do sistema de codificação
t			;; tipo de auto-detectador fim-de-linha (CR, CRLF, LF)
(lista lc-ascii lc-cn	;; G0 é para ASCII, C1 é para o chinês GB2312
	nil nil		;; G2 e G3 são nunca usados.
 

3.2 Sistema de codificação tipo não-ISO-2022

Exemplos do sistema de codificação não-ISO-2022 são KOI-8 do russo e VISCII do vietnamita. Embora KOI-8 preenche a exigência técnica do ISO 2022, os pontos de código de caracteres são diferentes do ISO 8859-5 (alfabetos latinos/ alfabetos cirílicos) que é o conjunto de caracteres por falta para os caracteres cirílicos no Mule.

VISCII usa os códigos de 8-bit completo para 134 caracteres específicos do vietnamita, os quais não preenchem a exigência técnica do ISO 2022. Conseqüentemente, no Mule, o conjunto de caracteres vietnamitas é dividido em duas partes, a de letras minúsculas e a de maiúsculas, e para cada uma delas é atribuído charset-id.

Uma vez que o interpretador ISO 2022 genérico não pode ser usado para decodificar e codificar esses conjuntos de caracteres, equipamos o Mule com programas em CCL para efetuar a conversão. A CCL é uma linguagem simples mas poderosa, adequada para escrever algorismo de conversão de códigos, o que significa que teoricamente o Mule pode trabalhar com qualquer tipo de sistema de codificação com um programa em CCL apropriado. A Tabela 5 mostra os recursos do programa em CCL para codificar KOI-8.

Tabela 5. Programa em CCL para codificar o sistema de codificação KOI-8
(define-ccl-program ccl-write-koi8
 '(1
   ((read r0)
    (loop (if (r0 != 140) (write-read-repeat r0)
            ((read r0) (r0 -= 160)
             (write-read-repeat r0
     [ 32 179  32  32  32  32  32  32  32  32  32  32  32  32  32  32
      225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
      242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
      193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
      210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
       32 163  32  32  32  32  32  32  32  32  32  32  32  32  32  32])
             )))))
  "CCL program to write KOI8.")
 

4. Método de entrada

Investigamos os métodos existentes de entrada para caracteres multilingues e classificamo-nos em seguintes quatro tipos:

(1) distribuição de teclas
O método mais simples de entrada, que distribui teclas de teclados normais de inglês para outros caracteres uma por uma. Exemplos típicos são o grego e o russo.

(2) combinação de teclas
O método de entrada que gera um caracter composto por combinação de seqüência de teclas. Exemplos típicos são as línguas européias e a vietnamita, nas quais um caracter com marca diacrítica e marca de tom é gerado a partir de um alfabeto e de algumas teclas de símbolos. Por exemplo, no método de entrada do vietnamita, a seqüência de teclas a^' gera o caracter vietnamita {a}. Há também vários métodos de entrada de chinês deste tipo, mas eles requerem treino demasiado por causa do número muito grande de caracteres da língua.

(3) Mistura de (1) e (2)
Um método de entrada que primeiro distribui teclas e depois gera caracteres compostos, combinando as teclas distribuídas. Exemplos típicos são o tailandês e o coreano. Por exemplo, no método de entrada do tailandês, a superfície superior de todas as teclas são distribuídas para consoantes, vogais ou marcas de tom dessa língua, e a seqüência de teclas de um consoante e o vogal seguinte ou marca de tom gera um caracter composto que coloca vogal e/ou marca de tom na superfície superior ou abaixo do consoante.

(4) (3) e um programa de conversão externo
Este tipo de método é usado para fazer entrada dos caracteres chineses. Desde que haja mais de dez mil caracteres na língua chinesa, é extremamente difícil lembrar todas as combinações de teclas. No entanto, fazer entrada somente dos caracteres fonéticos é muito mais fácil. Por isso, podemos criar um método conveniente de entrada permitindo que os usuários só inputem caracteres fonéticos pelo modo (1) ou (3), e então deixem o resto do trabalho de gerar os caracteres chineses ao computador.

Por exemplo, no método de entrada do japonês, a seqüência de Hiragana (alfabeto fonético japonês) é datilografada primeiro, e depois a seqüência é convertida por algum programa de conversão numa mistura adequada de Kanji (letras chineses) e Hiragana. Há muitos programas de conversão, tais como Wnn, Canna, SJ3 (todos estes para o japonês), e cWnn (para o chinês), os quais podem ser utilizados a partir do Mule. Eles usam normalmente dicionário e conhecimento muito amplos sobre a gramática de cada língua para gerar seqüências adequadas de caracteres.

No Mule, métodos de entrada of primeiros três tipos são realizados como o sistema de tradução por entrada a partir dos teclados chamado Quail. O Quail é dado como um jogo de regras de tradução (chamado de "Quail package (pacote Quail)") ao mesmo tempo e traduz a entrada feita pelo usuário adequadamente. Cada regra de tradução consiste de uma seqüência de teclas e do texto traduzido correspontende. Uma regra pode possuir múltiplos candidatos de texto traduzido, em cada qual os usuários são solicitados a selecionar um interativamente.

É muito fácil ajustar um pacote Quail. Os usuários podem adicionar novas regras de tradução ou modificar as já existentes. Graças à modularidade do pacote Quail, adicionar novas regras para atender a novas línguas também é fácil. Isto pode ser feito simplesmente criando um novo pacote com um nome apropriado e definindo alguns números de regras de tradução sob o pacote. A Tabela 6 mostra como criar um novo pacote Quail, que simula Caps-lock (isto é, todas as minúsculas são traduzidas em maiúsculas).

Tabela 6. Exemplo de criação do pacote Quail "Caps-lock"
;; Primeiro, definir novo pacote Quail.
(quail-define-package "caps-lock"
                      "Caps-Lock" nil "Simulate Caps-Lock")
;; Depois, definir regras de tradução do pacote.
(quail-defrule "a" "A")
   ...
 

Métodos de entrada do último tipo são realizados como o sistema chamado Tamago. Ele traduz primeiro entrada de teclas em alguns códigos fonéticos (Hiragana em japonês e PinYin ou ZhuYin em chinês) e envia-os a um programa de conversão externo por rede. É possível usar o sistema Quail na primeira etapa. No entanto, o Tamago foi desenvolvido independentemente do Quail e possui no momento seu sistema próprio chamado "its" para gerar os códigos fonéticos. Desde que a conversão não pode ser totalmente automatizada, o usuário pode selecionar outras conversões interativamente. Para o momento, o Tamago pode usar Wnn e cWnn como servidor de conversão.

5. Processamento de texto

Processamento de texto é muito mais que uma simples entrada de caracteres. A fim de facilitar o processamento, o Mule proporciona várias ferramentas. Os exemplos são categorias de caracteres e um compilador de expressão comum poderoso que possibilita procura rápida de expressão comum.

Enquanto editando um texto, é conveniente agrupar alguns dos caracteres e usar o grupo em comandos de edição. Por exemplo, o usuário pode querer procurar um certo caracter cirílico, mas não quer especificar todos os caracteres cirílicos e combiná-los com os operadores OR. Para tal fim, o GNU Emacs original atribui um código de sintaxe de caracteres para cada caracter. O sintaxe de caracteres, no entanto, possui algumas restrições. Cada caracter pode ter, quando muito, um sintaxe de caracteres e os usuários podem não definir novos sintaxes.

O Mule oferece uma maneira adicional para agrupar os caracteres chamada categoria de caracteres. Os usuários podem definir uma nova categoria de caracteres e atribui a um caracter quantas categorias de caracteres quiserem. A Tabela 7 mostra as categorias de caracteres por falta do Mule. O trabalho de edição de texto envolve muitas vezes processamento de palavra por palavra, mas diferentes línguas podem ter diferentes definições de palavras. Com o Mule, os usuários podem definir uma palavra baseando-se nessas categorias de caracteres, o que possibilita os comandos de edição ajustáveis.

Tabela 7. Categorias de caracteres por falta
'b' Caracteres arábicos
'c' Caracteres de 2-bites chineses
'g' Caracteres gregos
'h' Caracteres de 2-bites coreanos
'j' Caracteres de 2 bites japoneses
'k' Caracteres de 1 bite japoneses Katakana
'r' Caracteres de 1 bite japoneses Roman
'l' Caracteres latinos
'w' Caracteres hebraicos
'y' Caracteres cirílicos
Caracteres taiwaneses

6. Visualização

Para visualizar textos multilingues, devemos considerar dois casos: o Mule funcionando de algum terminal (ou emulador de terminal tal como "xterm", "kterm", "cxterm", etc.), e o Mule funcionando sob um sistema de vitrina.

No primeiro caso, o Mule simplesmente envia corretamente o texto codificado aos terminais e deixa-lhes o trabalho de reconstituir o texto multilingue. A conversão de códigos é feita de acordo com um sistema de codificação especificado para a saída no terminal. Por exemplo, se o usuário trabalha com o Mule do "cxterm", não há maneira para visualizar qualquer outro texto além daqueles em inglês e chinês.

Quando o Mule está funcionando sob um sistema de vitrina, esse assume a responsabilidade de visualizar textos multilingues. No Mule, a cada conjunto de caracteres é atribuído um jogo de caracteres (font) correspondente. A compilação de distribuição de todos os jogos de caracteres para os jogos (fonts) correspondentes é chamada de "fontset" e é a base para visualizar cada caracter. O Mule pode usar diferentes fontsets em diferentes contextos. Por exemplo, enquanto lendo uma carta, o campo de texto principal é visualizado em negrito (bold), no qual o fontset da compilação de fonts negritos é usado somente para o campo do texto principal.

Na vitrina (window) X, os códigos de caracteres internos do Mule correspondem aos pontos de código do font correspondente. Por exemplo, o conjunto de caracteres japoneses JISX0208 pode ser visualizado corretamente pelo font no qual os pontos de código de caracteres seguem o JISX0208. Mas, ainda que a correspondência não seja mantida para certas combinações de um conjunto de caracteres e um font, podemos converter os pontos de código internos naqueles de um font pelo programa CCL descrito na Seção anterior. Por exemplo, o conjunto de caracteres cirílicos do Mule é baseado no ISO8859-5, considerando que o usuário pode somente ter um font KOI-8. Ainda no caso como este, tudo que o usuário deve fazer é mudar a distriguição de um fontset para que o font KOI-8 seja usado para o conjunto de caracteres cirílicos, e associar um programa CCL adequado ao conjunto de caracteres cirílicos (ver a Tabela 8).

Quando o usuário toma em carga uma nova língua, ele pode simplesmente adicionar uma distribuição entre o novo conjunto de caracteres para a língua e um font adequado para o fontset existente.

Tabela 8. Exemplos de uso do font KOI-8 para os caracteres cirílicos
  ;; Mudar distribuição de font no fontset DEFAULT-FONTSET.
  (set-fontset-font default-fontset lc-crl "HERE_COMES_KOI8_FONT_NAME")
  (define-ccl-program ccl-x-koi8
    '(0
      ((r1 -= 160)
       (r1 = r1
     [ 32 179  32  32  32  32  32  32  32  32  32  32  32  32  32  32
      225 226 247 231 228 229 246 250 233 234 235 236 237 238 239 240
      242 243 244 245 230 232 227 254 251 253 255 249 248 252 224 241
      193 194 215 199 196 197 214 218 201 202 203 204 205 206 207 208
      210 211 212 213 198 200 195 222 219 221 223 217 216 220 192 209
       32 163  32  32  32  32  32  32  32  32  32  32  32  32  32  32])))
    "CCL program to convert chars of lc-crl (ISO8859-5) to KOI8 font.")
  ;; Associar o programa CCL ao conjunto de caracteres cirílicos LC-CRL.
  (x-set-ccl lc-crl ccl-x-koi8)
  

7. Conclusão

Viemos descrevendo o editor de textos multilingues Mule, dando ênfase a sua ajustabilidade e extensibilidade. O Mule é equipado com o interpretador Emacs Lisp que torna o sistema aberto. Simples programas Emacs Lisp podem efetuar todo o ajustamento.

O Mule foi lançado em 1993. Desde então, as pessoas do mundo inteiro têm contribuído muito para atender às suas próprias línguas. Agora o Mule pode trabalhar com a maioria das línguas européias (inclusive a russa e a grega) e do Este d'Ásia (a chinesa, a japonesa e a coreana), além do tailandês, vistnamita, hebraico, arábico, turco e outros. Estamos agora trabalhando intensamente para atender às línguas indianas (escrituras Devanagali).

Ao lado do atendimento a novas línguas, há também muitos aplicativos de contribuição que funcionam sobre o Mule, tais como ferramentas para procura on-line em dicionários, codificador e decodificador MIME. A existência dessas ferramentas prova que o Mule pode ser um banco de trabalho/ambiente multilingue, mais que um simples editor.

No momento estamos integrando o Mule para dentro do GNU Emacs original em cooperação com Free Software Foundation, a organização distribuidora do GNU Emacs. O futuro lançamento do GNU Emacs trará consigo funções multilingues do Mule.

Apêndice: Distribuição do Mule

O Mule é distribuído gratuitamente sob os termos do GNU GENERAL PUBLIC LICENSE. A Versão 2.3 do Mule é dispoível no anonymous ftp, a partir dos seguintes sites e muitos outros sites-espelho.