Перейти к оглавлению, на следующую или предыдущую страницу.


Расширение Универсального конвертера

Описания таблиц преобразований СОЛУНИ содержатся в стандартных файлах реестра OpenOffice.org (они имеют формат xml и расширение xcu). Информация из этих файлов добавляется в реестр OpenOffice.org всякий раз, когда Вы устанавливаете СОЛУНЬ с помощью утилиты unopkg или средства управления расширениями OpenOffice.org. Впоследствии эта информация легко может быть извлечена при помощи стандартных методов работы с реестром, предусмотренных в API OpenOffice.org. Таким образом, чтобы дополнить СОЛУНЬ новыми таблицами преобразований, Вам необходимо написать собственный файл .xcu по образцу уже имеющихся в дистрибутиве (они находятся в каталоге «ConvTables»), упаковать их вместе с СОЛУНЬЮ, после чего заново установить ее. Если у Вас нет опыта работы с форматом .xcu, обратитесь к руководству разработчика OpenOffice.org.

Каждое описание таблицы преобразований должно соответствовать правилам, заданным в файле ConvTables.xcs. Некоторые из этих правил разъясняются ниже.

Формат таблиц преобразований

Поскольку таблицы преобразований СОЛУНИ (подобно описаниям методов ввода) представляют собой стандартные файлы .xcu, они должны содержать корневой элемент oor:component-data со следующими атрибутами:

xmlns:oor="http://openoffice.org/2001/registry" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
oor:name="ConvTables" 
oor:package="org.openoffice.comp.thessalonica"

Параметры oor:name и oor:package означают, что информация из данного файла должна быть помещена в файл реестра OpenOffice.org под названием ConvTables.xcu, после чего к ней можно бужет обращаться по адресу org.openoffice.comp.thessalonica.ConvTables/.

У узла oor:component-data имеется только один потомок, под названием Root. Тот, в свою очередь, может иметь несколько дочерних узлов, каждый из которых содержит описание определенной таблицы преобразований. Рекомендуется помещать каждое такое описание в отдельный файл. При этом, поскольку такой файл будет содержать строки 8-битного текста, ему логичнее всего назначить кодировку ISO-8859-1, хотя при инсталляции пакета OpenOffice.org соединит все таблицы вместе и перекодирует их в UTF-8.

Каждый узел, содержащий описание таблицы преобразований, должен иметь свойство Title (в нем содержится отображаемое имя конвертера, предназначенное для пользовательского интерфейса), а также один дочерний узел под названием Rules. В этом узле будет содержаться набор правил для преобразования текста.

Каждое правило преобразования устанавливает соответствие между определенной последовательностью символов Unicode и одной или несколькими последовательностями 8-битных символов. Поскольку формат .xcu требует, чтобы для каждого узла использовалось уникальное имя, узлы правил именуются в соответствии с тем же соглашением, основанным на AGL, что и правила интерпретации клавиатурного ввода в описаниях методов ввода СОЛУНИ. Однако в данном случае эти имена не имеют принципиального значения и никак не используются конвертером.

Для описания каждого правила преобразования используется следующий набор свойств:

string-list ANSI

Задает одну или несколько строк 8-битных символов в той кодировке, которую описывает данная таблица преобразований. Следует иметь в виду, что OpenOffice.org по умолчанию рассматривает символ пробела в качестве разделителя для всех подобных ключей реестра, содержащих какой-либо список значений. Если это соглашение Вас не устраивает (например, потому что пробелы уже присутствуют в Ваших строках 8-битных символов), необходимо явным образом указать свойство oor:separator для каждого списка таких строк, подобно тому, как это сделано в приведенных ниже образцах.

int-list Unicode

Задает один или несколько индексов юникодовых символов, соответствующих строке или строкам 8-битных символов, к которым применимо данное правило. Для этих значений рекомендуется использовать шестнадцатеричную форму записи, хотя OpenOffice.org автоматически преобразует все числа в десятичное представление, добавляя информацию из файла в свой реестр. Обратите внимание на то, что данный список имеет иное значение по сравнению с тем, который можно указать для свойства ANSI: им задается не несколько альтернативных строк, но одна-единственная строка, представленная в виде последовательности индексов Unicode.

boolean ANSIToUni

Указывает, применимо ли данное правило для преобразования из ANSI в Unicode.

boolean UniToANSI

Указывает, применимо ли данное правило для преобразования из Unicode в ANSI.

string-list Comment

Комментарий. Как правило, должен содержать каноническое имя юникодового символа (или последовательность имен таких символов), к которому применимо данное правило.

Приведенный выше список свойств требует некоторых пояснений. В более ранних версиях СОЛУНИ можно было сопоставить только одну 8-битную строку одному-единственному символу Unicode, который должен был быть представлен целочисленным значением. Основная причина того факта, что 8-битная строка сопоставлялась некоему числу, а не другой строке, на сей раз составленной из юникодовых символов, заключалась в том, что я счел предпочтительной кодировкой для 8-битных строк кодовую страницу ISO-8859-1, которую было бы невозможно использовать в юникодовом XML-файле. Однако из данного подхода вытекало одно серьезное ограничение: предполагалось, что любой корректный акцентированный символ, соответствующий одному или нескольким знакам в соответствующей 8-битной кодировке, может быть закодирован единственным индексом Unicode. Такая схема неплохо работала для политонического греческого, но для многих других языков и систем письменности она определенно оказалась бы некорректной, тем более, что согласно текущей политике Unicode Consortium в эту кодировку могут добавляться новые дополняющие значки и базовые символы, но не готовые акцентированные комбинации. Более того, даже в случае с греческим данная схема вызывала определенные проблемы: в частности, было невозможно обеспечить корректное преобразование комбинаций епсилона и омикрона с облеченным ударением, присутствующих в кодировке WinGreek, поскольку единственно правильным юникодовым представлением для этих символов было бы сочетание буквы с отдельно набранным надстрочным знаком. Изменение типа значения для свойства Unicode с int на int-list в СОЛУНИ версии 3.0 решает эту проблему, поскольку таким образом становится возможным задать несколько индексов Unicode в рамках одного правила. Следующий пример из таблицы преобразований для кодировки WinGreek демонстрирует эту возможность:

<node oor:name="epsilon_uni0342" oor:op="replace">
   <prop oor:name="ANSI" oor:type="oor:string-list">
      <value>ü</value>
   </prop>
   <prop oor:name="Unicode" oor:type="oor:int-list">
      <value oor:separator=";">0x03B5;0x0342</value>
   </prop>
   <prop oor:name="ANSIToUni" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="UniToANSI" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="Comment" oor:type="oor:string-list">
      <value>GREEK SMALL LETTER EPSILON;COMBINING GREEK PERISPOMENI</value>
   </prop>
</node>

Другое существенное усовершенствование, введенное в СОЛУНИ версии 3.0, состоит в том, что теперь можно в рамках одного и того же правила сопоставить тому же самому символу Unicode (или последовательности таких символов) несколько 8-битных строк. Конвертер будет искать все такие строки в процессе преобразования из соответствующей 8-битной кодировке в Unicode, но при обратном преобразовании будет учитываться только первая из них. Данная возможноть была введена главным образом для того, чтобы облегчить обработку тех случаев, когда в устаревших 8-битных кодировках допускалась различная последовательность набора акцентов, в результате чего оказывались возможными разные представления одного и того же акцентированного символа.

Рассмотрим в качестве образца несколько правил из таблицы преобразования для греческой кодировки фирмы Linguist’s software. В греческих шрифтах от Linguist’s software точка с запятой соответствует тупому ударению, а косая черта — подписной йоте. Поскольку комбинируемые диакритические знаки можно набирать в любой последовательности, строки символов «a;/» и «a/;» будут одинаково соответствовать одному и тому же символу Unicode с кодом 0x1FB2 — «GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI». До выхода СОЛУНИ 3.0 единственно возможным вариантом обработки этой ситуации было создание двух отдельных правил преобразования, как в следующем примере:

<node oor:name="uni1FB2" oor:op="replace">
   <prop oor:name="ANSI" oor:type="xs:string>"
      <value>a/;</value>
   </prop>
   <prop oor:name="Unicode" oor:type="xs:int">
      <value>0x1FB2</value>
   </prop>
   <prop oor:name="ANSIToUni" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="UniToANSI" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="Comment" oor:type="xs:string">
      <value>GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI</value>
   </prop>
</node>
<node oor:name="uni1FB2.alt" oor:op="replace">
   <prop oor:name="ANSI" oor:type="xs:string">
      <value>a;/</value>
   </prop>
   <prop oor:name="Unicode" oor:type="xs:int">
      <value>0x1FB2</value>
   </prop>
   <prop oor:name="ANSIToUni" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="UniToANSI" oor:type="xs:boolean">
      <value>false</value>
   </prop>
   <prop oor:name="Comment" oor:type="xs:string">
      <value>GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI</value>
   </prop>
</node>

Обратите внимание, что оба варианта представления акцентированного символа могут встретиться в тексте, набранном вручную, но для автоматического преобразования из Unicode в греческую кодировку Linguist’s software вполне достаточно только одного из них. Поэтому для первого правила обоим свойствам ANSIToUni и UniToANSI присвоено значение «Истина», в то время как во втором случае свойство UniToANSI возвращает значение «Ложь». Однако СОЛУНЬ 3.0 позволяет уменьшить количество правил преобразования, тем самым сделав всю таблицу более читаемой. Нижеследующий образец показывает, как с помощью нового синтаксиса можно описать ту же самую ситуацию в единственном правиле (обратите внимание на свойство oor:separator, которое здесь используется для того, чтобы сообщить OpenOffice.org, что 8-битные строки разделены запятыми):

<node oor:name="uni1FB2" oor:op="replace">
   <prop oor:name="ANSI" oor:type="oor:string-list>"
      <value oor:separator=",">a/;,a;/</value>
   </prop>
   <prop oor:name="Unicode" oor:type="oor:int-list">
      <value>0x1FB2</value>
   </prop>
   <prop oor:name="ANSIToUni" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="UniToANSI" oor:type="xs:boolean">
      <value>true</value>
   </prop>
   <prop oor:name="Comment" oor:type="oor:string-list">
      <value>GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI</value>
   </prop>
</node>

Может возникнуть вопрос, почему переключатель UniToANSI был сохранен в СОЛУНИ версии 3.0, хотя при новом синтаксисе более нет необходимости задавать ему значение «Ложь». Действительно, это свойство теперь не следует задействовать для того, чтобы выделить из набора равнозначных 8-битных строк ту, которая будет использоваться при преобразовании из Unicode в соответствующую кодировку; однако оно всё еще может быть полезным в тех случаях, когда замена некоего юникодового символа на 8-битный аналог нежелательна, даже не смотря на то, что его корректное представление с помощью данной 8-битной кодировки вполне возможно. Это может касаться, например, стандартных знаков препинания и цифр.


Перейти к оглавлению, на следующую или предыдущую страницу.