science_and_life:isxodniki
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
science_and_life:isxodniki [2017/03/13 17:14] – 84.180.171.72 | science_and_life:isxodniki [2017/03/13 18:20] (current) – старая версия восстановлена (2008/12/11 13:01) kibi | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | Парник | + | ====== исходники ====== |
- | Каркас парника представляет из себя набор пластиковых дуг диаметром | + | |
- | Самовывоз из более 100 пунктов выдачи и доставка по всей стране. Артикул | + | <code delphi> |
+ | {excel2djvu - конвертор xls файлов с содержанием журнала в HTML формат для создания DJVU архива. | ||
+ | |||
+ | Copyright (C) 2006 by Alexander Sorkin aka Kibi | ||
+ | |||
+ | This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. | ||
+ | |||
+ | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. | ||
+ | |||
+ | You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
+ | |||
+ | 11.11.2006 | ||
+ | Alexander Sorkin aka Kibi | ||
+ | kibizoid@gmail.com | ||
+ | http:// | ||
+ | |||
+ | ****************************************************************************************} | ||
+ | |||
+ | // Исходный код основан на примере работы с Excel человека по имени Злой и опубликованного | ||
+ | //для свободного использования на сайте Королевство Дельфи. | ||
+ | |||
+ | unit Unit1; | ||
+ | |||
+ | interface | ||
+ | |||
+ | uses | ||
+ | Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, | ||
+ | ComObj, ActiveX, shellapi, FileCtrl, | ||
+ | {$IFDEF VER120} | ||
+ | OleCtrls, // Почем-то так написано у меня - по-моему для D5 это лишнее. | ||
+ | // Это склероз или диабет, | ||
+ | {$ENDIF} | ||
+ | Excel8TLB, StdCtrls, ExtCtrls, ComCtrls, SHDocVw; | ||
+ | |||
+ | |||
+ | type | ||
+ | TForm1 = class(TForm) | ||
+ | StatusBar1: TStatusBar; | ||
+ | OpenDialog1: | ||
+ | PageControl2: | ||
+ | TabSheet1: TTabSheet; | ||
+ | Panel1: TPanel; | ||
+ | html_preview: | ||
+ | TabSheet2: TTabSheet; | ||
+ | tree_preview: | ||
+ | SaveDialog1: | ||
+ | Panel2: TPanel; | ||
+ | PageControl1: | ||
+ | simple_tab: TTabSheet; | ||
+ | grp_simple_volume: | ||
+ | btn_simple_volume: | ||
+ | complex_tab: | ||
+ | btn_Initiate_Data: | ||
+ | chk_debug_mode: | ||
+ | btn_Collect_Data: | ||
+ | GroupBox1: TGroupBox; | ||
+ | Button1: TButton; | ||
+ | Button2: TButton; | ||
+ | ErrorLog: TListView; | ||
+ | TabSheet3: TTabSheet; | ||
+ | single_volume_tree: | ||
+ | local_progress: | ||
+ | global_progress: | ||
+ | edt_volumes: | ||
+ | btn_Create_Global_Content: | ||
+ | Label1: TLabel; | ||
+ | Bevel1: TBevel; | ||
+ | chk_make_bookmarks: | ||
+ | chk_make_authors: | ||
+ | chk_make_rubriks: | ||
+ | chk_make_content: | ||
+ | procedure FormDestroy(Sender: | ||
+ | procedure Initiate_Data(Sender: | ||
+ | procedure Local_Content_Create(Sender: | ||
+ | procedure FormCreate(Sender: | ||
+ | procedure Global_Content_Create(Sender: | ||
+ | procedure btn_simple_volumeClick(Sender: | ||
+ | procedure btn_Collect_DataClick(Sender: | ||
+ | procedure Button1Click(Sender: | ||
+ | procedure Button2Click(Sender: | ||
+ | private | ||
+ | { Private declarations } | ||
+ | FIXLSApp: Excel8TLB._Application; | ||
+ | FIWorkbook, | ||
+ | AllContent, fileDJVU_Bookmarks, | ||
+ | // Все ОНО тут! | ||
+ | // Оформлено отдельными процедурами из противности. | ||
+ | // Впрочем, | ||
+ | procedure CreateExcel (NewInstance: | ||
+ | procedure ShowExcel; | ||
+ | //procedure HideExcel; | ||
+ | procedure ReleaseExcel; | ||
+ | procedure ShowTree; | ||
+ | procedure MakeContent; | ||
+ | procedure ExportHTML(all: | ||
+ | procedure CreateBook; | ||
+ | procedure CreateTOC; | ||
+ | procedure Load_complex_rubriks; | ||
+ | procedure Load_rubriks_groups; | ||
+ | procedure CreateBatches; | ||
+ | function compare_rubriks(rubriki, | ||
+ | procedure sort_articles; | ||
+ | procedure ShowMessageInLog(year, | ||
+ | public | ||
+ | { Public declarations } | ||
+ | // Свойство, | ||
+ | property IXLSApp: Excel8TLB._Application read FIXLSApp; | ||
+ | property IWorkbook: Excel8TLB._Workbook read FIWorkbook; | ||
+ | property IWorkbook2: Excel8TLB._Workbook read FIWorkbook2; | ||
+ | end; | ||
+ | Const Make_Single = false; | ||
+ | Make_Global = true; | ||
+ | min_year = 1990; | ||
+ | max_year = 2005; | ||
+ | max_toc_triplet = 7; | ||
+ | max_complex_rubriks = 5; | ||
+ | |||
+ | Type ContentElement = class | ||
+ | | ||
+ | year_vol_str : string; | ||
+ | str_vol : string; | ||
+ | rubrika : string; | ||
+ | author : string; | ||
+ | title : string; | ||
+ | page : string; | ||
+ | link : string; | ||
+ | volume : string; | ||
+ | year : string; | ||
+ | function ColoredResult: | ||
+ | constructor Create(rubrika, | ||
+ | | ||
+ | |||
+ | Type TMyContent = record | ||
+ | rubrika : string; | ||
+ | author : string; | ||
+ | title : string; | ||
+ | page : string; | ||
+ | link : string; | ||
+ | volume : string; | ||
+ | year : string; | ||
+ | used_as_slave: | ||
+ | used_as_article: | ||
+ | | ||
+ | | ||
+ | name : string; | ||
+ | index : integer; | ||
+ | | ||
+ | | ||
+ | name : string; | ||
+ | index : integer; | ||
+ | other_rubrik : string; | ||
+ | | ||
+ | | ||
+ | name: | ||
+ | index: integer; | ||
+ | count: integer; | ||
+ | triplet: string; | ||
+ | surname: string; | ||
+ | | ||
+ | | ||
+ | name: | ||
+ | index: integer; | ||
+ | count: integer; | ||
+ | sinonim: string; | ||
+ | common: integer; | ||
+ | group_number: | ||
+ | number : integer; | ||
+ | | ||
+ | | ||
+ | triplet: | ||
+ | index: integer; | ||
+ | count: integer; | ||
+ | letter: string; | ||
+ | toc_triplets_index: | ||
+ | | ||
+ | | ||
+ | rubrika: string; | ||
+ | sinonim: string; | ||
+ | | ||
+ | | ||
+ | rubrika: | ||
+ | is_table_rubrik: | ||
+ | | ||
+ | | ||
+ | group: string; | ||
+ | rubriks: TStringList; | ||
+ | | ||
+ | type TRubr_Info = class(TObject) | ||
+ | | ||
+ | info : rubriks_element; | ||
+ | constructor Create(init_info: | ||
+ | | ||
+ | var | ||
+ | Form1: TForm1; | ||
+ | VolumeContent: | ||
+ | Rubriki: | ||
+ | Rubriks_groups: | ||
+ | prog_path: string; | ||
+ | simple_mode: | ||
+ | implementation | ||
+ | |||
+ | {$R *.DFM} | ||
+ | constructor TRubr_Info.Create(init_info: | ||
+ | begin | ||
+ | | ||
+ | end; | ||
+ | function ContentElement.ColoredResult: | ||
+ | begin | ||
+ | // | ||
+ | end; | ||
+ | |||
+ | constructor ContentElement.Create(rubrika, | ||
+ | begin | ||
+ | self.rubrika := rubrika; | ||
+ | self.author := author; | ||
+ | self.title := title; | ||
+ | self.page := page; | ||
+ | self.link := link; | ||
+ | self.volume := volume; | ||
+ | self.year := year; | ||
+ | if ((year = ' | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | |||
+ | procedure TForm1.CreateExcel(NewInstance: | ||
+ | var IU: IUnknown; | ||
+ | isCreate: boolean; | ||
+ | begin | ||
+ | // Tricks: | ||
+ | // в случает вызова Excel-а, как сервера автоматизации: | ||
+ | // - все автозагружаемые книги не загружаются (и слава богу!); | ||
+ | // - создается процесс, | ||
+ | // естественно, | ||
+ | if not Assigned(IXLSApp) then begin // а зачем его создавать, | ||
+ | isCreate := NewInstance or | ||
+ | (not SUCCEEDED( GetActiveObject(Excel8TLB.CLASS_Application_, | ||
+ | if isCreate then | ||
+ | FIXLSApp := CreateComObject(Excel8TLB.CLASS_Application_) as Excel8TLB._Application | ||
+ | else | ||
+ | FIXLSApp := IU as Excel8TLB._Application; | ||
+ | end; | ||
+ | end; | ||
+ | procedure TForm1.ShowMessageInLog(year, | ||
+ | var newItem: | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | procedure TForm1.ShowExcel; | ||
+ | begin | ||
+ | // Tricks: | ||
+ | // Приведение | ||
+ | // warning-ов типа " | ||
+ | // | ||
+ | // lcid - что такое? Что-то насчет локализации, | ||
+ | // Но вы всегда можете спокойно передать 0 вместо lcid. | ||
+ | // | ||
+ | // Так | ||
+ | // Вроде бы, достаточно просто Visible := true. Черта с два! | ||
+ | // Комментируем строки с условием на минимизацию и ScreenUpdating. | ||
+ | // Делаем CreateExcel, | ||
+ | // возвращаемся в приложение и делаем еще раз ShowExcel! И что? | ||
+ | // Насколько | ||
+ | // но окно-то не раскроется. Поэтому проверка на xlMinimize. | ||
+ | // | ||
+ | // Что здесь делает ScreenUpdating? | ||
+ | // - раскомментим строки с условием на минимайз; | ||
+ | // - CreateExcel; | ||
+ | // - ShowExcel; | ||
+ | // - закрываем (мышью) Excel (можно через Файл\Закрыть); | ||
+ | // - смотрим в процессы - Excel не выгрузился (так оно и понятно - интерфейс не освободили); | ||
+ | // - Главное! Делаем ShowExcel - имеем право. | ||
+ | // При последнем действии Excel у меня активизируется, | ||
+ | // Эту проблему последняя строка и решает. Этот баг я называю " | ||
+ | // А мы тут полупрозрачные окна рисуем. Наверняка, | ||
+ | if Assigned(IXLSApp) then begin | ||
+ | IXLSApp.Visible[0] := true; | ||
+ | // | ||
+ | if IXLSApp.WindowState[0] = TOLEEnum(Excel8TLB.xlMinimized) then | ||
+ | IXLSApp.WindowState[0] := TOLEEnum(Excel8TLB.xlNormal); | ||
+ | IXLSApp.ScreenUpdating[0] := true; | ||
+ | IXLSApp.DisplayAlerts[0] := true; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | (*procedure TForm1.HideExcel; | ||
+ | begin | ||
+ | if Assigned(IXLSApp) then begin | ||
+ | IXLSApp.Visible[0] := false; | ||
+ | end; | ||
+ | end;*) | ||
+ | |||
+ | procedure TForm1.ReleaseExcel; | ||
+ | begin | ||
+ | // Tricks: | ||
+ | // Верни пользователю его Excel!!! | ||
+ | // Считаем, | ||
+ | // бы потом увидеть. А то ж можно сделать Excel-у Hide и Release. И что? | ||
+ | // Если там осталась книга, которая правилась - процесс останется, | ||
+ | // его не увидишь - только в списке процессов. | ||
+ | // Так решим эту проблему следующим образом: | ||
+ | if Assigned(IXLSApp) then begin | ||
+ | // если есть книга и мы невидимы | ||
+ | if (IXLSApp.Workbooks.Count > 0) and (not IXLSApp.Visible[0]) then begin | ||
+ | // положим аккуратненько (правильно написал это | ||
+ | IXLSApp.WindowState[0] := TOLEEnum(xlMinimized); | ||
+ | // а потом покажем, | ||
+ | IXLSApp.Visible[0] := true; | ||
+ | // ну, и после вернем фокус форме и приложению, | ||
+ | // происходит. | ||
+ | // Собственно говоря, | ||
+ | // WindowState меня периодически пугает своей неоднозначностью. | ||
+ | // Дельфийная альтернатива Visible, SetFocus, WindowState работает четко. | ||
+ | if not(csDestroying in ComponentState) then Self.SetFocus; | ||
+ | // Объясню вопросом. Какой SetFocus, если приложение (форма) закрывается? | ||
+ | Application.BringToFront; | ||
+ | end; | ||
+ | end; | ||
+ | // Tricks: | ||
+ | // Главное мое правило: | ||
+ | // Эта привычка выработана давно. Освобождаю даже локально объявленные переменные-интерфейсы. | ||
+ | // То есть блок finally всегда присутствует с такими присваиваниями. | ||
+ | // Совет начинающим от начинающего: если чего-то не выгружается - проверь, освобождаются ли | ||
+ | // все использованные интерфейсы, | ||
+ | // Кстати, последнее - дурной стиль. | ||
+ | // Максималист, | ||
+ | // экземпляр класса, | ||
+ | // Для использования Excel у меня существует несколько классов. | ||
+ | // Это классы XL Report - низкоуровневый набор компонентов, | ||
+ | // создание одного отчета по нескольким TDataSet. А вся подсистема отчетов описана еще одним | ||
+ | // классом, | ||
+ | // описания этих запросов (Это запросы. Параметризованные, | ||
+ | // завязано на COM и ActiveX Scripting. Это не оттого, | ||
+ | // давно понять, | ||
+ | // МоеПриложение.Application. Это не мода, это, по-моему, | ||
+ | FIXLSApp := nil; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.FormCreate(Sender: | ||
+ | begin | ||
+ | prog_path: | ||
+ | if not DirectoryExists(prog_path+' | ||
+ | CreateExcel(false); | ||
+ | ShowExcel; | ||
+ | Application.BringToFront; | ||
+ | if fileexists(prog_path+' | ||
+ | if not simple_mode then CreateBook; | ||
+ | if simple_mode then begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Rubriki: | ||
+ | // Rubriki.LoadFromFile(prog_path+' | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.FormDestroy(Sender: | ||
+ | begin | ||
+ | FIWorkbook.Close(EmptyParam, | ||
+ | FIWorkbook: | ||
+ | FIWorkbook2: | ||
+ | ReleaseExcel; | ||
+ | Rubriki.Free; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.CreateBook; | ||
+ | var FullFileName: | ||
+ | x: | ||
+ | Value: OLEVariant; | ||
+ | begin | ||
+ | if simple_mode then begin | ||
+ | | ||
+ | if OpenDialog1.Execute then begin | ||
+ | | ||
+ | | ||
+ | end else FullFileName := prog_path + ' | ||
+ | if Assigned(IXLSApp) and (not Assigned(IWorkbook) ) then | ||
+ | try | ||
+ | try | ||
+ | FIWorkbook := IXLSApp.Workbooks.Open(FullFileName, | ||
+ | | ||
+ | | ||
+ | edt_volumes.Items.Clear; | ||
+ | edt_volumes.Sorted: | ||
+ | for x:=1 to IWorkbook.Names.Count do begin // прочесть | ||
+ | | ||
+ | | ||
+ | // префикс к номеру в списке нам не нужен - чтобы оставались чистые yyyy_mm (имя в экселе не может начинаться с цифры) | ||
+ | end; | ||
+ | edt_volumes.Sorted: | ||
+ | if edt_volumes.Items.Count> | ||
+ | finally | ||
+ | ShowExcel; | ||
+ | Application.BringToFront; | ||
+ | end; | ||
+ | except | ||
+ | raise Exception.Create(' | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Initiate_Data(Sender: | ||
+ | { | ||
+ | Простановка именованных диапазонов | ||
+ | Исходные данные - уже открытый XLS файл, лист " | ||
+ | Конечный результат - именованные диапазоны в XLS файле | ||
+ | Происходит сброс | ||
+ | |||
+ | Именно тут надо сделать разбор списка авторов и построение списка " | ||
+ | а так же списка " | ||
+ | |||
+ | Сам процесс разбора - поэтапный | ||
+ | - построение неупорядоченного списка 1 автор - 1 ссылка на статью | ||
+ | - сортировка созданного списка по авторам / статьям | ||
+ | + экспорт в текстовый файл статистики - автор/ | ||
+ | + статистика, | ||
+ | + регалии | ||
+ | |||
+ | Запользование этого списка идёт уже на этапе построения авторского указателя и рубрикатора соответственно | ||
+ | потому как в одной строке не получается хранить больше 1000 символов и 500 ссылок в одну строку на укладываются :( | ||
+ | |||
+ | Оглавление по авторам - также три уровня | ||
+ | - первый уровень - таблица на одну страницу - алфавит с уточнением - диапазонами из трёх букв | ||
+ | Количество диапазонов | ||
+ | - второй уровень - полный перечень авторов для каждого диапазона | ||
+ | - третий - перечень статей для каждого автора (возможно с фоткой и краткой биографией) | ||
+ | |||
+ | |||
+ | } | ||
+ | var vYear, vMonth, vAuthor, vRubrika, Values, prevValue, outValues: OLEVariant; | ||
+ | ISheet, ISheet_auth_index, | ||
+ | ISheet_triplet, | ||
+ | IRange: Excel8TLB.Range; | ||
+ | //IR1, IR2: IxlRange; | ||
+ | articles: array of TMyContent; | ||
+ | auth_index: | ||
+ | authors: array of authors_element; | ||
+ | triplets: array of triplets_element; | ||
+ | rubr_index: array of rubr_index_element; | ||
+ | rubriks: array of rubriks_element; | ||
+ | sinonims: array of sinonims_element; | ||
+ | rubriks_type: | ||
+ | x, first, | ||
+ | stroka, | ||
+ | auth_index_counter, | ||
+ | authors_counter, | ||
+ | triplet_counter: | ||
+ | rubr_index_counter, | ||
+ | rubriks_counter: | ||
+ | |||
+ | function get_sinonim(rubrika: | ||
+ | // вычисляем синоним рубрики (по предварительно составленному вручную списку) | ||
+ | // список синонимов находится в массиве sinonims | ||
+ | var x: | ||
+ | begin | ||
+ | for x:=0 to length(sinonims)-1 do begin | ||
+ | if sinonims[x].rubrika=rubrika then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | function get_rubrik_type(calculated_type: | ||
+ | // получаем тип рубрики (по вычисленному типу и предварительно составленному вручную списку) | ||
+ | // список типов рубрик от пользователя находится в массиве rubriks_type | ||
+ | var x: | ||
+ | begin | ||
+ | for x:=0 to length(rubriks_type)-1 do begin | ||
+ | if rubriks_type[x].rubrika = rubrika then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | procedure process_rubriks(rubriki: | ||
+ | function other_rubriks(rubriks: | ||
+ | var x: integer; | ||
+ | temp_str: | ||
+ | begin | ||
+ | | ||
+ | for x:=0 to rubriks.Count-1 do begin | ||
+ | if x<i then begin // запомнить все рубрики до i - " | ||
+ | if temp_str = '' | ||
+ | then temp_str := rubriks[x] | ||
+ | else temp_str := temp_str + ' | ' + rubriks[x]; | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | var x: | ||
+ | temp: | ||
+ | mas: | ||
+ | begin | ||
+ | if rubriki='' | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | for x:=1 to length(rubriki) do begin // разбиваем строку на подстроки, | ||
+ | if rubriki[x]=' | ||
+ | mas.Add(temp); | ||
+ | temp: | ||
+ | end else temp: | ||
+ | | ||
+ | | ||
+ | for x := 0 to mas.Count-1 do begin | ||
+ | setlength(rubr_index, | ||
+ | rubr_index[rubr_index_counter].name: | ||
+ | rubr_index[rubr_index_counter].index: | ||
+ | rubr_index[rubr_index_counter].other_rubrik := other_rubriks(mas, | ||
+ | inc(rubr_index_counter); | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | function extract_surname(name: | ||
+ | {фамилия вычленяется следующим образом - берётся конец строки до пробела "М. Иванов", | ||
+ | Итого, алгоритм критичен к отсутствию пробела после точки - это можно исправить, | ||
+ | " | ||
+ | var temp: | ||
+ | x: | ||
+ | begin | ||
+ | | ||
+ | for x: | ||
+ | if name[x]=' | ||
+ | temp := name[x] + temp; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | function check_name(name: | ||
+ | // проверка качества имени - имя должно быть только из русских букв | ||
+ | var x: | ||
+ | test_str: | ||
+ | begin | ||
+ | for x:=1 to length(name) do begin | ||
+ | if not (name[x] in [' | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | if length(test_str)< | ||
+ | result := false; | ||
+ | exit; | ||
+ | | ||
+ | for x:=1 to length(test_str) do begin | ||
+ | if not (test_str[x] in [' | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | |||
+ | | ||
+ | end; | ||
+ | function process_authors(rubrika, | ||
+ | //link - номер статьи в основном списке (на листе " | ||
+ | var x: | ||
+ | temp: | ||
+ | mas: | ||
+ | ok: boolean; | ||
+ | begin | ||
+ | ok := true; | ||
+ | if authors='' | ||
+ | if pos(' | ||
+ | if pos(' | ||
+ | if pos(' | ||
+ | temp := copy (authors,1,5); | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | for x:=1 to length(authors) do begin // разбиваем строку на подстроки, | ||
+ | if authors[x]=' | ||
+ | |||
+ | if (length(temp)> | ||
+ | | ||
+ | | ||
+ | | ||
+ | then mas.Add(temp); | ||
+ | temp: | ||
+ | end else temp: | ||
+ | | ||
+ | if (temp<>'' | ||
+ | (pos(' | ||
+ | (pos(' | ||
+ | (pos(' | ||
+ | then mas.Add(temp); | ||
+ | for x := 0 to mas.Count-1 do begin | ||
+ | setlength(auth_index, | ||
+ | if not check_name(mas[x]) then ok := false; | ||
+ | auth_index[auth_index_counter].name: | ||
+ | auth_index[auth_index_counter].index: | ||
+ | inc(auth_index_counter); | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | function detect_rubriks_group(rubrik_name: | ||
+ | var x: | ||
+ | n: integer; | ||
+ | results: integer; | ||
+ | begin | ||
+ | | ||
+ | for x:=1 to length(Rubriks_Groups)-1 do begin | ||
+ | if Rubriks_Groups[x].rubriks.Find(rubrik_name, | ||
+ | | ||
+ | | ||
+ | end | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | function detect_common_rubriks(i: | ||
+ | Const min_vol = 1; | ||
+ | | ||
+ | | ||
+ | | ||
+ | // при котором рубрика считается регулярной | ||
+ | var x: | ||
+ | | ||
+ | | ||
+ | begin | ||
+ | // Заполнить таблицу ссылок (all_volumes) для рубрики | ||
+ | FillChar(all_volumes, | ||
+ | for x := rubriks[i].index to rubriks[i].index+rubriks[i].count-1 do begin // прочесать все статьи для рубрики x | ||
+ | try | ||
+ | user_year := strtoint(articles[rubr_index[x].index].year); | ||
+ | user_vol := strtoint(articles[rubr_index[x].index].volume); | ||
+ | | ||
+ | user_year := 0; | ||
+ | user_vol := 0; | ||
+ | | ||
+ | if (user_year >= min_year) and (user_year <= max_year) and | ||
+ | | ||
+ | then begin | ||
+ | if all_volumes[user_year, | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | for x:=min_year to max_year do begin | ||
+ | if all_volumes[x, | ||
+ | |||
+ | detect_common_rubriks: | ||
+ | |||
+ | | ||
+ | end; | ||
+ | detect_common_rubriks: | ||
+ | end; | ||
+ | begin | ||
+ | sort_articles; | ||
+ | Load_rubriks_groups; | ||
+ | // загрузить полный список статей | ||
+ | |||
+ | auth_index_counter := 1; | ||
+ | rubr_index_counter := 1; | ||
+ | global_progress.Min: | ||
+ | global_progress.max: | ||
+ | global_progress.Position: | ||
+ | global_progress.Step: | ||
+ | if Assigned(IWorkbook) then | ||
+ | try | ||
+ | ISheet := IWorkbook.Worksheets.Item[' | ||
+ | if not simple_mode then begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for x := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Rubriks_type[x] do begin | ||
+ | | ||
+ | if (Values[x, 2] = ' | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | |||
+ | // загрузить список синонимов рубрик | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for x := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Sinonims[x] do begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | try | ||
+ | for x:=1 to IWorkbook.Names.Count do begin | ||
+ | | ||
+ | end; | ||
+ | edt_volumes.Items.Clear; | ||
+ | edt_volumes.Sorted: | ||
+ | |||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | SetLength(Articles, | ||
+ | // загрузить массив статей | ||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for x:=1 to IRange.Rows.Count do begin | ||
+ | local_progress.StepIt; | ||
+ | with Articles[x] do begin | ||
+ | | ||
+ | | ||
+ | title := Values[x, 3]; | ||
+ | page := Values[x, 4]; | ||
+ | link := Values[x, 5]; | ||
+ | | ||
+ | year := Values[x, 7]; | ||
+ | end; | ||
+ | end; | ||
+ | with Articles[2] do begin | ||
+ | | ||
+ | if not simple_mode then begin | ||
+ | if not process_authors(rubrika, | ||
+ | | ||
+ | process_rubriks(rubrika, | ||
+ | | ||
+ | end; | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for x:=3 to IRange.Rows.Count do begin | ||
+ | | ||
+ | | ||
+ | with Articles[x] do begin | ||
+ | prevVolume := articles[x-1].volume; | ||
+ | prevStroka := stroka; | ||
+ | if not simple_mode then begin | ||
+ | if not process_authors(rubrika, | ||
+ | ShowMessageInLog(year, | ||
+ | | ||
+ | end; | ||
+ | stroka := Year + ' | ||
+ | if (stroka <> prevStroka) then begin // сменился блок без разделителя | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | ' | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if (prevVolume = '' | ||
+ | | ||
+ | end; | ||
+ | last: | ||
+ | if prevStroka<>' | ||
+ | EmptyParam, | ||
+ | ' | ||
+ | | ||
+ | end; | ||
+ | if not simple_mode then begin | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_auth_index | ||
+ | outValues := VarArrayCreate([1, | ||
+ | for x:=1 to length(auth_index)-1 do begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | IRange:= ISheet_auth_index.Range[' | ||
+ | IRange.Value := outValues; | ||
+ | VarClear(outValues); | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | sort_articles; | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_rubr_index | ||
+ | outValues := VarArrayCreate([1, | ||
+ | for x:=1 to length(rubr_index)-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | IRange:= ISheet_rubr_index.Range[' | ||
+ | IRange.Value := outValues; | ||
+ | VarClear(outValues); | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | sort_articles; | ||
+ | |||
+ | // построение списка уникальных авторов | ||
+ | IRange := ISheet_auth_index.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | |||
+ | // то самое место, где жутко тормозит | ||
+ | vAuthor := Values[1, 1]; first:=1; // | ||
+ | statusbar1.simpletext: | ||
+ | authors_counter := 1; | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | for x:=2 to IRange.Rows.Count do begin // построить список авторов | ||
+ | local_progress.StepIt; | ||
+ | prevValue := vAuthor; | ||
+ | vAuthor := Values[x, 1]; | ||
+ | if (vartostr(vAuthor) <> vartostr(prevValue)) then begin // сменился блок | ||
+ | last := x-1; | ||
+ | | ||
+ | |||
+ | | ||
+ | with authors[authors_counter] do begin | ||
+ | name := vartostr(prevValue); | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | triplet:= copy(stroka, | ||
+ | surname:= stroka; | ||
+ | | ||
+ | | ||
+ | first := x; | ||
+ | end; | ||
+ | end; | ||
+ | last := IRange.Rows.Count; | ||
+ | stroka: | ||
+ | |||
+ | setlength(authors, | ||
+ | with authors[authors_counter] do begin | ||
+ | name := vartostr(vAuthor); | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | // | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_authors | ||
+ | outValues := VarArrayCreate([1, | ||
+ | for x:=1 to length(authors)-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | IRange:= ISheet_authors.Range[' | ||
+ | IRange.Value := outValues; | ||
+ | VarClear(outValues); | ||
+ | |||
+ | sort_articles; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | // построение списка уникальных рубрик | ||
+ | IRange := ISheet_rubr_index.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | |||
+ | // загрузить индекс рубрик назад | ||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | Setlength(Rubr_index, | ||
+ | for x := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Rubr_index[x] do begin | ||
+ | name := Values[x, 1]; | ||
+ | index := Values[x, 2]; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | vRubrika := Values[1, 1]; first:=1; // | ||
+ | statusbar1.simpletext: | ||
+ | rubriks_counter := 1; | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | for x:=2 to IRange.Rows.Count do begin // построить список рубрик | ||
+ | local_progress.StepIt; | ||
+ | prevValue := vRubrika; | ||
+ | vRubrika := Values[x, 1]; | ||
+ | if (vartostr(vRubrika) <> vartostr(prevValue)) then begin // сменился блок | ||
+ | last := x-1; | ||
+ | | ||
+ | | ||
+ | with rubriks[rubriks_counter] do begin | ||
+ | name := vartostr(prevValue); | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | common := detect_common_rubriks(rubriks_counter, | ||
+ | group_number := detect_rubriks_group(stroka); | ||
+ | | ||
+ | | ||
+ | first := x; | ||
+ | end; | ||
+ | end; | ||
+ | last := IRange.Rows.Count; | ||
+ | stroka: | ||
+ | // обработать последний элемент | ||
+ | setlength(rubriks, | ||
+ | with rubriks[rubriks_counter] do begin | ||
+ | name := vartostr(vRubrika); | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | // | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_rubriks | ||
+ | outValues := VarArrayCreate([1, | ||
+ | for x:=1 to length(rubriks)-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | end; | ||
+ | IRange:= ISheet_rubriks.Range[' | ||
+ | IRange.Value := outValues; | ||
+ | VarClear(outValues); | ||
+ | |||
+ | sort_articles; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | // построение списка триплетов (трёхбуквенных комбинаций) | ||
+ | IRange := ISheet_authors.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | |||
+ | vAuthor := Values[1, 4]; first:=1; // | ||
+ | statusbar1.simpletext: | ||
+ | triplet_counter: | ||
+ | |||
+ | global_progress.StepIt; | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | for x:=2 to IRange.Rows.Count do begin // построить список триплетов | ||
+ | local_progress.StepIt; | ||
+ | prevValue := vAuthor; | ||
+ | vAuthor := Values[x, 4]; | ||
+ | if vartostr(vAuthor) <> vartostr(prevValue) then begin // сменился блок | ||
+ | last := x-1; | ||
+ | | ||
+ | |||
+ | | ||
+ | with triplets[triplet_counter] do begin | ||
+ | triplet := vartostr(prevValue); | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | letter:= copy(stroka, | ||
+ | | ||
+ | | ||
+ | first := x; | ||
+ | end; | ||
+ | end; | ||
+ | last := IRange.Rows.Count; | ||
+ | stroka: | ||
+ | |||
+ | setlength(triplets, | ||
+ | with triplets[triplet_counter] do begin | ||
+ | | ||
+ | index := first; | ||
+ | count := last-first+1; | ||
+ | | ||
+ | end; | ||
+ | // | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_triplet | ||
+ | outValues := VarArrayCreate([1, | ||
+ | for x:=1 to length(triplets)-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | IRange:= ISheet_triplet.Range[' | ||
+ | IRange.Value := outValues; | ||
+ | VarClear(outValues); | ||
+ | |||
+ | sort_articles; | ||
+ | end; // simple_mode | ||
+ | global_progress.StepIt; | ||
+ | statusbar1.simpletext: | ||
+ | |||
+ | local_progress.Position := local_progress.max; | ||
+ | edt_volumes.Sorted: | ||
+ | if edt_volumes.Items.Count> | ||
+ | //0: Value := ISheet.Cells.Item[2, | ||
+ | //1: Value := ISheet.Range[' | ||
+ | //2: Value := ISheet.Range[' | ||
+ | //3: Value := IWorkbook.Names.Item(' | ||
+ | // | ||
+ | finally | ||
+ | IRange := nil; | ||
+ | ISheet := nil; | ||
+ | ISheet_auth_index := nil; | ||
+ | ISheet_rubr_index := nil; | ||
+ | ISheet_authors := nil; | ||
+ | ISheet_rubriks := nil; | ||
+ | ISheet_triplet := nil; | ||
+ | IWorkBook.Save(0); | ||
+ | setlength(auth_index, | ||
+ | setlength(rubr_index, | ||
+ | setlength(authors, | ||
+ | setlength(rubriks, | ||
+ | setlength(triplets, | ||
+ | setlength(sinonims, | ||
+ | statusbar1.simpletext: | ||
+ | global_progress.StepIt; | ||
+ | end; | ||
+ | except | ||
+ | raise Exception.Create(' | ||
+ | end; | ||
+ | local_progress.Position := local_progress.Max; | ||
+ | global_progress.Position := global_progress.Max; | ||
+ | end; | ||
+ | |||
+ | Procedure TForm1.sort_articles; | ||
+ | var ISheet: Excel8TLB._Worksheet; | ||
+ | begin | ||
+ | if Assigned(IWorkbook) then begin | ||
+ | | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | true, true, | ||
+ | | ||
+ | finally | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | |||
+ | if not simple_mode then begin | ||
+ | | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | | ||
+ | xlNo, EmptyParam, EmptyParam, | ||
+ | | ||
+ | true, true, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | |||
+ | | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | | ||
+ | xlNo, EmptyParam, EmptyParam, | ||
+ | | ||
+ | true, true, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | |||
+ | |||
+ | | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | | ||
+ | xlNo, EmptyParam, EmptyParam, | ||
+ | | ||
+ | true, true, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | |||
+ | | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | | ||
+ | xlNo, EmptyParam, EmptyParam, | ||
+ | | ||
+ | true, true, | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | |||
+ | |||
+ | end; // simple_mode | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Load_complex_rubriks; | ||
+ | var Values: OLEVariant; | ||
+ | ISheet: Excel8TLB._Worksheet; | ||
+ | IRange: Excel8TLB.Range; | ||
+ | i: integer; | ||
+ | begin | ||
+ | // загрузить список сборных рубрик | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | Rubriki.Add(Values[i, | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | |||
+ | {заполняет структуру Rubriks_groups на основе информации с листа " | ||
+ | procedure TForm1.Load_rubriks_groups; | ||
+ | var Values: OLEVariant; | ||
+ | ISheet: Excel8TLB._Worksheet; | ||
+ | IRange: Excel8TLB.Range; | ||
+ | i,j: integer; | ||
+ | temp_str: string; | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for i := 1 to IRange.Columns.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Rubriks_groups[i] do begin | ||
+ | group := Values[1, | ||
+ | | ||
+ | | ||
+ | for j:=2 to IRange.Rows.Count do begin // загрузить рубрики | ||
+ | temp_str := Values[j, | ||
+ | if (temp_str <> '' | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Local_Content_Create(Sender: | ||
+ | var year_vol: | ||
+ | x: | ||
+ | year, load_year_vol: | ||
+ | | ||
+ | var Values: OLEVariant; | ||
+ | | ||
+ | | ||
+ | i,j: integer; | ||
+ | | ||
+ | | ||
+ | try | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | with VolumeContent[i-1] do begin | ||
+ | rubrika := Values[i, 1]; | ||
+ | author := Values[i, 2]; | ||
+ | title := Values[i, 3]; | ||
+ | page := Values[i, 4]; | ||
+ | link := Values[i, 5]; | ||
+ | volume := Values[i, 6]; | ||
+ | year := Values[i, 7]; | ||
+ | used_as_slave := false; | ||
+ | for j:=1 to max_complex_rubriks do used_as_article[j] := false; | ||
+ | stroka:= format(' | ||
+ | | ||
+ | | ||
+ | finally | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | begin | ||
+ | if Assigned(IWorkbook) then begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for x:=0 to edt_volumes.Items.Count-1 do begin | ||
+ | AllContent: | ||
+ | local_progress.StepIt; | ||
+ | load_year_vol: | ||
+ | year_vol: | ||
+ | year := copy(year_vol, | ||
+ | if (year_vol = ' | ||
+ | statusbar1.simpletext: | ||
+ | fileDJVU_Bookmarks: | ||
+ | LoadContent(load_year_vol); | ||
+ | MakeContent; | ||
+ | ExportHTML(make_single); | ||
+ | fileDJVU_Bookmarks.CopyFrom(AllContent, | ||
+ | fileDJVU_Bookmarks.Free; | ||
+ | AllContent.Free; | ||
+ | | ||
+ | end; | ||
+ | statusbar1.simpletext: | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.CreateBatches; | ||
+ | var bat_file: TStringList; | ||
+ | sed_path: string; | ||
+ | x: | ||
+ | year, year_vol: string; | ||
+ | function test_path: | ||
+ | var x: | ||
+ | results: | ||
+ | begin | ||
+ | results := true; | ||
+ | for x:=1 to length(prog_path) do begin | ||
+ | if (prog_path[x] in [' | ||
+ | | ||
+ | results := false; | ||
+ | break; | ||
+ | | ||
+ | end; | ||
+ | test_path := results; | ||
+ | end; | ||
+ | begin | ||
+ | if not test_path then begin | ||
+ | Application.MessageBox( | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | MB_OK); | ||
+ | end; | ||
+ | bat_file: | ||
+ | |||
+ | // !insert_bookmarks.bat | ||
+ | |||
+ | for x:=0 to edt_volumes.Items.Count-1 do begin | ||
+ | | ||
+ | year := copy(year_vol, | ||
+ | if (year_vol = ' | ||
+ | | ||
+ | end; | ||
+ | bat_file.SaveToFile(prog_path+' | ||
+ | |||
+ | // !insert_one.bat | ||
+ | |||
+ | bat_file.Clear; | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.SaveToFile(prog_path+' | ||
+ | |||
+ | // !do_all.bat | ||
+ | |||
+ | bat_file.Clear; | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.SaveToFile(prog_path+' | ||
+ | |||
+ | // !Process_one.bat | ||
+ | |||
+ | bat_file.Clear; | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add('" | ||
+ | ' | ||
+ | ' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | |||
+ | // вычислить строку для коррекции ссылок внутри DJVU - коррекция бага Acrobat' | ||
+ | sed_path := prog_path; | ||
+ | sed_path: | ||
+ | sed_path: | ||
+ | sed_path: | ||
+ | sed_path: | ||
+ | |||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.Add(' | ||
+ | bat_file.SaveToFile(prog_path+' | ||
+ | bat_file.Free; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.ShowTree; | ||
+ | var i: integer; | ||
+ | srcNode: | ||
+ | stroka: | ||
+ | begin | ||
+ | tree_preview.Items.Clear; | ||
+ | tree_preview.Items: | ||
+ | srcNode: | ||
+ | while srcNode <> nil do begin | ||
+ | if pos(' | ||
+ | i: | ||
+ | | ||
+ | i := strToInt(copy(SrcNode.Text, | ||
+ | | ||
+ | if (VolumeContent[i].rubrika <> '' | ||
+ | if (VolumeContent[i].author <> '' | ||
+ | if (VolumeContent[i].title <> '' | ||
+ | if length(stroka)> | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.MakeContent; | ||
+ | var i,y: integer; | ||
+ | Node, lastNode: | ||
+ | stroka, stroka_spec: | ||
+ | special_rubrika, | ||
+ | other_rubriks: | ||
+ | pos_found: | ||
+ | |||
+ | | ||
+ | // собирает все подчинённые статьи (подвёрстки) для данной мастер-статьи | ||
+ | // на входе - узел мастер-статьи и мастер-ссылка | ||
+ | var x: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | master_flag: | ||
+ | stroka: | ||
+ | counter: | ||
+ | Delete(stroka, | ||
+ | stroka:= ' | ||
+ | for x:=0 to length(VolumeContent)-1 do begin | ||
+ | with VolumeContent[x] do begin | ||
+ | if link = master_link then inc(counter); | ||
+ | if link = stroka then begin // найден соответсвующий слэйв | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | // получить номер статьи для вывода сообщения | ||
+ | if pos(' | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | end; | ||
+ | |||
+ | if master_flag then begin // проверка на " | ||
+ | with VolumeContent[article_number] do begin | ||
+ | ShowMessageInLog(year, | ||
+ | | ||
+ | end; | ||
+ | if counter<> | ||
+ | with VolumeContent[article_number] do begin | ||
+ | ShowMessageInLog(year, | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | |||
+ | | ||
+ | // собирает все статьи из сборной рубрики | ||
+ | // на входе - узел главной статьи и имя сборной рубрики | ||
+ | var x: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | rubr_position := 0; | ||
+ | for x:=0 to length(VolumeContent)-1 do begin | ||
+ | with VolumeContent[x] do begin | ||
+ | if compare_rubriks(rubrika,root_rubrika, | ||
+ | | ||
+ | | ||
+ | if (link='' | ||
+ | master: | ||
+ | end else begin | ||
+ | stroka: | ||
+ | master: | ||
+ | | ||
+ | if master then connect_slaves(lastNode, | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | { | ||
+ | Нужно модифицировать алгоритм сборки оглавления: | ||
+ | статья, | ||
+ | => признак used_as_article недостаточен для решения. | ||
+ | нужен массив флагов для всех сборных рубрик " | ||
+ | |||
+ | Для того, чтобы не делать массив флагов зависимым от списка сборных рубрик, | ||
+ | надо использовать принцип - " | ||
+ | ограничить количество контролируемых сборных рубрик, | ||
+ | |||
+ | used_as_article: | ||
+ | for i:=0 to 5 do used_as_slave[i]: | ||
+ | used_as_article[0] - использована как обычная статья (не из сборных рубрик) | ||
+ | used_as_article[1] - использована как статья первой спецрубрики и т.д. | ||
+ | |||
+ | } | ||
+ | begin | ||
+ | single_volume_tree.Items.Clear; | ||
+ | Node: | ||
+ | for i:=0 to length(VolumeContent)-1 do begin | ||
+ | with VolumeContent[i] do begin | ||
+ | // определить мастер/ | ||
+ | if (link='' | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | // Узнать, | ||
+ | special_rubrika: | ||
+ | for y:=0 to Rubriki.Count-1 do begin | ||
+ | if compare_rubriks(rubrika, | ||
+ | special_rubrika: | ||
+ | // проверить, | ||
+ | if not used_as_article[pos_found] then begin | ||
+ | | ||
+ | | ||
+ | end else begin pos_found: | ||
+ | | ||
+ | end; | ||
+ | // на выходе - признак, | ||
+ | // stroka_spec - только для случая, | ||
+ | // pos_found - тоже только тогда, когда найдена неиспользованная рубрика | ||
+ | if special_rubrika then begin | ||
+ | // | ||
+ | if pos_found > 0 then begin | ||
+ | if not used_as_article[pos_found] then begin // спецрубрики строятся даже по слэйвам (обложки, | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end else begin | ||
+ | if not (used_as_article[1]) and not (used_as_slave) and not slave then begin | ||
+ | lastNode: | ||
+ | used_as_article[1]: | ||
+ | if master then connect_slaves(lastNode, | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | // проверка на " | ||
+ | for i:=0 to length(VolumeContent)-1 do begin | ||
+ | with VolumeContent[i] do begin | ||
+ | if (link='' | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if not (used_as_slave) and slave then begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | function TForm1.compare_rubriks(rubriki, | ||
+ | // | ||
+ | // | ||
+ | // возвращает other_rubriks - набор рубрик без искомой рубрики (разделитель " | ") | ||
+ | // возвращает pos_found - порядковый номер найденной рубрики в наборе рубрик | ||
+ | var temp: | ||
+ | position: | ||
+ | counter: | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | if rubriki=test_string then begin result: | ||
+ | if Pos(' | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | position: | ||
+ | if position> | ||
+ | | ||
+ | | ||
+ | | ||
+ | if temp=test_string | ||
+ | then begin // рубрика обнаружена | ||
+ | | ||
+ | | ||
+ | end else begin // записать найденную рубрику в список " | ||
+ | if other_rubriks='' | ||
+ | then other_rubriks: | ||
+ | else other_rubriks: | ||
+ | end; | ||
+ | end; | ||
+ | until position=0; | ||
+ | | ||
+ | | ||
+ | if temp=test_string | ||
+ | then begin // рубрика обнаружена | ||
+ | | ||
+ | | ||
+ | end else begin // записать найденную рубрику в список " | ||
+ | if other_rubriks='' | ||
+ | then other_rubriks: | ||
+ | else other_rubriks: | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.ExportHTML(all: | ||
+ | var oldLevel: | ||
+ | curNode: | ||
+ | x, y: integer; | ||
+ | pos_found: | ||
+ | file_content_name: | ||
+ | special_rubrika: | ||
+ | stroka, | ||
+ | Flags: OLEVariant; | ||
+ | One_Volume_Content: | ||
+ | article_number: | ||
+ | rubrika_name: | ||
+ | year_vol_str, | ||
+ | CurElement : ContentElement; | ||
+ | begin | ||
+ | curNode: | ||
+ | oldLevel: | ||
+ | One_Volume_Content := TStringList.Create; | ||
+ | if all then begin | ||
+ | with VolumeContent[1] do begin | ||
+ | if (year = ' | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | One_Volume_Content.Add(format('< | ||
+ | if FileExists(prog_path+format(' | ||
+ | then One_Volume_Content.Add(format('< | ||
+ | else One_Volume_Content.Add(format('< | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | end; | ||
+ | while curNode <> nil do begin | ||
+ | if oldLevel< | ||
+ | for x:=1 to curNode.Level-oldLevel do begin | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | if oldLevel> | ||
+ | for x:=1 to oldLevel-curNode.Level do begin | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | // тут будет передаваться инфа о том, какая рубрика в данной статье является сборной. | ||
+ | // передаваться в виде s1 (s2, s3, s4, s5 и т.д.) | ||
+ | if pos(' | ||
+ | article_number := StrToInt(curNode.Text); | ||
+ | rubrika_name : | ||
+ | end else begin | ||
+ | article_number := strToInt(copy(CurNode.Text, | ||
+ | rubrika_name := copy(CurNode.Text, | ||
+ | | ||
+ | with VolumeContent[article_number] do begin | ||
+ | CurElement := ContentElement.Create(rubrika, | ||
+ | if (year = ' | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if rubrika_name <> '' | ||
+ | | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | end; | ||
+ | if chk_debug_mode.Checked then begin // режим вывода отладочного оглавления | ||
+ | if special_rubrika and (curNode.Level=0) then begin | ||
+ | stroka: | ||
+ | end else begin; // вывести всю инфу по ссылке | ||
+ | stroka: | ||
+ | if (rubrika <> '' | ||
+ | if (author <> '' | ||
+ | if (title <> '' | ||
+ | if stroka = '' | ||
+ | if (link <> '' | ||
+ | then stroka := stroka + ' | ||
+ | else stroka := stroka + ' | ||
+ | | ||
+ | end else begin // обычный режим вывода оглавления | ||
+ | if all then begin // вывод сборного оглавления | ||
+ | if special_rubrika then begin // спецрубрика | ||
+ | if (curNode.Level=0) then // спецрубрика в корне | ||
+ | stroka: | ||
+ | else begin // статья в спецрубрике | ||
+ | if stroka_spec <> rubrika then begin // статья со сложносочинённой рубрикой | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | | ||
+ | end else begin | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end else begin // обычная рубрика | ||
+ | if (rubrika='' | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end; | ||
+ | end else begin // есть название | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | end else begin // вывод оглавления для одного номера | ||
+ | if special_rubrika then begin // спецрубрика | ||
+ | if (curNode.Level=0) then // спецрубрика в корне | ||
+ | stroka: | ||
+ | else begin // статья в спецрубрике | ||
+ | if stroka_spec <> rubrika then begin // статья со сложносочинённой рубрикой | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | | ||
+ | end else begin | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end else begin // обычная рубрика | ||
+ | if (rubrika='' | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end; | ||
+ | end else begin // есть название рубрики | ||
+ | if (author='' | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end else begin | ||
+ | if (title='' | ||
+ | else stroka: | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | if all | ||
+ | then stroka: | ||
+ | else stroka: | ||
+ | One_Volume_Content.Add(stroka); | ||
+ | CurElement.Free; | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | for x:=1 to oldLevel+1 do begin // проставить завершающие </ | ||
+ | | ||
+ | end; | ||
+ | //if all then begin | ||
+ | | ||
+ | {end else begin | ||
+ | | ||
+ | | ||
+ | // открыть созданный Html во встроенном редакторе | ||
+ | Flags := 0; | ||
+ | | ||
+ | if chk_embed_bookmarks.Checked then begin | ||
+ | ShellExecute(GetDesktopWindow(), | ||
+ | PChar(file_content_name + ' ' + edt_volumes.Items[edt_volumes.ItemIndex] + '.djvu ' + edt_volumes.Items[edt_volumes.ItemIndex] + ' | ||
+ | nil, SW_HIDE); | ||
+ | | ||
+ | end; } | ||
+ | One_Volume_Content.Free; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.CreateTOC; | ||
+ | // используется инфа из edt_volumes | ||
+ | // результат записывается в file_Global_Volumes_Content | ||
+ | Const min_vol = 1; | ||
+ | max_vol = 12; | ||
+ | test_vol = max_vol + 1; | ||
+ | var MyContentTOC: | ||
+ | x, | ||
+ | user_year, user_vol: | ||
+ | str_vol, img_vol: string; | ||
+ | style: | ||
+ | all_volumes: | ||
+ | djvu_name: | ||
+ | year_vol_str: | ||
+ | begin | ||
+ | MyContentTOC: | ||
+ | FillChar(all_volumes, | ||
+ | for x := 0 to edt_volumes.Items.Count-1 do begin // загрузить инфу по номерам и годам | ||
+ | try | ||
+ | user_year := StrToInt(copy(edt_volumes.Items[x], | ||
+ | user_vol := StrToInt(copy(edt_volumes.Items[x], | ||
+ | | ||
+ | ShowMessageInLog(' | ||
+ | | ||
+ | if (user_year >= min_year) and (user_year <= max_year) and | ||
+ | | ||
+ | then begin | ||
+ | all_volumes[user_year, | ||
+ | all_volumes[user_year, | ||
+ | | ||
+ | end; | ||
+ | // Создать заголовок | ||
+ | MyContentTOC.Add('< | ||
+ | MyContentTOC.Add(format('< | ||
+ | if chk_debug_mode.Checked then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | // создать оглавление первого уровня (таблица номеров) | ||
+ | MyContentTOC.Add('< | ||
+ | MyContentTOC.Add('< | ||
+ | for y := min_vol to max_vol do begin | ||
+ | if y<10 | ||
+ | then MyContentTOC.Add(format('< | ||
+ | else MyContentTOC.Add(format('< | ||
+ | end; | ||
+ | MyContentTOC.Add('</ | ||
+ | for x := max_year downto min_year do begin | ||
+ | if (x mod 2) = 0 then style := ' | ||
+ | if all_volumes[x, | ||
+ | then MyContentTOC.Add(format('< | ||
+ | else MyContentTOC.Add(format('< | ||
+ | for y := min_vol to max_vol do begin | ||
+ | if y<10 | ||
+ | then year_vol_str := format(' | ||
+ | else year_vol_str := format(' | ||
+ | if (year_vol_str = ' | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | if (x = 1992) and (y = 6) and (all_volumes[x, | ||
+ | |||
+ | if all_volumes[x, | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | if (chk_debug_mode.checked) and (fileexists(djvu_name)) // в режиме проверки для имеющихся в DJVU номеров создавать ссылки в таблице номеров | ||
+ | then MyContentTOC.Add(format('< | ||
+ | else MyContentTOC.Add('< | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | MyContentTOC.Add('</ | ||
+ | |||
+ | // создать оглавление второго уровня (годовые подшивки) | ||
+ | MyContentTOC.Add('< | ||
+ | year_count: | ||
+ | for x:=max_year downto min_year do begin | ||
+ | if all_volumes[x, | ||
+ | inc(year_count); | ||
+ | if (year_count mod 2) = 1 | ||
+ | then MyContentTOC.Add(format('< | ||
+ | else MyContentTOC.Add(format('< | ||
+ | for y:=min_vol to max_vol do begin | ||
+ | if y=7 then MyContentTOC.Add('< | ||
+ | if (x = 1992) and (y = 6) and (all_volumes[x, | ||
+ | if all_volumes[x, | ||
+ | if y<10 | ||
+ | then year_vol_str := format(' | ||
+ | else year_vol_str := format(' | ||
+ | |||
+ | if y < 10 then str_vol := format(' | ||
+ | |||
+ | if (year_vol_str = ' | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | if FileExists(format(' | ||
+ | then img_vol := format(' | ||
+ | else img_vol: | ||
+ | MyContentTOC.Add(format( | ||
+ | '< | ||
+ | '< | ||
+ | '< | ||
+ | | ||
+ | end else begin // номера нет - вывести затычку | ||
+ | if y < 10 then str_vol := format(' | ||
+ | img_vol := ' | ||
+ | MyContentTOC.Add(format( | ||
+ | '< | ||
+ | '< | ||
+ | '& | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | end; | ||
+ | MyContentTOC.Add('</ | ||
+ | MyContentTOC.SaveToStream(file_Global_Volumes_Content); | ||
+ | MyContentTOC.Free; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Global_Content_Create(Sender: | ||
+ | Procedure per_volumes; | ||
+ | var Values: OLEVariant; | ||
+ | ISheet: Excel8TLB._Worksheet; | ||
+ | IRange: Excel8TLB.Range; | ||
+ | i,z,j: integer; | ||
+ | Flags: OLEVariant; | ||
+ | begin | ||
+ | if Assigned(IWorkbook) then | ||
+ | //try | ||
+ | ISheet := IWorkbook.Worksheets.Item[' | ||
+ | file_Global_Volumes_Content: | ||
+ | AllContent: | ||
+ | tree_preview.items.Clear; | ||
+ | try | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | for z: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | with VolumeContent[i-1] do begin | ||
+ | rubrika := Values[i, 1]; | ||
+ | author := Values[i, 2]; | ||
+ | title := Values[i, 3]; | ||
+ | page := Values[i, 4]; | ||
+ | link := Values[i, 5]; | ||
+ | volume := Values[i, 6]; | ||
+ | year := Values[i, 7]; | ||
+ | used_as_slave := false; | ||
+ | for j :=1 to max_complex_rubriks do used_as_article[j] := false; | ||
+ | //stroka:= format(' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | local_progress.StepIt; | ||
+ | CreateTOC; | ||
+ | local_progress.Position: | ||
+ | file_Global_Volumes_Content.CopyFrom(AllContent, | ||
+ | finally | ||
+ | IRange := nil; | ||
+ | ISheet := nil; | ||
+ | AllContent.Free; | ||
+ | file_Global_Volumes_Content.Free; | ||
+ | tree_preview.Items.Clear; | ||
+ | single_volume_tree.Items.Clear; | ||
+ | // открыть созданный Html во встроенном редакторе | ||
+ | Flags := 0; | ||
+ | html_preview.Navigate(WideString(prog_path+' | ||
+ | end; | ||
+ | //except | ||
+ | //raise Exception.Create(' | ||
+ | //end; | ||
+ | end; | ||
+ | Procedure per_authors; | ||
+ | // type all_triplets_element: | ||
+ | var Values: OLEVariant; | ||
+ | ISheet, ISheet_auth_index, | ||
+ | articles: array of TMyContent; | ||
+ | auth_index: | ||
+ | authors: array of authors_element; | ||
+ | triplets: array of triplets_element; | ||
+ | odd_even: | ||
+ | min_tripl, max_tripl: integer; // индексы для простановки диапазонов триплетов | ||
+ | toc_triplets: | ||
+ | prevIndex, page_counter, | ||
+ | |||
+ | vYear, vMonth, vAuthor, prevValue, vRubrika: OLEVariant; | ||
+ | x, | ||
+ | stroka, prevStroka: | ||
+ | auth_index_counter, | ||
+ | authors_counter, | ||
+ | triplet_counter: | ||
+ | Authors_TOC: | ||
+ | Authors_Names: | ||
+ | Authors_Articles: | ||
+ | IRange: Excel8TLB.Range; | ||
+ | i,j,z: integer; | ||
+ | Flags: OLEVariant; | ||
+ | year_vol_str, | ||
+ | |||
+ | begin | ||
+ | if Assigned(IWorkbook) then | ||
+ | try | ||
+ | ISheet := IWorkbook.Worksheets.Item[' | ||
+ | ISheet_auth_index := IWorkbook.Worksheets.Item[' | ||
+ | ISheet_authors := IWorkbook.Worksheets.Item[' | ||
+ | ISheet_triplet := IWorkbook.Worksheets.Item[' | ||
+ | |||
+ | Authors_TOC := TStringList.Create; | ||
+ | Authors_Names := TStringList.Create; | ||
+ | Authors_Articles := TStringList.Create; | ||
+ | |||
+ | file_All_Authors_Index: | ||
+ | try | ||
+ | // создать конечный перечень - имя автора (заголовок, | ||
+ | |||
+ | // загрузить лист | ||
+ | IRange := ISheet.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | SetLength(Articles, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Articles[i] do begin | ||
+ | | ||
+ | | ||
+ | title := Values[i, 3]; | ||
+ | page := Values[i, 4]; | ||
+ | link := Values[i, 5]; | ||
+ | | ||
+ | year := Values[i, 7]; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet_auth_index.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | Setlength(auth_index, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with auth_index[i] do begin | ||
+ | name := Values[i, 1]; | ||
+ | index := Values[i, 2]; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet_authors.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | Setlength(authors, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with authors[i] do begin | ||
+ | name := Values[i, 1]; | ||
+ | index := Values[i, 2]; | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet_triplet.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | Setlength(triplets, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with triplets[i] do begin | ||
+ | | ||
+ | index := Values[i, 2]; | ||
+ | | ||
+ | | ||
+ | if not (letter[1] in [' | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | Authors_TOC.add('< | ||
+ | Authors_TOC.add('< | ||
+ | // построить список всех триплетов | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | x:=0; | ||
+ | // | ||
+ | // загрузить массив триплетов | ||
+ | for i:= ord(' | ||
+ | for x:=0 to max_toc_triplet do begin | ||
+ | toc_triplets[i, | ||
+ | | ||
+ | end; | ||
+ | { найти диапазон для очередной буквы | ||
+ | по найденному диапазону триплетов построить 8 интервалов | ||
+ | если кол-во триплетов меньше или равно max_toc_triplet | ||
+ | если кол-во триплетов больше max_toc_triplet - " | ||
+ | приписать триплетам соостветствующие индексы интервалов | ||
+ | } | ||
+ | first:=1; prevStroka: | ||
+ | for i := 1 to length(triplets)-1 do begin | ||
+ | if (prevStroka <> triplets[i].letter) then begin // пошла новая буква | ||
+ | last:=i-1; // конец диапазона - предыдущий триплет | ||
+ | toc_triplets[ord(prevStroka[1]), | ||
+ | if (last-first+1)< | ||
+ | for x:=1 to last-first+1 do begin | ||
+ | toc_triplets[ord(prevStroka[1]), | ||
+ | triplets[first+x-1].toc_triplets_index: | ||
+ | | ||
+ | end else begin // хитрый алгоритм | ||
+ | for x:=1 to max_toc_triplet do begin | ||
+ | min_tripl: | ||
+ | max_tripl: | ||
+ | for z: | ||
+ | | ||
+ | end; | ||
+ | if min_tripl = max_tripl | ||
+ | then toc_triplets[ord(prevStroka[1]), | ||
+ | else toc_triplets[ord(prevStroka[1]), | ||
+ | | ||
+ | end; | ||
+ | first:=i; // запомнить начало нового диапазона | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | i: | ||
+ | last:=i-1; // конец диапазона - последний элемент | ||
+ | toc_triplets[ord(prevStroka[1]), | ||
+ | if (last-first+1)< | ||
+ | for x:=1 to last-first+1 do begin | ||
+ | toc_triplets[ord(prevStroka[1]), | ||
+ | triplets[first+x-1].toc_triplets_index: | ||
+ | | ||
+ | end else begin // хитрый алгоритм | ||
+ | for x:=1 to max_toc_triplet do begin | ||
+ | min_tripl: | ||
+ | max_tripl: | ||
+ | for z: | ||
+ | | ||
+ | end; | ||
+ | if min_tripl = max_tripl | ||
+ | then toc_triplets[ord(prevStroka[1]), | ||
+ | else toc_triplets[ord(prevStroka[1]), | ||
+ | | ||
+ | end; | ||
+ | odd_even := true; | ||
+ | Authors_TOC.add('< | ||
+ | Authors_TOC.Add('< | ||
+ | for i:= ord(' | ||
+ | if toc_triplets[i, | ||
+ | | ||
+ | if odd_even | ||
+ | then Authors_TOC.Add('< | ||
+ | else Authors_TOC.Add('< | ||
+ | for x:=1 to max_toc_triplet do begin | ||
+ | if (toc_triplets[i, | ||
+ | then Authors_TOC.Add(format('< | ||
+ | else Authors_TOC.Add('< | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Authors_TOC.Add('</ | ||
+ | |||
+ | // построить список всех фамилий | ||
+ | Authors_Names.add('< | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step := 1; | ||
+ | statusbar1.simpletext := ' | ||
+ | z := 0; | ||
+ | page_counter := 0; | ||
+ | odd_even := false; | ||
+ | i := 1; prevStroka := triplets[i].letter + ' | ||
+ | Authors_Names.Add(format('< | ||
+ | inc(page_counter, | ||
+ | Authors_Names.Add('< | ||
+ | for i:= 1 to length(triplets)-1 do begin | ||
+ | if (prevStroka <> triplets[i].letter + ' | ||
+ | for x:=z to 2 do begin | ||
+ | | ||
+ | end; | ||
+ | Authors_Names.Add('</ | ||
+ | if (page_counter> | ||
+ | z := 0; | ||
+ | | ||
+ | | ||
+ | | ||
+ | end else | ||
+ | | ||
+ | inc(page_counter, | ||
+ | rows_counter := 0; | ||
+ | Authors_Names.Add('< | ||
+ | z := 0; | ||
+ | odd_even: | ||
+ | | ||
+ | for x := triplets[i].index to (triplets[i].index + triplets[i].count - 1) do begin // вывести все фамилии для триплета | ||
+ | if z = 3 then begin // запустить | ||
+ | | ||
+ | | ||
+ | z := 0; | ||
+ | if odd_even | ||
+ | then Authors_Names.Add('</ | ||
+ | else Authors_Names.Add('</ | ||
+ | | ||
+ | end; | ||
+ | if (page_counter> | ||
+ | | ||
+ | z := 0; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | inc(z); | ||
+ | Authors_Names.Add(format('< | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Authors_Names.Add('</ | ||
+ | |||
+ | // построить список нижнего уровня | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | Authors_Articles.add('< | ||
+ | for i := 1 to length(authors)-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for x: | ||
+ | with articles[auth_index[x].index] do begin | ||
+ | |||
+ | if (year = ' | ||
+ | year_vol_str := ' | ||
+ | str_vol := ' | ||
+ | end else begin | ||
+ | year_vol_str := year + ' | ||
+ | str_vol := volume; | ||
+ | | ||
+ | |||
+ | | ||
+ | if (rubrika <> '' | ||
+ | if (author <> '' | ||
+ | if (title <> '' | ||
+ | | ||
+ | |||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Authors_Articles.add('</ | ||
+ | statusbar1.simpletext: | ||
+ | |||
+ | Authors_TOC.SaveToStream(file_All_Authors_Index); | ||
+ | Authors_Names.SaveToStream(file_All_Authors_Index); | ||
+ | Authors_Articles.SaveToStream(file_All_Authors_Index); | ||
+ | finally | ||
+ | IRange := nil; | ||
+ | ISheet := nil; | ||
+ | ISheet_auth_index := nil; | ||
+ | ISheet_authors := nil; | ||
+ | ISheet_triplet := nil; | ||
+ | setlength(articles, | ||
+ | setlength(auth_index, | ||
+ | setlength(authors, | ||
+ | setlength(triplets, | ||
+ | file_All_Authors_Index.Free; | ||
+ | Authors_TOC.Free; | ||
+ | Authors_Names.Free; | ||
+ | Authors_Articles.Free; | ||
+ | { | ||
+ | // открыть созданный Html во встроенном редакторе | ||
+ | Flags := 0; | ||
+ | html_preview.Navigate(WideString(prog_path+' | ||
+ | } | ||
+ | end; | ||
+ | except | ||
+ | raise Exception.Create(' | ||
+ | end; | ||
+ | end; | ||
+ | Procedure per_rubrics; | ||
+ | var Values: OLEVariant; | ||
+ | ISheet, ISheet_rubr_index, | ||
+ | articles: array of TMyContent; | ||
+ | rubr_index: array of rubr_index_element; | ||
+ | rubriks: array of rubriks_element; | ||
+ | |||
+ | Sorted_rubriks: | ||
+ | Rubrik_Object: | ||
+ | |||
+ | odd_even: | ||
+ | page_counter, | ||
+ | x: | ||
+ | user_max_year, | ||
+ | stroka: | ||
+ | Rubriks_TOC: | ||
+ | Rubriks_Names: | ||
+ | Rubriks_Articles: | ||
+ | IRange: Excel8TLB.Range; | ||
+ | i,z: integer; | ||
+ | year_vol_str, | ||
+ | prev_group: integer; | ||
+ | procedure show_table_rubrik(i: | ||
+ | Const min_vol = 1; | ||
+ | | ||
+ | | ||
+ | var x, | ||
+ | | ||
+ | | ||
+ | | ||
+ | // если рубрики в номере нет, то значение равно нулю, | ||
+ | // в противном случае - это номер страницы | ||
+ | // последний столбец - количество номеров с рубриками в определённом | ||
+ | begin | ||
+ | // определить min_year, max_year для конкретной рубрики | ||
+ | // | ||
+ | |||
+ | // Заполнить таблицу ссылок (all_volumes) для рубрики | ||
+ | FillChar(all_volumes, | ||
+ | for x := rubriks[i].index to rubriks[i].index+rubriks[i].count-1 do begin // прочесать все статьи для рубрики x | ||
+ | | ||
+ | | ||
+ | if (user_year >= min_year) and (user_year <= max_year) and | ||
+ | | ||
+ | then begin | ||
+ | if all_volumes[user_year, | ||
+ | | ||
+ | inc(all_volumes[user_year, | ||
+ | | ||
+ | end; | ||
+ | |||
+ | // Создать заголовок таблицы ссылок для рубрики | ||
+ | // | ||
+ | Rubriks_Articles.Add('< | ||
+ | Rubriks_Articles.Add('< | ||
+ | for y := min_vol to max_vol do begin | ||
+ | if y<10 | ||
+ | then Rubriks_Articles.Add(format('< | ||
+ | else Rubriks_Articles.Add(format('< | ||
+ | end; | ||
+ | Rubriks_Articles.Add('</ | ||
+ | // просчитать пределы годов отображения | ||
+ | for x := max_year downto min_year do begin | ||
+ | | ||
+ | if (all_volumes[x, | ||
+ | end; | ||
+ | for x := min_year to max_year do begin | ||
+ | | ||
+ | if (all_volumes[x, | ||
+ | end; | ||
+ | // вывести основную часть таблицы | ||
+ | for x := user_max_year downto user_min_year do begin | ||
+ | if (x mod 2) = 0 then style := ' | ||
+ | | ||
+ | for y := min_vol to max_vol do begin | ||
+ | if y < 10 | ||
+ | then year_vol_str := format(' | ||
+ | else year_vol_str := format(' | ||
+ | if (year_vol_str = ' | ||
+ | | ||
+ | if (all_volumes[x, | ||
+ | then Rubriks_Articles.Add(format('< | ||
+ | else Rubriks_Articles.Add('< | ||
+ | | ||
+ | end; | ||
+ | if (x = 1992) and (y = 6) then continue; // пропустить номер 1992 6 | ||
+ | if (all_volumes[x, | ||
+ | then Rubriks_Articles.Add(format('< | ||
+ | else Rubriks_Articles.Add('< | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Articles.Add('</ | ||
+ | |||
+ | end; | ||
+ | begin // собственно начало процедуры per_rubriks | ||
+ | if Assigned(IWorkbook) then | ||
+ | try | ||
+ | ISheet := IWorkbook.Worksheets.Item[' | ||
+ | ISheet_Rubr_index := IWorkbook.Worksheets.Item[' | ||
+ | ISheet_Rubriks := IWorkbook.Worksheets.Item[' | ||
+ | |||
+ | Rubriks_TOC := TStringList.Create; | ||
+ | Rubriks_Names := TStringList.Create; | ||
+ | Rubriks_Articles := TStringList.Create; | ||
+ | |||
+ | file_All_Rubriks_Index: | ||
+ | try | ||
+ | // создать конечный перечень - имя автора (заголовок, | ||
+ | |||
+ | // загрузить лист "Содержание" | ||
+ | IRange := ISheet.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | SetLength(Articles, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Articles[i] do begin | ||
+ | | ||
+ | | ||
+ | title := Values[i, 3]; | ||
+ | page := Values[i, 4]; | ||
+ | link := Values[i, 5]; | ||
+ | | ||
+ | year := Values[i, 7]; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet_Rubr_index.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | Setlength(Rubr_index, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Rubr_index[i] do begin | ||
+ | name := Values[i, 1]; | ||
+ | index := Values[i, 2]; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // загрузить лист " | ||
+ | IRange := ISheet_Rubriks.UsedRange[0]; | ||
+ | Values := IRange.Value; | ||
+ | Setlength(Rubriks, | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | for i := 1 to IRange.Rows.Count do begin | ||
+ | local_progress.stepit; | ||
+ | with Rubriks[i] do begin | ||
+ | name := Values[i, 1]; | ||
+ | index := Values[i, 2]; | ||
+ | count := Values[i, 3]; | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | // создать список рубрик, | ||
+ | Sorted_rubriks := TStringList.Create; | ||
+ | for i := 1 to length(rubriks)-1 do begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | sorted_rubriks.Sort; | ||
+ | |||
+ | // построить первую страницу (перечень групп рубрик и ссылка на алфавитный список рубрик) | ||
+ | |||
+ | Rubriks_TOC.add('< | ||
+ | |||
+ | Rubriks_TOC.add('< | ||
+ | odd_even := true; | ||
+ | // | ||
+ | Rubriks_TOC.add('< | ||
+ | Rubriks_TOC.add('< | ||
+ | x := 1; | ||
+ | repeat | ||
+ | | ||
+ | for i:=0 to 2 do begin | ||
+ | if (x+i > length(Rubriks_Groups)-1) then continue; | ||
+ | Rubriks_TOC.add(format('< | ||
+ | | ||
+ | | ||
+ | for i:=0 to 2 do begin | ||
+ | if (x+i > length(Rubriks_Groups)-1) then continue; | ||
+ | Rubriks_TOC.add(format('< | ||
+ | | ||
+ | | ||
+ | | ||
+ | until (x > length(Rubriks_Groups)-1); | ||
+ | Rubriks_TOC.add('</ | ||
+ | Rubriks_TOC.add('< | ||
+ | Rubriks_TOC.add('< | ||
+ | Rubriks_TOC.add('< | ||
+ | |||
+ | // построить список всех рубрик (группированный по темам) | ||
+ | Rubriks_Names.add('< | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step := 1; | ||
+ | statusbar1.simpletext := ' | ||
+ | z := 0; | ||
+ | page_counter := 0; | ||
+ | odd_even := false; | ||
+ | (*// на странице уже есть | ||
+ | inc(page_counter, | ||
+ | inc(page_counter, | ||
+ | *) | ||
+ | prev_group: | ||
+ | |||
+ | Rubriks_Names.Add('< | ||
+ | for i:= 1 to length(rubriks)-1 do begin | ||
+ | if (Rubriks[i].group_number<> | ||
+ | if (rows_counter> | ||
+ | for x:=z to 2 do begin // закончить последнюю строку в таблице | ||
+ | Rubriks_Names.Add('< | ||
+ | | ||
+ | Rubriks_Names.Add('</ | ||
+ | z := 0; // снова инициализировать счётчик столбцов | ||
+ | rows_counter := 0; | ||
+ | // | ||
+ | odd_even := false; // снова инициализировать полосатость | ||
+ | prev_group := Rubriks[i].group_number; | ||
+ | Rubriks_Names.add(format('< | ||
+ | // | ||
+ | page_counter := 27; | ||
+ | Rubriks_Names.Add('< | ||
+ | | ||
+ | |||
+ | if z = 3 then begin // запустить новую строку | ||
+ | inc(page_counter, | ||
+ | inc(rows_counter); | ||
+ | z := 0; | ||
+ | if odd_even | ||
+ | then Rubriks_Names.Add('</ | ||
+ | else Rubriks_Names.Add('</ | ||
+ | odd_even: | ||
+ | | ||
+ | if (page_counter> | ||
+ | Rubriks_Names.Add('</ | ||
+ | z := 0; | ||
+ | rows_counter := 0; | ||
+ | page_counter := 0; | ||
+ | odd_even: | ||
+ | Rubriks_Names.add(format('< | ||
+ | inc(page_counter, | ||
+ | Rubriks_Names.Add('< | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | for x:=z to 2 do begin // закончить последнюю строку в таблице | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Names.Add('</ | ||
+ | |||
+ | // построить список всех рубрик, | ||
+ | |||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step := 1; | ||
+ | statusbar1.simpletext := ' | ||
+ | z := 0; | ||
+ | page_counter := 0; | ||
+ | odd_even := false; | ||
+ | prev_group : | ||
+ | Rubriks_Names.add('< | ||
+ | inc(page_counter, | ||
+ | Rubriks_Names.add(format('< | ||
+ | inc(page_counter, | ||
+ | Rubriks_TOC.add(format(' | ||
+ | Rubriks_Names.Add('< | ||
+ | for i:= 0 to sorted_rubriks.Count-1 do begin | ||
+ | if (ord(upcase(sorted_rubriks.Strings[i][1]))<> | ||
+ | Rubriks_TOC.add(format(', | ||
+ | for x:=z to 2 do begin // закончить последнюю строку в таблице | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Names.Add('</ | ||
+ | // | ||
+ | z := 0; // снова инициализировать счётчик столбцов | ||
+ | rows_counter := 0; | ||
+ | odd_even := false; // снова инициализировать | ||
+ | prev_group := ord(upcase(sorted_rubriks.Strings[i][1])); | ||
+ | if (page_counter> | ||
+ | | ||
+ | | ||
+ | end else Rubriks_Names.add(format('< | ||
+ | inc(page_counter, | ||
+ | Rubriks_Names.Add('< | ||
+ | | ||
+ | |||
+ | if z = 3 then begin // запустить новую строку | ||
+ | inc(page_counter, | ||
+ | inc(rows_counter); | ||
+ | z := 0; | ||
+ | if odd_even | ||
+ | then Rubriks_Names.Add('</ | ||
+ | else Rubriks_Names.Add('</ | ||
+ | odd_even: | ||
+ | | ||
+ | if (page_counter> | ||
+ | Rubriks_Names.Add('</ | ||
+ | z := 0; | ||
+ | rows_counter := 0; | ||
+ | page_counter := 0; | ||
+ | odd_even: | ||
+ | // | ||
+ | Rubriks_Names.add(format('< | ||
+ | Rubriks_Names.Add('< | ||
+ | inc(page_counter, | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | end; | ||
+ | for x:=z to 2 do begin // закончить последнюю строку в таблице | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Names.Add('</ | ||
+ | Rubriks_TOC.add('</ | ||
+ | |||
+ | // построить список нижнего уровня | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | Rubriks_Articles.add('< | ||
+ | prev_group := 0; | ||
+ | for i := 1 to length(Rubriks)-1 do begin | ||
+ | | ||
+ | if (Rubriks[i].group_number<> | ||
+ | prev_group := Rubriks[i].group_number; | ||
+ | Rubriks_Articles.add(format('< | ||
+ | | ||
+ | if rubriks[i].common=1 then begin // регулярная рубрика | ||
+ | // style=" | ||
+ | stroka := format('< | ||
+ | Rubriks_Articles.add(stroka); | ||
+ | show_table_rubrik(i); | ||
+ | end else begin // обычная рубрика | ||
+ | stroka := format('< | ||
+ | Rubriks_Articles.add(stroka); | ||
+ | Rubriks_Articles.add('< | ||
+ | for x: | ||
+ | with articles[Rubr_index[x].index] do begin | ||
+ | |||
+ | if (year = ' | ||
+ | | ||
+ | | ||
+ | end else begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | stroka: | ||
+ | if (rubrika <> '' | ||
+ | if (author <> '' | ||
+ | if (title <> '' | ||
+ | stroka := stroka + '</ | ||
+ | Rubriks_Articles.Add(stroka); | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Articles.add('</ | ||
+ | | ||
+ | end; | ||
+ | Rubriks_Articles.add('</ | ||
+ | statusbar1.simpletext: | ||
+ | |||
+ | Rubriks_TOC.SaveToStream(file_All_Rubriks_Index); | ||
+ | Rubriks_Names.SaveToStream(file_All_Rubriks_Index); | ||
+ | Rubriks_Articles.SaveToStream(file_All_Rubriks_Index); | ||
+ | finally | ||
+ | IRange := nil; | ||
+ | ISheet := nil; | ||
+ | ISheet_Rubr_index := nil; | ||
+ | ISheet_Rubriks := nil; | ||
+ | setlength(articles, | ||
+ | setlength(Rubr_index, | ||
+ | setlength(Rubriks, | ||
+ | file_All_Rubriks_Index.Free; | ||
+ | Rubriks_TOC.Free; | ||
+ | Rubriks_Names.Free; | ||
+ | Rubriks_Articles.Free; | ||
+ | { | ||
+ | // открыть созданный Html во встроенном редакторе | ||
+ | Flags := 0; | ||
+ | html_preview.Navigate(WideString(prog_path+' | ||
+ | } | ||
+ | end; | ||
+ | except | ||
+ | raise Exception.Create(' | ||
+ | end; | ||
+ | end; | ||
+ | procedure make_bookmarks; | ||
+ | var Bookmarks_Content: | ||
+ | x, y: integer; | ||
+ | year_vol_str, | ||
+ | Const min_vol = 1; | ||
+ | max_vol = 12; | ||
+ | begin | ||
+ | Bookmarks_Content := TStringList.Create; | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('< | ||
+ | for x := max_year downto min_year do begin | ||
+ | | ||
+ | | ||
+ | for y := min_vol to max_vol do begin | ||
+ | if y<10 | ||
+ | then begin | ||
+ | year_vol_str := format(' | ||
+ | str_vol := format(' | ||
+ | end else begin | ||
+ | year_vol_str := format(' | ||
+ | str_vol := format(' | ||
+ | | ||
+ | if (year_vol_str = ' | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if (x = 1992) and (y = 6) then continue; // пропустить номер 1992 6 | ||
+ | Bookmarks_Content.Add(format('< | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | Bookmarks_Content.Add('</ | ||
+ | Bookmarks_Content.Add('< | ||
+ | Bookmarks_Content.Add('</ | ||
+ | Bookmarks_Content.SaveToFile(' | ||
+ | end; | ||
+ | begin | ||
+ | global_progress.Min: | ||
+ | global_progress.max: | ||
+ | global_progress.Position: | ||
+ | global_progress.Step: | ||
+ | statusbar1.simpletext: | ||
+ | CreateBatches; | ||
+ | Load_complex_rubriks; | ||
+ | Load_rubriks_groups; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | if chk_make_bookmarks.Checked then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | if chk_make_content.Checked then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | if chk_make_authors.Checked then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | if chk_make_rubriks.Checked then begin | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | global_progress.StepIt; | ||
+ | |||
+ | statusbar1.simpletext: | ||
+ | make_bookmarks; | ||
+ | global_progress.StepIt; | ||
+ | statusbar1.simpletext: | ||
+ | local_progress.Position := local_progress.Max; | ||
+ | global_progress.Position := global_progress.Max; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.btn_simple_volumeClick(Sender: | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.btn_Collect_DataClick(Sender: | ||
+ | type temp_content_element = record | ||
+ | rubrika : string; | ||
+ | author : string; | ||
+ | title : string; | ||
+ | page : string; | ||
+ | link : string; | ||
+ | volume : string; | ||
+ | year : string; | ||
+ | responsible : string; | ||
+ | | ||
+ | var FullFileName: | ||
+ | x, n, position: | ||
+ | Values: OLEVariant; | ||
+ | IRange: Excel8TLB.Range; | ||
+ | ISheet: Excel8TLB._Worksheet; | ||
+ | Content: array of temp_content_element; | ||
+ | x_volume : string; | ||
+ | x_year : string; | ||
+ | x_responsible : string; | ||
+ | use_interpolation: | ||
+ | procedure check_content(FullFileName: | ||
+ | var test: | ||
+ | | ||
+ | if use_interpolation then begin | ||
+ | if trim(rubrika+author+title+page+link)='' | ||
+ | end else begin | ||
+ | if trim(rubrika+author+title+page+link+volume+year+responsible)='' | ||
+ | end; | ||
+ | if (trim(page)='' | ||
+ | then ShowMessageInLog(year, | ||
+ | if (trim(rubrika + author + title) = '' | ||
+ | then ShowMessageInLog(year, | ||
+ | try | ||
+ | | ||
+ | except | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if (test> | ||
+ | then ShowMessageInLog(year, | ||
+ | try | ||
+ | | ||
+ | except | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if (test> | ||
+ | then ShowMessageInLog(year, | ||
+ | try | ||
+ | | ||
+ | except | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | if (test<1) or (test> | ||
+ | then ShowMessageInLog(year, | ||
+ | if rubrika = ' | ||
+ | then rubrika := ' | ||
+ | if rubrika = ' | ||
+ | then rubrika := ' | ||
+ | if rubrika = ' | ||
+ | then rubrika := ' | ||
+ | if rubrika = ' | ||
+ | then rubrika := ' | ||
+ | if title = ' | ||
+ | title := ''; | ||
+ | if rubrika = '' | ||
+ | then rubrika := ' | ||
+ | else rubrika := rubrika + ' | Маленькие хитрости'; | ||
+ | | ||
+ | | ||
+ | function cure_volume(stroka: | ||
+ | | ||
+ | if length(stroka)=1 | ||
+ | then result := ' | ||
+ | else result := stroka; | ||
+ | | ||
+ | function cure_page(stroka: | ||
+ | | ||
+ | try | ||
+ | | ||
+ | except | ||
+ | end; | ||
+ | result: | ||
+ | | ||
+ | function cure(stroka: | ||
+ | var temp: string; | ||
+ | | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | temp: | ||
+ | result: | ||
+ | | ||
+ | begin | ||
+ | OpenDialog1.InitialDir: | ||
+ | OpenDialog1.Options: | ||
+ | if not OpenDialog1.Execute then exit; // свалить, | ||
+ | |||
+ | if Application.MessageBox( | ||
+ | ' | ||
+ | ' | ||
+ | MB_YESNO) = IDYES then use_interpolation: | ||
+ | statusbar1.simpletext: | ||
+ | local_progress.Min: | ||
+ | local_progress.max: | ||
+ | local_progress.Position: | ||
+ | local_progress.Step: | ||
+ | global_progress.Min: | ||
+ | global_progress.max: | ||
+ | global_progress.Position: | ||
+ | global_progress.Step: | ||
+ | for n:=0 to OpenDialog1.Files.Count-1 do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | if Assigned(IXLSApp) and (not Assigned(IWorkbook2))then | ||
+ | try | ||
+ | try | ||
+ | | ||
+ | EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, | ||
+ | EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, 0); | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | // взять значение номера, | ||
+ | if use_interpolation then begin | ||
+ | x_volume := Values[2, | ||
+ | x_volume := cure(x_volume); | ||
+ | x_volume := cure_volume(x_volume); | ||
+ | x_year := Values[2, | ||
+ | x_year := cure(x_year); | ||
+ | x_responsible := Values[2, | ||
+ | x_responsible := cure(x_responsible); | ||
+ | | ||
+ | for x:=2 to IRange.Rows.Count do begin | ||
+ | with Content[position + x - 2] do begin | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | title := Values[x, | ||
+ | title := cure(title); | ||
+ | page := Values[x, | ||
+ | page := cure(page); | ||
+ | page := cure_page(page); | ||
+ | link := Values[x, | ||
+ | link := cure(link); | ||
+ | if use_interpolation then begin | ||
+ | volume := x_volume; | ||
+ | year := x_year; | ||
+ | responsible := x_responsible; | ||
+ | end else begin | ||
+ | volume := Values[x, | ||
+ | volume := cure(volume); | ||
+ | volume := cure_volume(volume); | ||
+ | year := Values[x, | ||
+ | year := cure(year); | ||
+ | responsible := Values[x, | ||
+ | responsible := cure(responsible); | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | raise Exception.Create(' | ||
+ | | ||
+ | | ||
+ | try | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // | ||
+ | // | ||
+ | |||
+ | // выгрузить инфу на лист ISheet_auth_index | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | for x:=0 to length(Content)-1 do begin | ||
+ | local_progress.StepIt; | ||
+ | with Content[x] do begin | ||
+ | if page = '' | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | finally | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | global_progress.stepit; | ||
+ | statusbar1.simpletext: | ||
+ | IWorkbook.Save(0); | ||
+ | |||
+ | local_progress.Position := local_progress.Max; | ||
+ | global_progress.Position := global_progress.Max; | ||
+ | statusbar1.simpletext: | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Button1Click(Sender: | ||
+ | begin | ||
+ | errorlog.Items.Clear; | ||
+ | end; | ||
+ | |||
+ | procedure TForm1.Button2Click(Sender: | ||
+ | var otchet : TStringList; | ||
+ | x: integer; | ||
+ | begin | ||
+ | | ||
+ | | ||
+ | if SaveDialog1.Execute then begin | ||
+ | for x:=0 to ErrorLog.Items.Count-1 do begin | ||
+ | with ErrorLog.Items.Item[x] do | ||
+ | otchet.Add(format(' | ||
+ | end; | ||
+ | otchet.SaveToFile(SaveDialog1.FileName); | ||
+ | | ||
+ | | ||
+ | end; | ||
+ | |||
+ | end. | ||
+ | |||
+ | // Особая позиция! Только для служебного " | ||
+ | // | ||
+ | // Я люблю Microsoft. Всей своей мелкой душонкой, | ||
+ | // Я люблю эту фирму за то, что периодически веселит меня изменениями в логике методов интерфейсов | ||
+ | // ее приложений. За то, что мне не скучно жить от все увеличивающихся сервис-паков и сервис-релизов. | ||
+ | // За редактор VBA я тоже ее люблю, а особенно за ToolTips в нем и F5/F8/F9 в отладчике. И за язык | ||
+ | // этот самый я ее люблю. И за " | ||
+ | // И за обработку исключений, | ||
+ | // же код может работать, | ||
+ | // давления, | ||
+ | // парами десятков потоков. Он, ведь, практически не использует ресурсов? | ||
+ | // Word, забыв сохранить последний мой файл. А Excel от этого только устойчивей. Он под натиском | ||
+ | // обработчиков событий просто вешает своих клиентов, | ||
+ | // закрывать, | ||
+ | // Так я люблю Microsoft, такой сильною любовью, | ||
+ | // Но видно не выжила б эта женщина в наших широтах с нашим климатом и под НАШИМИ звездами. | ||
+ | // | ||
+ | // А еще мне нравится справка по VBA. Особенно, | ||
+ | // Или они думали, | ||
+ | // свойство SubTotals у объекта PivotField?" | ||
+ | // | ||
+ | // Злой. | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ |
science_and_life/isxodniki.1489414465.txt.gz · Last modified: 2017/03/13 17:14 by 84.180.171.72