Пишем программу для создания книг FB2 - [2]

Шрифт
Интервал


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

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;

// конец кода

Устанавливаем стиль заголовка

Выбираем строку в тексте

И если указанный на кнопке стиль подходит, нажимаем ее.

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

Параметром ее будет ранее сохраненные сведения о текущем стиле заголовка.

Процедура ChangeStyle описана ранее.

Теперь кнопки [+] и [-]

Код процедур аналогичен, разница только в одной строчке


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

procedure TForm1.Button5Click(Sender: TObject);

var // кнопка плюс

LStyle: TmyStyle;

begin

LStyle:= TmyStyle(Button2.Tag); // получаем текущий стиль

if LStyle < H5 then ChangeStyle(Succ(LStyle)); // если он не слишком велик, прибавляем единицу

// а для кнопки минус, вот эта строчка. Вычитается единичка, если есть откуда вычитать

// if LStyle > H1 then ChangeStyle(Pred(LStyle));

end;

// конец кода

Редактирование строки

Двойной щелчок на строке и открывается окно редактирования

Текст можно исправить или строку разбить на несколько. После нажатия ОК все содержимое записывается в книгу с сохранением старого стиля.

Нажатием кнопок Bold и Italic можно получить соответствующее оформление выделенного текста

(т. е. если текст не выделен ничего не произойдет).

Тут два замечания: отмена такого форматирования возможна только вручную удалением соответствующих тегов, второе, не допустимо форматирование такого вида:

какой либо текст . Можно конечно отслеживать такую ошибку и программным путем, но небольшое облегчение жизни пользователя, резко усложняет жизнь программиста.


Концевые сноски.

Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл EndNotes.txt и этот файл должен находится в папке программы.

Внимание! Каждая сноска - одна строка в файле.

В тексте книги в местах сносок надо расставить значки тильды - ~


Ударения.

В первой же книге, которую я делал, в одном слове мне потребовалось сделать ударение и поэтому пришлось ввести значок «крышки» ^

Создание FB2

Наконец добрались.

Казалось бы, что проще, бери строку за строкой и вперед…

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

with Form1.ListBox1 do

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

begin

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

Ss:= GetStyle(S, CurStyle); // получаем чистую строку и стиль

s:= ''; // подготавливаемся к преобразованию строки

if ss <> '' then

for j:= 1 to length(Ss) do

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

case ss[j] of

'~': begin // если это концевая сноска

S:= S + ''

+IntToStr(EndNotes_count)+'';

inc(EndNotes_count); // увеличиваем счетчик сносок

end;

'^': S:= S + '́'; // ставим ударение

else S:= S + ss[j]; // иначе записываем символ в итоговую строку

end; // case

end;

// тут я пока немножко пропущу

// анализ стилей

case CurStyle of // в зависимости от стиля абзаца

Norm,Epig,Citat: OutList.Add('

'+S+'

');

H1..H5: StyleStucture; // Heading

Sub: OutList.Add(''+s+''); // Subtitle

// конец кода

Давайте рассмотрим все по порядку:

Начнем со стихов. В стандарте FB2 используется три тега для работы со стихами, я использую только один стиль "P".

Для разделения стихов на строфы я предлагаю использовать пустые строки помеченные стилем "P".


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

if (CurStyle <> oldStyle) then // если предыдущий стиль отличен от текущего

begin // а нынешний стиль есть в данном списке, то значит надо начинать нужный блок.

case CurStyle of // начало блока

Poem: OutList.Add('');

Epig: OutList.Add('');

Citat: OutList.Add('');

end; // case начало блока

end;

// конец кода


А для обработки стиля используется следующие строки

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

case CurStyle of // в зависимости от стиля абзаца

Norm,Epig,Citat: OutList.Add('

'+S+'

');

Poem: begin

if S = ''

then OutList.Add('')

else OutList.Add(''+S+'');

end;

// конец кода


В случае Нормальное стиля, Эпиграфа и Цитаты, просто добавляются абзацы, а для стихов еще отслеживается пустая строка…


Как видите блоки не завершены. Эту функцию выполняет следующий код.


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

if (CurStyle <> oldStyle) and (CurStyle <> Auth) then

begin

case oldStyle of // завершение предыдущего блока

Poem: OutList.Add('');


Еще от автора Юрий Карпов
Извлекаем архив из fb2

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...


Английский по методу w_cat

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекурсия

Книга предназначена студенту, писавшему программы только в качестве курсовых, "сдавшему" Delphi и несмотря на это, желающему стать программистом. Это, не сборник готовых рецептов, автор хочет поставить читателя в условия максимально приближенные к рабочим. Мы вместе напишем программу, пройдя через ошибки, и сомнения к окончательной победе...


Рекомендуем почитать
Графика DirectX в Delphi

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Вторая жизнь старых компьютеров

Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


DirectX 8. Начинаем работу с DirectX Graphics

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.