System/Docu/ru/Converters.odc

Converters

DEFINITION Converters;

	IMPORT Stores, Files, Dialog;

	CONST importAll = 0;

	TYPE
		Importer = PROCEDURE (f: Files.File; OUT s: Stores.Store);
		Exporter = PROCEDURE (s: Stores.Store; f: Files.File);

		Converter = POINTER TO RECORD
			next-: Converter;
			imp-, exp-: Dialog.String;
			storeType-: Stores.TypeName;
			fileType-: Files.Type;
			opts-: SET
		END;

	VAR list-: Converter;

	PROCEDURE Register (imp, exp: Dialog.String; storeType: Stores.TypeName; fileType: Files.Type;
										opts: SET);
	PROCEDURE Import (loc: Files.Locator; name: Files.Name; VAR conv: Converter; OUT s: Stores.Store);
	PROCEDURE Export (loc: Files.Locator; name: Files.Name; conv: Converter; s: Stores.Store);

END Converters.


Модуль Converters допускает определение и регистрацию файловых конверторов. Файловый конвертор - это импортер, который переводит файл в хранилище (обычно некоторого типа отображений), или экспортер, который переводит хранилище в файл, или импортер и экспортер одновременно. Для заданной пары (file type, store type) могут быть зарегистрированы несколько файловых конверторов, например, текст может быть переведен в ASCII файл с или без сиволов возврата каретки на концах строк.

Пример: ObxConvdocu


CONST importAll
Элемент множества opts процедуры Register. Он показывает, что импортер способен импортировать все типы файлов (например, импортер, который показывает содержимое файла как шестнадцатиричный дамп).


TYPE Importer
Этот процедурный тип является сигнатурой команды импортера. Импортер переводит данный файл f в хранилище s.

Предусловие
f # NIL	20
f имеет правильный тип	22

Постусловие
s # NIL


TYPE Exporter
Этот процедурный тип является сигнатурой команды экспортера. Экспортер переводит данное хранилище s в содержимое файла f. Файл f уже установлен как пустой новый (то есть, доступный для записи) файл.

Предусловие
s # NIL	20
f # NIL	21
f.Length() = 0	22
s имеет правильный тип	23

Постусловие
f.Length() >= 0


TYPE Converter
Объект конвертора представляет файловый конвертор. Он состоит из команд экспорта и импорта, одна из которых может быть пустой.  Конвертор выполняет преобразование между файлом и хранилищем.

next-: Converter
Следующий конвертор в списке. Конверторы сортируются по времени своей регистрации: поздняя регистрация означает дальнее положение в списке.

imp-, exp-: Dialog.String	imp # "" OR exp # ""
Строки для команд импорта/экспорта, например,
"HostTextConv.ImportText" или
"HostTextConv.ExportText".

storeType-: Stores.TypeName	exp # "" -> storeType # ""
Тип хранилища конвертора, например, "TextViews.TextView".

fileType-: Files.Type	fileType # ""
Тип файла конвертора, например, "TXT".

opts-: SET
Множество настроек, например, {} или {importAll}.


VAR list-: Converter
Список зарегистрировванных конверторов. Конверторы сортируются по времени их регистрации: поздняя регистрация означает дальнее положение в списке. Первый элемент в списке, то есть, list, всегде является конвертором документов, то есть, конвертором, используемым для стандартных файлов документов BlackBox.


PROCEDURE Register (imp, exp: Dialog.String; storeType: Stores.TypeName;
										fileType: Files.Type; opts: SET)
Регистрирует импортер, который переводит файл типа fileType в хранилище типа storeType (например, "TextViews.View"), или экспортер, который переводит хранилище типа storeType в файл типа fileType, или и тот и другой.
imp - это имя команды импортера, которая должна иметь сигнатуру Importer.
exp - это имя команды экспортера, которая должна иметь сигнатуру Exporter.
opts allows to express a set of options; currently only the element importAll is defined. Normally, opts is empty.
opts позволяет задавать набор настроек; пока определен только один элемент importAll. Обычно opts пустое.
Register не загружает сразу модули, который содержит команды импорта/экспорта. Они загружаются только при необходимости.
Стандартный конвертор документов уже установлен ядром BlackBox. Другие конверторы могут быть установлены модулем Config, например, конверторы ASCII файлов, файлов Unicode или графических файлов. При запуске BlackBox выполняется Config, что позволяет задавать особые конфигурации, например, наборы доступных конверторов.
В результате Register к list добавляется новый конвертор, поля которого соответствуют переданным параметрам.
Для каждого зарегистрированного импортера или экспортера может быть заданно соответствующее отображение строк; чтобы сделать показ списка импортеров/экспортеров более дружелюбным к пользователю. Например, импортер "HostTextConv.ImportText" может быть отображен в более говорящее имя "Ascii" (в стандартном диалоге открытия файла). Отображение задается в файле String в директории Rsrc подсистемы импортера, например, в тексте Host/Rsrc/Strings могут быть следующие строки:

	HostTextConv.ImportText	Ascii
	HostTextConv.ExportText	Ascii

Предусловие
imp # "" OR exp # ""	20
fileType # ""	21

PROCEDURE Import (loc: Files.Locator; name: Files.Name; VAR conv: Converter; OUT s: Stores.Store)
Преобразует содержимое файла, заданного (loc, name) в хранилище s, использую конвертор conv. Внутри процедуры происходит вызов процедуры импорта конвертора. Если conv = NIL, используется первые подходящий конвертор из списка list, который возвращается в параметре VAR.

Предусловие
loc # NIL	20
name # ""	21
conv = NIL OR conv.imp # ""	22
Тип файла (loc, name) = типу файла конвертора	23

PROCEDURE Export (loc: Files.Locator; name: Files.Name; conv: Converter; s: Stores.Store)
Преобразует хранилище s в новый файл (loc, name), используя конвертор conv. Внутри процедуры происходит вызов процедуры экспорта конвертора. Об успехе или провале сообщается в поле res локатора.

Преусловие
s # NIL	20
~ s IS Stores.Alien	21
loc # NIL	22
name # ""	23
conv = NIL OR conv.exp # ""	24
TypeOf(s) = типу хранилищ конвертора	25