РуЛиб - онлайн библиотека > Карпов Юрий > Руководства и инструкции > Пишем программу для создания книг FB2. > страница 2
Читаем онлайн «Пишем программу для создания книг FB2.» 2 cтраница
- 1234 . . . последняя (12) »
этой работы предназначены три кнопки: [+] [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; // конец кода
// начало кода 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; // конец кода
Концевые сноски. Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл EndNotes.txt и этот файл должен находится в папке программы. Внимание! Каждая сноска - одна строка в файле. В тексте книги в местах сносок надо расставить значки тильды - ~
Ударения. В первой же книге, которую я делал, в одном слове мне потребовалось сделать ударение и поэтому пришлось ввести значок «крышки» ^
// начало кода if (CurStyle <> oldStyle) then // если предыдущий стиль отличен от текущего begin // а нынешний стиль есть в данном списке, то значит надо начинать нужный блок. case CurStyle of // начало блока Poem: OutList.Add('<poem><stanza>'); Epig: OutList.Add('<epigraph>'); Citat: OutList.Add('<cite>'); end; // case начало блока end; // конец кода
А для обработки стиля используется следующие строки // начало кода case CurStyle of // в зависимости от стиля абзаца Norm,Epig,Citat: OutList.Add('<p>'+S+'</p>'); Poem: begin if S
// начало кода 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 можно получить соответствующее оформление выделенного текста (т. е. если текст не выделен ничего не произойдет). Тут два замечания: отмена такого форматирования возможна только вручную удалением соответствующих тегов, второе, не допустимо форматирование такого вида: <strong> <emphasis> какой либо текст </strong></emphasis>. Можно конечно отслеживать такую ошибку и программным путем, но небольшое облегчение жизни пользователя, резко усложняет жизнь программиста.Концевые сноски. Книга может содержать концевые сноски. Я поленился и сделал пока так: необходимые сноски записываются в файл 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 + '<a l: href="#n_'+IntToStr(EndNotes_count)+'" type="note">' +IntToStr(EndNotes_count)+'</a>'; inc(EndNotes_count); // увеличиваем счетчик сносок end; '^': S:= S + '́'; // ставим ударение else S:= S + ss[j]; // иначе записываем символ в итоговую строку end; // case end; … // тут я пока немножко пропущу … // анализ стилей case CurStyle of // в зависимости от стиля абзаца Norm,Epig,Citat: OutList.Add('<p>'+S+'</p>'); H1..H5: StyleStucture; // Heading Sub: OutList.Add('<subtitle>'+s+'</subtitle>'); // Subtitle // конец кода Давайте рассмотрим все по порядку: Начнем со стихов. В стандарте FB2 используется три тега для работы со стихами, я использую только один стиль "P". Для разделения стихов на строфы я предлагаю использовать пустые строки помеченные стилем "P".// начало кода if (CurStyle <> oldStyle) then // если предыдущий стиль отличен от текущего begin // а нынешний стиль есть в данном списке, то значит надо начинать нужный блок. case CurStyle of // начало блока Poem: OutList.Add('<poem><stanza>'); Epig: OutList.Add('<epigraph>'); Citat: OutList.Add('<cite>'); end; // case начало блока end; // конец кода
А для обработки стиля используется следующие строки // начало кода case CurStyle of // в зависимости от стиля абзаца Norm,Epig,Citat: OutList.Add('<p>'+S+'</p>'); Poem: begin if S
- 1234 . . . последняя (12) »