"Пишем программу для создания книг FB2." - читать интересную книгу автора (Карпов Юрий)

Читаем текстовый файл

При чтении текстового файла, к каждой строчке прибавляется начало ' N| ' т. к. форматирование еще не сделано и все строки одинаково обычны.


// начало кода

procedure LoadTXT(FName: string);

var

L: TStringList;

i, j: integer;

s, ss: string;

begin


L:= TStringList.Create; // создаем временный список

L.LoadFromFile(fname); // читаем из файла // можно сделать грамотнее с помощью try

for i:= 0 to L.Count - 1 do// просматриваем текст

begin

s:= ''; ss:= L[i];

for j:= 1 to length(Ss) do

begin // просматриваем строку

case ss[j] of

'lt;': S:= S + 'amp;#60;'; // знак lt; вызывает сбой в читалке. т. к. она думает что дальше следует тэг

'gt;': S:= S + 'amp;#62;'; // заменяем, на всякий случай

'^': S:= S + 'amp;#94;'; // этот символ будет использован в служебных целях

'~': S:= S + 'amp;#126;'; // - // -

'amp;': S:= S + 'amp;#38;';

else S:= S + ss[j]; // иначе, претензий нет, символ добавляем к строке

end; // case

end; // обработка строки завершена

L[i]:= ' N| ' + S; // в начало каждой строки вводим указатель стиля Normal

end; // обработка текста завершена

Form1.ListBox1.Items.Assign(L); // сбрасываем список в ListBox

L.Free; // удаляем временный список

end;

// конец кода


Если файл считан, теперь мы можем его форматировать.

Просматриваем текст книги, выделяем нужную строку, выбираем необходимый стиль и нажимаем кнопку

[gt;]

При этом вызывается процедура ChangeStyle(TmyStyle(RG.itemindex));

Как параметр она получает стиль из радио - списка RG.

К сожалению это все делать надо ручками. Конечно, возможна некая автоматизация, но пока идет речь об упрощенной программе…


Процедура считывает выделенную строку из списка ListBox1, удаляет сведения о типе и записывает строку на старое место с новым стилем.


// начало кода

procedure ChangeStyle(LStyle: TmyStyle);

var

n, curIndex: integer;

S: string;

begin

with Form1.ListBox1 do

begin

curIndex:= ItemIndex; // читаем текущий индекс в списке ListBox

if curIndex = -1 then exit; // если ничего не выделено выходим


S:= Items[curIndex]; // считываем текущую строку

n:= pos('|', s); // находим разделитель

/ / хотя это лишнее, n всегда = 4 / когда писал это еще не было ясно, утрясался формат…

// в окончательном варианте n можно удалить

delete(S, 1, n+1); // удаляем информацию о стиле

// Записывается строка с новым стилем. Приводить SetStyle не буду, она очень простенькая

Items[curIndex]:= SetStyle1(LStyle)+ S;

if ItemIndex lt; Items.Count - 1

then ItemIndex:= ItemIndex+1;

SetFocus; // активным снова становится список с содержимым книги.

end;

end;

// конец кода


(Одно предложение: можно, и не трудно, предоставить пользователю возможность возврата старого стиля)


Теперь о расстановке заголовков

Для этой работы предназначены три кнопки: [+] [H1] [-]. Вообще-то средняя кнопка будем менять свое название, и показывать этим текущий (в данном месте текста) стиль заголовка.

Посмотрим, как это делается:

При любом клике на ListBox вызывается процедура ShowHeadStyle ее параметром является индекс выделенной строки.


// начало кода

procedure ShowHeadStyle(n: integer);

var

LStyle: TmyStyle;

begin

LStyle:= ScanUpStyle(n); // получаем тип заголовка к которому относится эта строка

Form1.Button2.Caption:= SetStyle(LStyle); // меняем название кнопки

Form1.Button2.Tag:= integer(LStyle); // запоминаем этот стиль, чтобы потом меньше возиться.

end;

// конец кода


Теперь посмотрим, как мы получаем информацию о стиле.

Элементарно, Ватсон!


// начало кода

function ScanUpStyle(n: integer):TmyStyle;

var

i: integer;

LStyle: TmyStyle;

begin

with Form1.ListBox1 do

for i:= n downto 0 do

begin // просматриваем список от заданной строки вверх

GetStyle(Items[i], LStyle); // получаем стиль строки

if LStyle in [H1..H5] then

begin // если стиль строки заголовочный

result:= LStyle; // записываем его в результат

exit; // и выходим, нечего больше время терять!

end;

end; // если дошли до начала списка, а заголовков не найдено…

result:= H1; // присваиваем тип заголовка H1

end;

// конец кода