Юрий Карпов - Пишем программу для создания книг FB2.
Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Пишем программу для создания книг FB2."
Описание и краткое содержание "Пишем программу для создания книг FB2." читать бесплатно онлайн.
Подробный комментарий к исходному коду программы создающей книжку в формате FB2.
'^': S:= S + '^'; //
'~': S:= S + '~';
'&': S:= S + '&';
else S:= S + ss[j];
end; // case
end;
L[i]:= ' N| ' + S;
end;
Form1.ListBox1.Items.Assign(L);
L.Free;
end;
procedure NameFB2_File(S: string);
begin //
S:= ExtractFileName(S);
Form1.Caption:= S;
Form1.FB2_file.Text:= ChangeFileExt(S,'.fb2');
end;
procedure TForm1.Open1Click(Sender: TObject);
begin
with OpenDialog1 do
if Execute then
begin
NameFB2_File(FileName);
ListBox1.Clear;
LoadTXT(FileName); // txt
end;
end;
function GetGaner(S: string):string;
var
i: integer;
begin
for i:= 0 to maxg do
if gg[i][2] = S then
begin
result:= gg[i][1];
exit;
end;
result:= s;
end;
procedure SaveAnnotation;
var
i: integer;
begin
OutList.Add('<annotation>');
with form1.Annotation do
for i:= 0 to Lines.Count - 1 do
OutList.Add('<p>'+Lines[i]+'</p>');
OutList.Add('</annotation>');
end;
procedure SavePersons(title: string; LB: TListBox);
var
i: integer;
Person: TPerson;
begin
with LB do
if Count > 0 then
for i:= 0 to Count - 1 do
begin
Person:= TPerson(Items.Objects[i]);
OutList.Add(' <'+title+'>');
with Person do
begin
PrintString('first-name',fname);
PrintString('last-name',lname);
PrintString('middle-name',mname);
PrintString('nick',nick);
PrintString('email',email);
end;
OutList.Add(' </'+title+'>');
end;
end;
procedure SaveSequence;
var
s: string;
begin
with Form1 do
begin
if sequence.Text = '' then exit;
S:= '<sequence name="' +sequence.Text+'"';
if tome.Text = ''
then S:= S + '/>'
else S:= S + ' number="'+tome.Text+'"/>';
end;
OutList.Add(S);
end;
procedure SaveDescription;
const
max = 5;
mas: array[1..max] of string =
(
'<?xml version="1.0" encoding="windows-1251"?>',
'<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"',
' xmlns: l="http://www.w3.org/1999/xlink">',
' <description>',
' <title-info>'
);
var
i: byte;
S: string;
begin
// head
for i:= 1 to max do
OutList.Add(Mas[i]);
with form1.GenresBox do
if Items.Count > 0 then
for i:= 0 to Items.Count - 1 do
OutList.Add('<genre>'+GetGaner(Items[i])+'</genre>');
SavePersons('author',Form1.ListBox3);
SavePersons('translator',Form1.ListBox2);
with Form1 do
begin
PrintString('book-title',book_title.text);
if Annotation.Lines.Count > 0
then SaveAnnotation;
//if _date.text <> '' then
//OutList.Add('<date value="'+_date.text+'-01-01">'+_date.text+'</date>');
SaveSequence;
OutList.Add(' <lang>'+Lang.Text+'</lang>');
if SLang.ItemIndex > -1 then
begin
S:= Lg[SLang.ItemIndex][1];
if S <> '' then
OutList.Add(' <src-lang>'+S+'</src-lang>');
end;
OutList.Add(' </title-info>');
// **** document-info ****
OutList.Add(' <document-info>');
OutList.Add(' <program-used>my_Make_FB2</program-used>');
PrintString('src-url', url.Text); //??
OutList.Add(' <date value="'+FormatDateTime('yyyy-mm-dd', Now)+'">'+ DateToStr(now) +'</date>');
PrintString('id', id.Text); //??
OutList.Add(' <version>1.0</version>');
OutList.Add(' </document-info>');
// **** publish-info ****
OutList.Add(' <publish-info>');
if Book_name.Text = ''
then PrintString('book-name', book_title.Text)
else PrintString('book-name', Book_name.Text);
PrintString('publisher', publisher.Text); //
PrintString('city', city.Text); //
PrintString('year', year.Text); //
PrintString('isbn', isbn.Text); //
//OutList.Add(' <version>1.0</version>');
OutList.Add(' </publish-info>');
end;
OutList.Add(' </description>');
OutList.Add('<body>');
end;
function SubStyle(m,w: TmyStyle):integer;
begin
result:= integer(m) - integer(w);
end;
procedure SaveBodyFB2;
var
i, j: integer;
S, ss: string;
oldStyle,
LastStyle, CurStyle: TmyStyle; // style
procedure StyleStucture;
begin
if CurStyle <> oldStyle then
begin
if SytleStack.Count = 0 then
begin
SytleStack.Add(TObject(CurStyle))
end
else
begin
LastStyle:= TmyStyle(SytleStack.Last);
case SubStyle(CurStyle,LastStyle) of
0: OutList.Add('</section>');
1: SytleStack.Add(TObject(CurStyle));
else
begin
OutList.Add('</section>');
while CurStyle <> LastStyle do
begin
SytleStack.Delete(SytleStack.Count-1);
OutList.Add('</section>');
LastStyle:= TmyStyle(SytleStack.Last);
end;
end;
end;// case
end;
OutList.Add('<section>');
OutList.Add('<title>');
end;
OutList.Add('<p>'+s+'</p>');
end; // StyleStucture;
begin
oldStyle:= ZZ; EndNotes_count:= 1;
// if
OutList.Add('<section>');
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;
if (S = '') and (CurStyle <> Poem)
then
begin
OutList.Add('<empty-line/>');
continue;
end;
if (CurStyle <> oldStyle) and (CurStyle <> Auth) then
begin
case oldStyle of // завершение предыдущего блока
Poem: OutList.Add('</stanza></poem>');
Epig: OutList.Add('</epigraph>');
Citat: OutList.Add('</cite>');
H1..H5: OutList.Add('</title>');
end; // case завершение предыдущего блока
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>');
H1..H5: StyleStucture; // Heading
Sub: OutList.Add('<subtitle>'+s+'</subtitle>'); // Subtitle
Poem: begin
if S = ''
then OutList.Add('</stanza><stanza>')
else OutList.Add('<v>'+S+'</v>');
end;
Auth: begin
OutList.Add('<text-author>'+S+'</text-author>');
if oldStyle in [Poem, Epig, Citat]
then CurStyle:= oldStyle;
end;
None: continue; //None
end; // case
oldStyle:= CurStyle;
end; // for просмотр текста
if SytleStack.Count > 0 then
begin // закрываем все открытые секции
while SytleStack.Count > 0 do
begin
SytleStack.Delete(SytleStack.Count-1);
OutList.Add('</section>');
end;
end;
OutList.Add('</section>');
OutList.Add('</body>');
end;
procedure SaveEndnotes;
var
S: string;
i: integer;
begin
if Form1.EndNotesList.Items.Count = 0 then exit; //<a type="note" l: href="#n_1">[1]</a>
OutList.Add('<body name="notes"><title><p>Примечания</p></title>');
for i:= 0 to Form1.EndNotesList.Items.Count - 1 do
begin
S:= Form1.EndNotesList.Items[i];
OutList.Add('<section id="n_'+IntToStr(i+1)+'"><title><p>'+IntToStr(i+1)+'</p>');
OutList.Add('</title><p>'+S+'</p>');
OutList.Add('</section>');
end;
OutList.Add('</body>');
end;
Procedure Make_fb2(S: string);
begin //
if Form1.ListBox1.Items.Count = 0 then exit;
SytleStack.Clear;
OutList.Clear;
SaveDescription;
SaveBodyFB2;
SaveEndnotes;
OutList.Add('</FictionBook>');
OutList.SaveToFile(S); //++ +
showMessage('Done.');
end;
function BookHaveName: boolean;
begin
with Form1 do
result:= (book_title.Text <> '') and
(FB2_file.Text <> '') and
(GenresBox.Count > 0);
end;
procedure TForm1.SaveasFB21Click(Sender: TObject);
begin
if not BookHaveName then
begin
PageControl1.ActivePageIndex:= 0;
ShowMessage('Fill the form.');
exit;
end;
SaveDialog1.FileName:= form1.FB2_file.Text;
if SaveDialog1.Execute then
Make_fb2(SaveDialog1.FileName);
end;
function SetStyle(n: TmyStyle):string;
begin
case n of
Norm: result:= ' N';
Epig: result:= ' E';
Auth: result:= ' A';
H1: result:= 'H1';
H2: result:= 'H2';
H3: result:= 'H3';
H4: result:= 'H4';
H5: result:= 'H5';
Sub: result:= ' S';
Poem: result:= ' P';
Citat: result:= ' C';
None: result:= '-';
end; // case
end;
function SetStyle1(n: TmyStyle):string;
begin
result:= ' '+ SetStyle(n)+'| ';
end;
procedure ChangeStyle(LStyle: TmyStyle);
var
n, curIndex: integer;
S: string;
begin
with Form1.ListBox1 do
begin
curIndex:= ItemIndex;
if curIndex = -1 then exit;
S:= Items[curIndex];
n:= pos('|', s);
delete(S, 1, n+1);
Items[curIndex]:= SetStyle1(LStyle)+ S;
if ItemIndex < Items.Count - 1
then ItemIndex:= ItemIndex+1;
SetFocus;
end;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
ChangeStyle(TmyStyle(RG.itemindex));
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Form3.ListBox1.Items.Assign(GenresBox.Items);
Form3.ShowModal;
if Form3.ModalResult = mrOK then
begin
GenresBox.Items.Assign(Form3.ListBox1.Items);
end;
end;
procedure TForm1.Button10Click(Sender: TObject);
begin
Form2.ListBox1.Items.Assign(ListBox3.Items);
Form2.Button1Click(nil);
Form2.ShowModal;
if Form2.ModalResult = mrOK then
begin
ListBox3.Items.Assign(Form2.ListBox1.Items);
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
Form2.ListBox1.Items.Assign(ListBox2.Items);
Form2.Button1Click(nil);
Form2.ShowModal;
if Form2.ModalResult = mrOK then
begin
ListBox2.Items.Assign(Form2.ListBox1.Items);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
Path:= ExtractFileDir(ParamStr(0)) + '\';
OpenDialog1.InitialDir:= Path;
for i:= 0 to maxL do
SLang.Items.Add(Lg[i][2]);
SLang.ItemIndex:= 0;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if FileExists(Path + 'EndNotes.txt')
then EndNotesList.Items.LoadFromFile(Path + 'EndNotes.txt');
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
if FileExists(Path + 'Annotation.txt') then
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Пишем программу для создания книг FB2."
Книги похожие на "Пишем программу для создания книг FB2." читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Юрий Карпов - Пишем программу для создания книг FB2."
Отзывы читателей о книге "Пишем программу для создания книг FB2.", комментарии и мнения людей о произведении.