|
<< Нажмите, чтобы показать Содержание >> Спецификация формата RVF |
В этом разделе содержится подробная информация о формате RichView Format (RVF).
Для разработки большинства приложений вам не нужно знать внутреннее устройство RVF, вся необходимая информация содержится в обзоре RVF.
{x} – ноль или более повторений элемента x;
{x}+ – одно или более повторений элемента x;
[x] – элемент x не обязателен;
xy – за элементом x идёт элемент y;
x | y – элемент x или элемент y;
'c' – символьная строка;
<n> – определяемый элемент.
<целое> – целое число, ['-']{<цифра>}+;
<цифра> ::= '0' | … | '9';
Целое число завершается ' ' (символом пробела) или концом строки; для простоты, мы не будем указывать символ пробела (то есть он будет включён <целое>).
<кс> – символы конца строки; обычно это символы CR+LF, CR или LF; перед бинарными данными перевод строки должен содержать оба символа CR и LF (#13#10).
<строка> – строка ANSI-символов (без символов CR, LF и #0)
<юникодная строка> – строка юникодных символов (UTF-16). Последним символом в строке должен быть разделитель абзаца (код $2029).
<спец. строка> – строка ANSI-текста, если версия RVF равна 1.3 или меньше, и текст UTF-8, если версия RVF равна 1.3.1 или больше. В этой строке символ #1 представляет символ #13, символ #2 представляет символ #10.
<спец. строка 2> – строка ANSI-текста, если версия RVF равна 1.3.1 или меньше, и текст UTF-8, если версия RVF равна 1.3.2 или больше. В этой строке символ #1 представляет символ #13, символ #2 представляет символ #10.
<строка в кавычках> – <спец. строка>, заключённая в двойные кавычки. Если в строку входит символ двойных кавычек, он повторяется дважды.
<RVF> ::= [<Инфо о версии>]{<Запись RVF>}
<Инфо о версии> := <Тип записи версии><Версия><Подверсия>[<Подподверсия>]<кс>
<Тип записи версии> ::= '-8'
<Версия> ::= <целое>
<Подверсия> ::= <целое>
<Подподверсия> ::= <целое>
▪В настоящий момент, <Версия> = 1, <Подверсия> = 3, <Подподверсия> = 2. В этой версии имена элементов документа, теги и строковые свойства хранятся как UTF-8.
▪Ранее использовалось: <Версия> = 1, <Подверсия> = 3. <Подподверсия> = 1 для Delphi 2009+; для более старых Delphi <Подподверсия> не писалась. В этой версии, имена элементов документе хранились как ANSI, теги и строковые свойства хранились как UTF-8 если <ПодПодВерсия> = 1, или ANSI если <ПодПодВерсия> = 0 пропущена.
▪Если <Инфо о версии> отсутствует в RVF, подразумевается версия 1.0 (без <Параметры элемента> в <Элемент RVF>)
RVF состоит из записей. Большинство записей представляют элементы документа (одна запись = один элемент), но есть специальные типы записей.
<Запись RVF> ::= <Заголовок записи><кс>({<строка><кс>}|{<юникодная строка>})[<Бинарные данные>]
<Заголовок записи> ::= <Тип записи><Число строк><Абзац><Параметры элемента><Запрос><Тег><Остаток заголовка>
<Тип записи> ::= <целое>
<Число строк> ::= <целое>
<Абзац> ::= <целое>
<Параметры элемента>::=<целое>
<Запрос> ::= '0' | '1' | '2' | '3'
<Тег> ::= <строка в кавычках>
<Тип записи> – это тип <Записи RVF>
<Тип записи> |
Константа |
Описание |
>=0 |
— |
текст; <Тип записи> – это номер элемента коллекции стилей текста (RVStyle.TextStyles) |
< 0 |
Константа rvs*** |
нетекстовый элемент или особый объект (см. строки ниже) |
-2 |
rvsCheckpoint |
|
-7 |
rvsBack |
устаревшая версия сохранения фона документа |
-13 |
rvsBackEx |
фон документа |
-8 |
rvsVersionInfo |
версия RVF (только в <Инфо о версии>) |
-9 |
rvsDocProperty |
стили текста, абзацев, списков; данные разметки документа; DocProperties, DocParameters |
<Число строк> – это количество строк между этим <Заголовок записи> и следующим <Заголовок записи> (или концом файла). Если программа для чтения RVF не понимает этот тип записи, она должна пропустить это количество строк. <Бинарные данные> (если присутствуют) считаются одной из строк после заголовка.
<Абзац> – это номер элемента коллекции стилей абзацев (RVStyle.ParaStyles) (если этот элемент начинает абзац) или -1 (если запись представляет собой элемент, и этот элемент продолжает абзац).
<Параметры элемента> – это набор битов, преобразованных в целое число.
Номер бита |
Описание |
0 |
Установлен если элемент продолжает абзац (когда <Абзац>=-1); это избыточные данные; |
1 |
Разрыв страницы. Установлен если элемент начинает новую страницу (<Абзац><>-1) |
2 |
Установлен если элемент должен отображаться с новой строки, но не начинать новый абзац (в данном случае <Paragraph><>-1, но должен соответствовать стилю абзаца предыдущего элемента, не равного -1). |
3 |
Установлен если элемент содержит юникодный текст. |
<Тег> – это строка, ассоциированная с элементом документа. TRichView сохраняет это строку в двойных кавычках. Пустые теги сохраняются как '0' (без кавычек). В RVF 1.3.1 и более новых версиях строки тегов сохраняются в кодировке UTF-8, а в более старых версиях – в ANSI. При сохранении символы #13 и #10 заменяются на #1 и #2, при загрузке они восстанавливаются.
См. раздел о тегах.
<Запрос> может быть числом в диапазоне 0..3
<Запрос> |
Описание |
0 |
Содержимое элемента сохраняется в текстовой форме (опция rvfoSaveBinary исключена из RichView.RVFOptions). |
1 |
Содержимое элемента запрашивается при загрузке, см. далее. |
2 |
Содержимое элемента сохраняется в бинарной форме (опция rvfoSaveBinary включена в RichView.RVFOptions). |
3 |
Особое значение для сохранения юникодного текста в форме шестнадцатеричной строки. |
Если <Запрос>=1, то следующей строкой за заголовком следует имя элемента (рисунка или компонента).
Данные запрашиваются событиями: OnRVFPictureNeeded, OnRVFControlNeeded.
Режим сохранения (сохранение полной информации о рисунках или компонениах / сохранение только имени и запрос при чтении) определяется свойством RichView.RVFOptions (для режима запроса необходимо убрать опции rvfoSavePicturesBody и/или rvfoSaveControlsBody). В этом событии необходимо создать компонент или изображение и присвоить его параметрам gr или ctrl. Например:
procedure TMyForm.MyRichViewRVFControlNeeded(
Sender: TCustomRichView; Name: TRVUnicodeString;
Tag: TRVTag; var ctrl: TControl);
begin
ctrl := TButton.Create(nil);
TButton(ctrl).Caption := 'Demo';
TButton(ctrl).OnClick := MyClickProcedure;
end;
<Остаток заголовка> отличается для различных элементов. Некоторые новые параметры могут быть добавлены в будущем в <Остаток заголовка>. При чтении RVF следует игнорировать все параметры, следующие в строке после последнего поддерживаемого параметра.
Если <Запрос> равен 1 то <Остаток заголовка> пуст.
Информация далее для <Запрос>=0 | 2 | 3.
<Тип записи> = rvsCheckpoint
<Абзац> игнорируется
<Число строк> = 1
<Остаток заголовка> ::= <Флаг события>
<Флаг события> ::= '0' | '1'
Если <Флаг события> равен '1', то событие OnCheckPointVisible вызывается, когда закладка становится видимой при прокрутке документа.
Строки после заголовка записи:
▪<Имя закладки>
<Имя закладки> ::= <спец. строка>
Закладки не являются элементами документа, но удобно сохранять их таким же образом. Закладка сохраняется перед элементом, к которому она привязана.
В отличие от всех остальных записей, одна запись этого типа может представлять несколько элементов с одинаковыми свойствами.
<Тип записи> >= 0
<Остаток заголовка> := [<Доп. свойства>] [<Подсказка>]
<Подсказка> := <строка в кавычках>, значение свойства rvespHint.
<Доп свойства> := +<строка в кавычках>
<Число строк> равно числу абзацев, содержащихся в этой записи. Все абзацы будут указанного стиля текста и абзаца. Если <Абзац>=-1, то этот элемент продолжает предыдущий абзац.
Строки после заголовка записи – это текст (абзацы). Строки могут быть в юникодной кодировке (определяется в <Параметры элемента>). Если <Запрос>=0, юникодный текст сохранён как UTF-16 (WideString). Если <Запрос>=3, юникодный текст сохранён как шестнадцатеричная строка.
<Доп. свойства> не сохраняются по умолчанию. Они могут быть использованы для сохранения дополнительных свойств элементов, унаследованных от TRVTextItemInfo.
<Тип записи> = rvsBreak
<Абзац> игнорируется
<Остаток заголовка> ::= <Цвет линии><Стиль линии><Толщина линии> [<Непрозрачность цвета>]
<Цвет линии> ::= <целое>
<Стиль линии> ::= <целое>
<Толщина линии> ::= <целое>
<Цвет линии> – это цвет горизонтальной линии, TColor; если он равен clNone, то линия будет иметь цвет 0-го стиля текста. Версия FMX может также сохранить <Непрозрачность цвета>, значение от 0 до 255.
<Стиль линии> – это значение TRVBreakStyle, сохранённое как число.
<Толщина линии> это толщина линии.
<Число строк> >= 0.
<Тип записи> = rvsPicture
<Число строк> >= 3
<Остаток заголовка> = <Вертикальное выравнивание>
<Вертикальное выравнивание> ::= <целое>
<Вертикальное выравнивание> – это значение TRVVAlign, сохранённое как число.
Строки после заголовка:
▪<Имя элемента>
▪<Delphi-тип рисунка>
▪<Данные рисунка>
<Имя элемента> ::= <спец. строка 2>, это имя элемента документа.
<Delphi-тип рисунка> – это имя графического класса (такое как 'TBitmap', 'TIcon', 'TMetafile', 'TJPEGImage') или расширение графического класса ('bmp', 'ico', 'wmf', 'jpg')
<Данные рисунка> могут быть в текстовом или бинарном формате.
В текстовом формате, каждый байт представлен двумя шестнадцатеричными цифрами, поэтому все данные закодированы как одна строка.
В бинарном формате, <кс> после <Delphi-тип рисунка> должен быть CR+LF (оба символа). Бинарные данные состоят из <Размер данных> и <Данные>. Размер данных – это двоичное 4-байтовое число, число байт в <Данные>.
Примечание 1: [VCL и Lazarus] Для загрузки изображения заданного класса из RVF необходимо зарегистрировать этот класс с помощью процедуры RegisterClasses. Стандартные графические классы ТРВ-Редактор регистрирует самостоятельно. Если класс не зарегистрирован, TRichView может определить формат изображения по содержимому и самостоятельно выбрать соответствующий графический класс.
Примечание 2: Поведение TRichView при загрузке незарегистрированного графического формата определяется в свойстве RVFOptions. Если включена опция rvfoIgnoreUnknownPicFmt, то это изображение будет просто пропущено. Если эта опция не исключена, функция чтения RVF возвращает False (ошибка чтения). В обоих случаях свойство RVFWarnings будет содержать значение rvfwUnknownPicFmt.
<Тип записи> = rvsComponent
Всё как для рисунков, с поправкой на: rvfoIgnoreUnknownCtrls, rvfwUnknownCtrls.
<Тип записи> = rvsBullet
<Число строк> >= 1
<Остаток заголовка> = <Номер ImageList><Номер изображения>
<Номер ImageList> ::= <целое>
<Номер изображения> ::= <целое>
Строки после заголовка:
▪<Имя элемента>
<Имя элемента> ::= <спец. строка 2>, это имя элемента документа.
<Номер ImageList> – это значение свойства Tag соответствующего компонента TImageList (не следует путать с тегами элементов документа! Здесь используется свойство TImageList.Tag). При чтении вызывается событие OnRVFImageListNeeded. Вы должны присвоить компонент TImageList параметру il события. В противном случае значок будет пропущен. Поведение TRichView при чтении слишком большого номера изображения задаётся в RVFOptions. Если опция rvfoConvLargeImageIdxToZero включена, то номер изображения будет сброшен в 0. В противном случае функция чтения RVF возвращает False (ошибка чтения). В обоих случаях свойство RVFWarnings будет содержать значение rvfwConvLargeImageIdx.
<Тип записи> = rvsHotspot
<Число строк> >= 1
<Остаток заголовка> = <Номер ImageList><Номер изображения><Активный номер изображения>
<Номер ImageList> ::= <целое>
<Номер изображения> ::= <целое>
<Активный номер изображения> ::= <целое>
Строки после заголовка:
▪<Имя элемента>
<Имя элемента> ::= <спец. строка 2>, это имя элемента документа.
См. описание обычного значка выше.
<Тип записи> = rvsDocProperty
<Абзац> игнорируется
<Запрос> может быть 0 (данные сохранены как шестнадцатеричный текст) или 2 (данные сохранены в бинарной форме)
<Остаток заголовка> ::= '1' | '2' | '3' | '4' | '5' | '6'|'7'|'8'|'9'|'10'|'11'|'12'|'13'
<Остаток заголовка> |
Описание |
1 |
Коллекция стилей текста (Style.TextStyles) |
2 |
Коллекция стилей абзаца (Style.ParaStyles) |
3 |
Разметка (поля, BiDiMode, MaxTextWidth, MinTextWidth) |
4 |
Коллекция стилей списков (Style.ListStyles) |
5 |
|
6 |
Специальная информация, записываемая компонентом TRVReportHelper при сохранении страницы |
7 |
|
8 |
Поддокумент (колонтитул) |
9 |
RVStyle.Units |
10 |
Коллекция шаблонов стилей (Style.StyleTemplates) |
11 |
Список имён шаблонов стилей |
12 |
|
13 |
<Число строк> = 2 для 1..4 и 6, 7, 10. Первая строка содержит имя компонента TRVStyle для 1,2,4,10, или пустая для 3,6,9,12. Затем следует шестнадцатеричные или бинарные данные.
При сохранении DocProperties, <Число строк>=DocProperties.Count. Каждый элемент DocProperties сохраняется как <спец. строка>.
DocParameters сохраняются строками вида свойство=значение (только для свойств, имеющие значение, отличное от значения по умолчанию).
Для 8, первая строка содержит название поддокумента (такое как 'header').
Для 11, каждый шаблон стиля сохраняется в двух строках, поэтому <Число строк>=StyleTemplates.Count*2. Первая строка содержит имя шаблона (<спец. строка>), вторая строка содержит его идентификатор.
Для 12, DocObjects сохраняются с помощью специального класса-коллекции TRVCollectionBuilder, позволяющего сохранять элементы коллекции различных классов.
Для 13, следующая строка содержит число (<целое>).
Это устаревший тип записи. Он может быть прочитан, но не сохраняется новыми версиями ТРВ-Редактора
<Тип записи> = rvsBack
Эта запись похожа на rvsPicture, но имеет отличия:
▪<Остаток заголовка> содержит цвет и стиль фона, и опционально его непрозрачность.
▪отсутствует строка <Имя элемента>;
▪<Delphi-тип рисунка> всегда 'TBitmap'
▪<Запрос>=1 не поддерживается
<Число строк> = 2 | 0
<Абзац> и <Тег> игнорируются (0).
<Остаток заголовка>::=<Стиль фона><Цвет> [<Непрозрачность цвета>]
<Стиль фона>::= <целое> (значение TRVBackgroundStyle, сохранённое как число)
<Цвет>::=<целое> (цвет фона)
Версия FMX может сохранять <Непрозрачность цвета>, значение от 0 до 255.
Если стиль фона равен bsNoBitmap (если если фоновые изображение пусто), то после заголовка нет строк (и <Запрос>=0).
Строки после заголовка:
▪<Delphi-тип рисунка>
▪<Данные рисунка>
Цвет фона сохраняется как TColor, даже в версии FireMonkey. Версия FireMonkey также может сохранять степень непрозрачности цвета (значение от 0 до 255).
<Тип записи> = rvsBackEx
<Остаток заголовка>::=<Цвет> [<Непрозрачность цвета>]
Цвет фона сохраняется как TColor, даже в версии FireMonkey. Версия FireMonkey также может сохранять степень непрозрачности цвета (значение от 0 до 255).
Если фоновое изображение отсутствует, и все свойства имеют значения по умолчанию, <Число строк> = 0. В противном случае оно равно числу строк после заголовка:
▪<Delphi-тип рисунка> | 'none'
▪<Свойство фона>*
▪<Данные рисунка>
<Delphi-тип рисунка> – это имя графического класса (такое как 'TBitmap', 'TIcon', 'TMetafile', 'TJPEGImage') или расширение графического класса ('bmp', 'ico', 'wmf', 'jpg')
<Данные рисунка> такие же, как для рисунков (см. выше). Сохраняется только если первая строка после заголовка не равна 'none'.
<Свойство фона> это свойство BackgroundProperties.
<Свойство фона> ::= <Свойство> '=' <Значение>
<Свойство> ::= 'HorizontalAlignment' | 'VerticalAlignment' | 'HorizontalSizeKind' | 'VerticalSizeKind' | 'HorizontalOffsetKind' | 'VerticalOffsetKind' | 'HorizontalOffset' | 'VerticalOffset' | 'ImageWidth' | 'ImageHeight' | 'Attachment' | 'HorizontalRepeat' | 'VerticalRepeat' | 'Visible'
<Значение> ::= <целое> (значение свойства, сохранённое как целое число)
<Тип записи> = rvsMarker
<Число строк> >= 0
<Остаток заголовка> ::= <Номер списка> <Номер уровня> <Начальное значение> <Сброс>
Все элементы <Остаток заголовка> являются <целое> (<Сброс> равен ord(значение Boolean))
<Тип записи> = rvsLabel
<Число строк> >= 6
Строки после заголовка:
▪<Текст>
▪<Стиль текста>
▪<Минимальная ширина>
▪<Выравнивание>
▪'protect' | 'no protect'
▪<Имя элемента>
<Текст> ::= <спец. строка>, это свойство Text. <Стиль текста> ::= <целое>, это свойство TextStyleNo. <Минимальная ширина> ::= <целое>, это свойство MinWidth. <Выравнивание> ::= <целое>, это ord(Alignment). Следующая строка зависит от свойства ProtectTextStyleNo. <Имя элемента> ::= <спец. строка 2>.
<Тип записи> = rvsSequence
<Число строк> >= 10
Строки после заголовка:
▪<Идентификатор последовательности>
▪<Тип нумерации>
▪<Сброс>
▪<Начальное значение>
▪<Стиль текста>
▪<Минимальная ширина>
▪<Выравнивание>
▪'protect' | 'no protect'
▪<Имя элемента>
▪<Строка формата>
<Идентификатор последовательности> ::= <спец. строка>, это свойство SeqName. <Тип нумерации> ::= <целое>, это ord(NumberType). <Сброс> ::= <целое>, это ord(Reset). <Начальное значение> ::= <целое>, это StartFrom. Следующие пять строк имеют те же значения, что и для текстовой метки. <Строка формата> ::= <спец. строка>, это свойство FormatString.
<Тип записи> = rvsFootnote | rvsEndnote
<Число строк> >= 8
Строки после заголовка:
▪<Стиль текста>
▪<Минимальная ширина>
▪<Выравнивание>
▪'protect' | 'no protect'
▪<Сброс>
▪<Начальное значение>
▪<Имя элемента>
▪<Документ>
Этот элемент имеет 7 строк с такими же значениями, что у последовательности.
<Документ> может храниться в текстовом или бинарном формате. Это значение свойства Document, сохранённое в формате RVF.
В текстовом формате каждый байт представляется двумя шестнадцатеричными цифрами, поэтому все данные кодируются в одной строке.
В бинарном формате <кс> после <Имя элемента> должно быть CR+LF (оба символа). Бинарные данные состоят из <Размер данных> и <Данные>. Размер данных – это 4-байтовое двоичное число, количество байтов в <Данные>.
<Тип записи> = rvsNoteReference
<Число строк> >= 5
Строки после заголовка:
▪<Стиль текста>
▪<Минимальная ширина>
▪<Выравнивание>
▪'protect' | 'no protect'
▪<Имя элемента>
Значение этих строк такое же, как и у текстовых меток.
Некоторые элементы могут содержать дополнительные целочисленные и строковые свойства. Они сохраняются в виде строк после заголовка (одна строка на каждое свойство) в следующем формате:
свойство=значение
Если свойство имеет значение по умолчанию, оно не сохраняется. Список имён свойств можно найти в файле RVItem.pas, в массивах RVFExtraItemIntPropNames и RVFExtraItemStrPropNames.
Начиная с ТРВ-Редактора версии 11, значения сохраняются как <спец. строка>.
Обратите внимание, что все свойства-цвета сохраняются как значения TColor, даже в FireMonkey (где все свойства цвета имеют тип TAlphaColor). В дополнение к самому цвету, версия FireMonkey может сохранить дополнительное свойство непрозрачности цвета (со значением от 0 до 255).
Данная спецификация не охватывает случай сохранения имён стилей вместо номеров стилей (эта функция устарела).
Версия RVF 1.2
Более старые программы не могут читать новые RVF-файлы, но программы, скомпилированные с новыми версиями ТРВ-Редактора, могут читать старые RVF-файлы.
Наиболее значительное изменение – добавление <Параметры элемента> в <Заголовок записи>.
Появились два новых типа записей: -7 (фоновая информация) и -8 (информация о версии).
Программа, читающая RVF, считывает номер версии из информации о версии. Если элемент информации о версии отсутствует, она понимает файл как RVF версии 1.0.
Версия RVF 1.3 (используемая ТРВ-Редактором до версии 17.3 в Delphi 2007 и старее):
▪позволяет сохранять пробелы в строках тегов (для Delphi 3+); строки тегов сохраняются в двойных кавычках;
▪В текстовом режиме юникодный текст сохраняется как шестнадцатеричная строка (каждый байт сохраняется как два символа – шестнадцатеричные цифры).
Версия RVF 1.3 (используемая ТРВ-Редактором до версии 17.3 в Delphi 2009 и новее):
▪DocProperties, дополнительные строковые свойства, теги элементов (если rvoTagsArePChars в Options; примечание: начиная с ТРВ-Редактора версии 3.2, теги всегда являются строками), имена стилей (если rvfoUseStyleNames в RVFOptions) сохраняются как UTF-8 (с символами CR и LF, заменёнными на #1 и #2)
Версия RVF 1.3.2 (текущая):
Имена элементов сохраняются как UTF-8.
Изменения в ТРВ-Редакторе версии 1.3:
Теперь RVF может содержать текст в формате Юникод (для текстовых элементов). Более старые версии не смогут загружать файлы с текстом в формате Юникод. Номер версии в заголовке RVF не изменился, поскольку в спецификации нет изменений (только дополнения).
Примечание: Юникод используется только для сохранения текстовых элементов в формате Юникод, поэтому файл содержит смесь текста ANSI и Юникод. Такие файлы следует рассматривать как бинарные, не редактируйте их в текстовых редакторах.
Изменения в ТРВ-Редакторе версии 1.4:
Добавлено: таблицы (rvsTable). Это не изменение в RVF, а дополнение.
Таблицы сохраняются в двоичном или шестнадцатеричном текстовом формате, аналогично рисункам или компонентам.
Изменения в ТРВ-Редакторе версии 1.5:
Теперь RVF может содержать стили текста и абзацев (rvsDocProperty). Это не изменение RVF, а дополнение.
Стили сохраняются в двоичном или шестнадцатеричном текстовом формате, аналогично рисункам или компонентам.
Изменения в ТРВ-Редакторе версии 1.7:
Теперь RVF может содержать информацию о разметке и коллекцию стилей списков (rvsDocProperty). Это не изменение в RVF, а дополнение.
Изменения в ТРВ-Редакторе версии 1.8
Номер версии RVF изменён на 1.3
Изменения в ТРВ-Редакторе версии 11
Номер версии RVF изменён на 1.3.1 для Delphi 2009 и новее. Значения дополнительных свойств элемента сохраняются как <спец. строка>, что позволяет им содержать символы переноса строки.
Изменения в ТРВ-Редакторе версии 13
Сохранение единиц измерения. Возможность указания размеров в твирах.
Изменения в ТРВ-Редакторе версии 17.2
Номер версии RVF изменён на 1.3.2. Имена элементов документа сохраняются как <спец. строка 2>, то есть UTF-8.
Изменения в ТРВ-Редакторе версии 23.3
Запись rvsBack устарела. Теперь используется rvsBackEx.