/
Alex-Z
/
E-Library
Обзор
Документация
Войти
/
Alex-Z
/
E-Library
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ZClasses.pas
543 строки
26 KB
Алексей Замула
create: hel.dpr, hel.dproj, hel.dproj.local, hel.identcache, hel.res, MainForm.dfm, MainForm.pas, ZClasses.pas
19 май 2026, 12:06
Верифицирован
19 май 2026, 12:06
31d269a
Код
Авторство
О чём код?
unit ZClasses; interface uses System.SysUtils, Vcl.Imaging.pngimage, Vcl.Imaging.jpeg, System.Classes, Vcl.Graphics, Xml.XMLIntf, Xml.XMLDoc, System.Generics.Collections, EncdDecd, System.NetEncoding; function Base64ToPng(str_base64: string): TPngImage; procedure PaintButton(Canvas: TCanvas; BackgroundColor: TColor; Png: TPngImage; Down: boolean = false); type TThemeColor = class public const clSysPanel = $444444; //RGB(68, 68, 68); clPanel = $b8bbbe; //RGB(190, 187, 184); clSelBtn = $949698; //RGB(152, 150, 148); clSelSysBtn = $505050; //RGB(80, 80, 80); clSelClose = $2311e8; //RGB(232, 17, 35); clWorkArea = $a4bbb8; //clWorkArea = $5c5e60; //RGB(96, 94, 92); clReadText = $444400; //RGB(0, 68, 68); end; TIcons = class public const base64_close = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARVBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADZo62CAAAAFnRSTlMAAen3zq3+5x0LOIVbWuiuUTeEUPbPRRPPz' + 'QAAAK1JREFUOMutU8kWgyAMlOCGC2pp8/+fWkTLJr7pwbnNJC97quoRGKI111Yi4wkxyyG1b5KZYgfu+tjed1bSns6tpbUKdlVboZ2D8LKcG/Gjotn5GEXMlMw/xJxuMvqqjla296XmHYM85cg1xXQETpKlGF1plwaiVhY+sYjySlx0i4+6W5qrr9DA3w4oBSwStYkGhUaNloXWDQ8GnRw8Wnj2N48THI' + 'wuvZ42zzz2F35zE793fNC1AAAAAElFTkSuQmCC'; base64_max = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAdklEQVRYw+2XsQnAMAwEX5Aui3gDr21N5sapnSIWBPWRDPkH1XdYLvQA86QAUAADwPx4xmKVN7wHgP10k9AEuI3KepIzafWXLJO0HNm/nwIUoIAXkCDu5AooQAEKUGAbAbguUAN41XWE1LO8bVFMT' + 'KJlVbN/5wamlLxCjl3xmwAAAABJRU5ErkJggg=='; base64_norm = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA9UlEQVRYw+2WvQ2DMBSEP0t0SRtmYAPWgLnYJYIRYCEaQkqnsSOHxOCADS446UlufO/0fuwDdxRAC4yAXBkj0AElf6LakNQWlWvyMkByHYWLgM64cAdS1uOmODRf63LJ7PmW5BqpORPC4YI0zgI/k' + 'L4JVwtIiAQZUAODh8kegEZxzlVABxnQB1ixfkbEh4Am4J43SwKEKtklUGsfwHVpC2Tg+RJRb8EpIHHo16aX7mxBjALML/359Sx6nIFfnOnUkIjQ/73BKS12b7cKWE3pngJG5QOLI4ZQnGsYpQAmPjD3wJdP/OEiQlqy2tUR721KD7flb7wATOwGbHpv5MYAAAAASUVORK5CYII='; base64_min = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAD1BMVEVHcEwAAAAAAAAAAAAAAADTrAj/AAAABHRSTlMA6FDpdw/gCgAAAB9JREFUKM9jYBgFQxQouqAAIwYRVAFHTAE0LUKELQEARxoQEX6gRHQAAAAASUVORK5CYII='; base64_param = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABklBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhCpFxAAAAhXRSTlMAd03xBB/5/gIF+lQoxJ+xqdS6DaJo/NrpB0rJAS9OWrZGCS3r3M2yzIOzweM9u5s1QaV' + 'DJGfTtJWFyOyKaw51+71lA4knS45vEuAh726c3yAGz/PZ3po43QzV7iqR7VsxsMMct5dXF2PSxa/yv2C8SaMrFSKhpLhIws7m1x2t20Ws9at8LL6vjwAAAZNJREFUOMt9U4dWwkAQXBAIHUEUGyBSVBQVe++999577723/W/vLhECOZz3kuztTHZnNy8AHFRarwCurRFIBTtaAC7xRJ9KUIFoLxbQwWfz' + 'wVCADEeFPH5jLVyOEs5vgx8KwS6jSvdMOyz4VAj200naQu0VUaGZ06QYcZ0+LxDfuS6fEL306UN84dDaMKl8Slsck8D2ytsBgcOTu8mCt/j4M+OdbM1l37ExLUWBh5hgGLHDIIYGh8hv/S1K3UpufSTjBtD/RAHIpPZDYuCP12H9xEAdEeSd3TziVxSe8R7AhgFJMIZxCOQqgcidFmA73ScJMmZRjpBGM' + 'VlugsCv3E0jzTdowVxFg4NkOsddRtItLHZSp+bEHq4s+pouQ9wza2JskgvExkHplMZOI3KBkaWmxSUOCuyULRdo/N5lkstkhxISuUy93Uk256iJLj1MtlM/KuWY1axu85RooEbBG0IJiypQCHowEaPJAhXiktpK62f3e4ZQqFWUUK3mAJiIYB6gzZmZ4n9cId96Ef6BxogLvPwvt5miD2r49MUAAAAASU' + 'VORK5CYII='; base64_open = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACglBMVEVHcEzw8PDw8PDw8PDv7+/w8PDw8PA2X6U2X6Y1XqTw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDr6+s0fPIeUq2qrbI3fe4jWbbe4+qkqbIsWag2XqUxXKUnV6pAgu9Hh+5FbbI9Z604YadAarBqhLNTers6ZKpPjO7U3epVkO5Wk' + 'e+XvPJXkvBupfdYk/BZlPFhnvhalfFblvJcl/NemfRgnPVfm/VjnvZinfZjn/ddmfPw8PB8fX+0tLS1tbV9foB/gILU1tfV19iysrLW2NnX2dra3N3Y2tu2trbZ29zd3t/h4uMfUajb3d7T1dbb3N3e3+Dc3d7l5ufZ2tva29zT1dUwefDS1NUgUqkhVKvk5ebi4+TR09QeUKfW19jV1tdQbJlQa5nm5+' + 'hQbJrj5OVqhLHg4eLf4eLf4OEye/ExevHU1dYze/IhU6ogU6rc3t80fPLg4eHMzc1Pa5hPapjj5ebd3+Db3d3f4eGKr+nNzs/LzMzg4uPe4OEpZcopY8Xu7u4yevEqaM4oYcAratOJioy3uLksbdgxefDk5OQsb91+f4EnXryio6QtceHT1NXR0tIuc+YnZMvv7+/o6OiBgoQoZcy9vb6NjpCoqaouduo' + 'weO/W19ezs7MlXLYdUKgkWbIdUaoeUKiVlZYmXLbn6One4OAeUarX2Nkyd+keUqx1dnbi5OVQa5iGq+aFquWWl5iVlpfh4+RWcZ+HrObGx8eztLWcnJ2ys7SHrOfMzM2nqKiGhoeJruiFhYbHyMiVlpbOz9CUlJTP0NHY2dqWu/HJycmLserd3t7Ky8vIycmVuvGOs+yNsuuPtOySt+6Rtu6Pte2TuO+U' + 'ufDGx8jLy8zuR96LAAAAO3RSTlMA+d8Vp3kCf39/hLJVSgb9Huc//f1/V1d/f39/f39/f39/f3/9V39/f39//X9Yf3+Af39/f39/f39/f/hBQecAAAH8SURBVDjLY2DABfh4GPABAS5Ba9yybLzc/NbWOBUwszJZgwF2aSEWRmtrFAUSS5OCokpTor0LA8ryfd2sEcDZ2VkUqEAjCaggZc0m78JlXhgKJ' + 'BkYdLWDgrxWl0fv8vCws7NDV6CiymBwNChq2/Yd0d5pFQFegf7IChY7O6cqMFiejirds3ufdzXIADv/ECQFNhudU5UZzC+nHD5QdKgKbICvG4oC+w2pigwWl6JPHfSuunIVZIKtmyeKAofNagym5729vWvS0jMgBgSjKkhWYjC7UFPt4QH2gp2trac7mgIOBpOL6ekZGbUg/f5unsGYCqzO1Z6E6AcaYO' + 'vuiqoggYPB+ExAmZdXIDAEQoD6XTEVGJ09cQym39bW1QVNATuD4fFyf383oHZPd6B+lzhUBYnsDPqVbvshukEgzglDgV6lp2dwsLv7EaB2FycnRwwFOnvdt8INmOuYDZduKAIqWCvNoLXTFQhWuIC1O/qFQqU721ptgAqKORk0t7iAQJyTUzxIPhwkO3lCb7eNDVSB+jonMHAESfeHx1hbT5k+wwYC7B1' + 'KZBjk18cDtTo6ZvsBtYfHxMyZOdXGBqFAikFu5ZIF83qa6+uaWtq7+ibOmhYZGZmbFxHh4+MTu2j5KlkGMeGCgpyczMzGrKyOMCCYPQkuHzt/oYg4wyAAANx36pDSYaZWAAAAAElFTkSuQmCC'; base64_add = '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'; base64_edit = ''; base64_del = ''; base64_lib = 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEVHcExMLycGBwYNDw4EBQReUU9SLBxKRj9SLRxqXkk8NDNMYDt4fHWvta9+VD40NDRSOC01LCogIiEXIBBmbGcDBQM+QT1bRC2FhH0pKSYaHyEoHSYuIyp7hn9xfHUoIh6Ii4NxS1h/Vj9LKBmCWUIuHhddSkFQKxtVS0apqarJy' + '8uHXkdJUFJySDOLYkpXV1GcgG2MjowrKyuOjIpqV08uLixvRjElJSUxKic9LTtgNiQ8LCUSFRMGBwZGS0ZfYlwvNyBCRz9NVE9jcVNyfXZ2gXpCSEOmraaaopslEiWDjYaXn5l2gXqakY61ubOVjIljXFrX19KLnmve3tWPlo7I0ri/u7SHXUaCWEHZ1s6UiH1cXFe2sanm5N6xraR6UjyQZUzCv7jY08' + '2uqqLOycS3s6xCQT5OQDYzKS1uRC+ak4y8ubK7uK/e29NnZmCopJvGw7yjoZdgXlmQeWsmJiCrqKCKYEk3KCFySTTc2tZ6W0peNSLEs6jU08ViYl2flIowP1DU0s3Pzsicl4/JxsGzsKro5+FcbUlhPVHb2dFne1Our59xhVLk4tyWeWVlOic+RU1ZNSR4ZFpqamOqkINTUE1cST55TjilnpV/aFiOalx' + 'MTEljTkbi4NqEaFlvTlG4trBbU1l7Ulqis4SXfYx2h1pNTS+ap36VbleOaVJlQC5FMSdDS09JR0VpRDCEWkOgmZSUfm01LSh+YFBXV1GloqF5aF6YlpVianJ/dnBCT2E+LihoU0d3fYEuLiudjoF4gGkoKDKSl4R5a2o8RSpmSVRZWGJXOUbRzMGEjHOxt57u7emAlF+OmXeCXFi6vqK8yKZGJxqUgnGd' + 'iXmEdGnKua6YkodVQDRTR0Ovl4hwaGRTRD1yWk5jW1Jwd2NbPkahp6ySaWHEwK8uLz1VYUNtV2LJxLeOlZuKoGx7fHusvZCQU4J/k2ZaYHJVYDCJYGm5rK9DPiyVm4ZogD6ij5iJoGyUZmtldz11gmyKkodkdT67lABMCAm5WKBkAAdHcExYOe9BAAABAHRSTlMAIyYVBh5OAv4K/bPv8PyjcIuWMjRFx' + '3f9/3daEYEb/bL8oXkutPXP8NlquNiJRcDFfVL47FTv6c5n4fWcY9zxROmX7EBPtODW+aPKabH14chz2Key/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////' + '////////////////////////////////////////////////////////////////////////////////8j//8AX/s7yQAAAtNJREFUOMtjYKArYGdjY2RnYDcS4hfkxCLNKW5VPXG1tYV5ibGmFj87ujSrrlnmqts7N2y/Vc5Rns6loaoMMg0OVJT44qfvWRuzNWrWnd0TJ5aXb7rIAQTqAhBpPe3w8PC' + 'IiPgb9ZOqqjavrsjMXNXf319dXX1FDWwIp0HfioQyoJppaVWz5qWvi4+fXgFUtK4iKtkEYoJhXH79ZaCiKq5p6dcj1kdERPABFW3eEDcDbIWIztuUgrDU5ML6qI0zVyaUgcwKX7++OL81SxCsX39y8dWkzkagopjkwuaoS30rExLKEvYnp0bJS4EViE2ty5tZfLMmqRKkKDUuf8a1qI0zWrOL5yhAXGAq' + 'uTa6KC/v7p5tU4CKIptaEsNakxeEzduW7ysDUWGZsS8tL7pucvSECVMnARXNrUxqSpx5OC5xu6c0JBAVOzL2zY4uAipZ09Aw4QZQUcq8nTkLjh0MgIaj+P1FezIkZ0+ti84rWtOwa2/z/uKo1h0Hi5r9GaHRFLSs49zRTZJp0Vu2FEmUxoS1tOx9vDCr9LC8A9SI4Nql6R2z5mdIpqXNzklMaXzesDArL' + 'ovrSCE3xA3coafnnv+VPv/h/IyStKbIB7uA0q1PSw6EhUEUsIe0L4/trV3+7viib4oZL98ey0pNXLL7SVxYjLMwxIbAzp9dF2KTHp1Zdvzc6/dfcgo+HD3yKSznULsjMwsoOll5T/cW/DhT23nifM+yjkUtKUs+Ls3J7u66V2ovysQCji7v3tik0q7FuZG1p76nL5nT3h224Gz7tVQJG2EWaGr14Y2NfH' + 'ao58Lc3MjFn5cnZnf3HCjNt7NlRiQ6Oa+m3BNhJ792xs7tTMw529XcyiPEhJpwXTw6I2tz3rxq6+1eejK5UEyUBSNXyPoBbTj1YvHSwhgeKRlsGUdOoTF2bm52TKEbEzuOvOXq3taWzSPNgjv3ccryOjETyKBofAAsCyP3IzChlQAAAABJRU5ErkJggg=='; base64_html = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAADAFBMVEVHcEypl4WrmYanop+vm42fl5OfmZWxeWGwkH+bjoagi4Cmpqajm5ZDQ0Onp6dNTU3Qgk/QgE7Pfk3RhE+5j3LShlDOe0ympqbMeEy1nYmenp6oqKhBQUGLh4RERESjo6Onp6d6enqnp6enp6dtbW3' + 'Rg0+np6fPfEympqanp6ewfmmmpqbOe03Nek2oqKimpqbMek2mpqanp6fTh1BQUFCnp6dgYGCxeWGrlHuzb0ulpaVMTEynp6enp6eXioSheWhAQEBISEinp6fEjHSpl4TY2NiRioSilIeek4mZmZmZj4enp6enp6dHR0ekpKRLS0uKioqZkY56enqnp6empqZsbGynp6dqamptbW1AQEBbW1tycnJiYmLT' + 'gzBISEjXjTTWijPIaifPei3SgC/McyrJbCfMzMzKysrKbijOeCzViDLLcSnYkDXSgS/ZkzbNdSvRfy/GZSXFYiTHZyXUhjLMcirQfS7QfC7ViTLLbynLcCnIaSbFYSPdmznNdivDXCLcmTjCWiDIyMheXl5kZGTJayfTgjDUhTHWizPThDHRfi7MdCrQey3HaCbaljfOdyzUhzPKbSjXjjTWjDTGZCTEX' + 'yPYjzXTh1HblzjfoDvPeS3UhjHHZiXFYyTenjrbljdubm6OYz1xcXFnZ2fZkjbalDaQZj7AVyDbo4vaoovXjDTkr2HZoYp5eXlhYWGhoaHZoYmJVjiHUDbThTHVhzLZlDncmTrPey3RfS7YkTjXjTfcmDjdnDvDXiLOdizPf0/ThDPOfU7CXCLQgVDOe03Rg1HSgTLNeU3foT3YkTXakzbJbSjOeC7LcS' + 'zUi1TPezDMdC3RfjHgoz7Md0znt2Vzc3OMXjuLXDpaWlqNYTxsbGyMXzvLdUtwcHBra2tpaWnYjjTHx8fmtWOKWzpXV1egoKCKWTnksWJTU1Pls2NlZWWMYUzhqV+RaT/irGDaoorLy8u/VB/YoIngpV7gp17IoI/fo12WeFWRa0DJyclPT09MTExJSUmIVDdcXFyHUzeD7etEAAAAWXRSTlMAMzMFCgM' + 'HlAsBCyYJfz9/9/f39wL3+Bj7DQY6fzN/ECySTlux9wL3JEt6YPn6M2f7agz3ZBJbkzB3F38aFQqTf38d/jH7MzMzDDMhNn8Of3JRjzg8n1KHq88J2j8AAAIBSURBVDjLY2CgIzCTlXXz8nBnZGQCAkZGF0k0eZOrD5uamn6mA8GHNCBwtUBTwL/46fr1Xz9t2LBmzfuVK1escLZEVxC5Nnrt92+fv7x5' + 't3r185ePrhijKbCOjI6J/pGwatqSpTMaaufNvCSKpsARpOBtScWqB0uWzgeqOIGuQA6kYFns7IrJk06eAqqYKYxVQXLs7KyOSTl5fbv3oCvgjVwUE72wLDm2PasjHqhimyqGggXrFi1MKi9oa89KAKqYIYCmQCbyVvPdm3WzgCo2b0mIn7ZVEEPB/RsLbqeAVOR2TkiI34muwCHy1ZN716pK8zN7unI7S' + 'yp2CWK4IebF4uuplRAVsSWThdAU+EY2/2p5XA1WsX1HcuwEdAX+kf9+r3s2pzo1I7u7P6ks+YA6siwnJyd/ZNSf5o1z51S3QlQcU+dESLN5+smHR0bFRW2cOrewF6giZV/SRTF5FhGoAmYrheCQUJCCv/VTiwp7EydWpdSd1+HjZoEpcOILU1YBKfjfCFJRDFJxRldfGpbqWG19lCAKNi0HqZhSnHi68o' + 'KBoR4PzA1G3HxKEWAFH5c3HtpbA1SRelZCm5sZ5kopcQXpgMiWqJbXdy4fP3Jw/+Gj06efk9AUZ4UpUOMxtfEODFJUtDdnhwMtDRYkj7KySrGx8dhxcXFxwAALmwjDIAEARfvW+fdETVwAAAAASUVORK5CYII='; end; TLibrary = class FullFileName: TFileName; FXml: IXMLDocument; FRootXml: IXMLNode; FBookXml: iXMLNode; procedure AddBook(ABook: Variant); procedure EditBook; procedure DelBook; procedure Save; public constructor Create(AFileName: TFileName); //destructor Destroy; end; TBookFile = class FullFileName: string; PathFileName: string; FileName: string; FileExt: string; constructor Create(AFileName: TFileName); //destructor Destroy; end; TBookFB2 = class private FBookFile: TBookFile; FXml: IXMLDocument; FRootNode: IXMLNode; FTitle: iXMLNode; FBody: iXMLNode; FHtml: TStringList; FAutors: string; FListAutors: TStringList; FBookTitle: string; FAnnotation: TStringList; FSequenceName: string; FSequenceNum: string; FImages: array of TDictionary<string, string>; function GetFullFileName: string; function GetFileName: string; function GetBody: string; function GetNodeValue(RootElement: iXMLNODE; NodeName: string): string; function GetAttributeValue(RootElement: iXMLNODE; NodeName: string; AttruteName: string): string; procedure GetListAutors; function GetAutors: string; procedure GetAnnotation; procedure GetImages; function GetHtmlImage(id: string): string; function GetHtmlP(Node: iXMLNode): string; public constructor Create(BookFile: TBookFile); //destructor Destroy; property FullFileName: string read GetFullFileName; property FileName: string read GetFileName; property Body: string read GetBody; property Autors: string read FAutors; property ListAutors: TStringList read FListAutors; property BookTitle: string read FBookTitle; property Annotation: TStringList read FAnnotation; property SequenceName: string read FSequenceName; property SequenceNum: string read FSequenceNum; end; implementation uses MainForm; function Base64ToPng(str_base64: string): TPngImage; var png: TPngImage; stream: TBytesStream; begin stream := TBytesStream.Create(DecodeBase64(AnsiString(str_base64))); try stream.Position := 0; png := TPngImage.Create; png.LoadFromStream(stream); png.Transparent := true; finally stream.Free; end; Result := png; end; function Base64ToJpeg(str_base64: string): TJPEGImage; var jpg: TJPEGImage; stream: TBytesStream; begin stream := TBytesStream.Create(DecodeBase64(AnsiString(str_base64))); try stream.Position := 0; jpg := TJPEGImage.Create; jpg.LoadFromStream(stream); //jpg.Transparent := true; finally stream.Free; end; Result := jpg; end; procedure PaintButton(Canvas: TCanvas; BackgroundColor: TColor; Png: TPngImage; Down: boolean = false); //var //R: TRect; begin Canvas.Brush.Style := bsSolid; Canvas.Brush.Color := BackgroundColor; Canvas.FillRect(Rect(0, 0, 40, 40)); if not Down then Canvas.Draw(4, 4, Png) else Canvas.Draw(5, 5, Png) end; { TBookFile } constructor TBookFile.Create(AFileName: TFileName); begin inherited Create; FullFileName := AFileName; PathFileName := ExtractFilePath(FileName); FileName := ExtractFileName(AFileName); FileExt := ExtractFileExt(FileName); FileExt := Copy(FileExt, 2, Length(FileExt)); end; { destructor TBookFile.Destroy; begin inherited Destroy end; } { TBookFB2 } function TBookFB2.GetAutors: string; var i: integer; s: string; begin s:= ''; for i := 0 to FListAutors.Count - 1 do s := s + FListAutors[i] + ', '; Result := Copy(s, 1, Length(s) - 2); end; procedure TBookFB2.GetListAutors; var xml_author: iXMLNODE; author, fam, im ,ot : string; begin FListAutors := TStringList.Create; xml_author := FTitle.ChildNodes.FindNode('author'); while xml_author <> nil do begin fam := GetNodeValue(xml_author, 'last-name'); im := GetNodeValue(xml_author, 'first-name'); ot := GetNodeValue(xml_author, 'middle-name'); if fam <> '' then author := fam; if im <> '' then author := author + ' ' + im; if ot <> '' then author := author + ' ' + ot; FListAutors.Append(author); xml_author := xml_author.NextSibling; if xml_author <> nil then if xml_author.NodeName <> 'author' then xml_author := nil; end; end; procedure TBookFB2.GetAnnotation; var node: iXMLNODE; i: integer; begin FAnnotation := TStringList.Create; node := FTitle.ChildNodes.FindNode('annotation'); if Assigned(node) then for i := 0 to node.ChildNodes.Count - 1 do FAnnotation.Append(node.ChildNodes[i].Text) end; function TBookFB2.GetNodeValue(RootElement: iXMLNODE; NodeName: string): string; var node: iXMLNODE; begin node := RootElement.ChildNodes.FindNode(NodeName); if Assigned(node) then Result := node.Text else Result := ''; end; function TBookFB2.GetAttributeValue(RootElement: iXMLNODE; NodeName: string; AttruteName: string): string; var node: iXMLNODE; begin node := RootElement.ChildNodes.FindNode(NodeName); if Assigned(node) then Result := node.Attributes[AttruteName] else Result := ''; end; function TBookFB2.GetHtmlImage(id: string): string; var s, base64: string; img_width, i: integer; begin for i := 0 to Length(FImages) - 1 do if FImages[i]['id'] = id then begin img_width := StrToInt(FImages[i]['width']); if img_width >= 900 then img_width := 900; base64 := FImages[i]['base64']; s := Format(' <p class="center_img"><img src="%s" alt="%s" width="%s"></p>', [base64, id, IntToStr(img_width)]); break; end; Result := s; end; function TBookFB2.GetHtmlP(Node: iXMLNode): string; var s: string; pos1: integer; begin s := Node.XML; pos1 := pos('>', s); if pos1 > 0 then Delete(s, 1, pos1); s := s.Replace('</p>', ''); s := s.Replace('emphasis', 'em'); s := s.Replace('strikethrough', 's'); Result := s; end; procedure TBookFB2.GetImages; var binary: IXMLNode; Image: TDictionary<string, string>; id, content_type, base64, width: string; len: integer; begin len := 0; binary := FRootNode.ChildNodes.FindNode('binary'); while binary <> nil do if binary.NodeName = 'binary' then begin Image := TDictionary<string, string>.Create; id := binary.Attributes['id']; content_type := binary.Attributes['content-type']; base64 := binary.Text; width := IntToStr(Base64ToJpeg(base64).Width); Image.Add('id', id); Image.Add('content_type', content_type); Image.Add('base64', Format('data:%s;base64,%s', [content_type, base64])); Image.Add('width', width); Inc(len); SetLength(FImages, len); FImages[len - 1] := Image; binary := binary.NextSibling; end; end; constructor TBookFB2.Create(BookFile: TBookFile); var Description, node, Section, node1: IXMLNode; img_name: string; i, j: integer; begin inherited Create; FBookFile := BookFile; FXml := TXMLDocument.Create(nil); FXml.LoadFromFile(FBookFile.FullFileName); FRootNode := FXml.DocumentElement; Description := FRootNode.ChildNodes.FindNode('description'); FTitle := Description.ChildNodes.FindNode('title-info'); FBody := FRootNode.ChildNodes.FindNode('body'); GetImages; GetListAutors; FAutors := GetAutors; FBookTitle := GetNodeValue(FTitle, 'book-title'); GetAnnotation; FSequenceName := GetAttributeValue(FTitle, 'sequence', 'name'); FSequenceNum := GetAttributeValue(FTitle, 'sequence', 'number'); node := FTitle.ChildNodes.FindNode('coverpage'); if node <> nil then begin img_name := GetAttributeValue(node, 'image', 'l:href'); img_name := img_name.Replace('#', '') //img_name := Copy(img_name, 2, Length(img_name)); end; FHtml := TStringList.Create; FHtml.Append('<!DOCTYPE FHtml>'); FHtml.Append('<FHtml lang="ru">'); FHtml.Append('<head>'); FHtml.Append(' <meta charset="UTF-8">'); FHtml.Append(Format(' <link rel="icon" href="%s" type="image/png">', [TIcons.base64_html])); FHtml.Append(Format(' <title>%s</title>', [FBookTitle])); FHtml.Append(' <style>'); FHtml.Append(' .center_img { text-align: center; }'); //FHtml.Append(' body { font-family: Arial; overflow-x: hidden; overflow-y: hidden; }'); FHtml.Append(' body { font-family: Arial; overflow-x: hidden; }'); FHtml.Append(' h1 { color: #a50000; font-size: 32px; text-align: center; }'); FHtml.Append(' h2 { color: #a50000; font-size: 30px; text-indent: 30px; }'); FHtml.Append(' h3 { color: darkred; font-size: 28px; text-indent: 30px; font-style: bold; }'); FHtml.Append(' p { color: #003f53; font-size: 28px; text-indent: 30px; text-align: justify; margin-top: 0.3em; margin-bottom: 0em; }'); FHtml.Append(' p1 { color: #003f53; font-size: 28px; text-indent: 30px; text-align: justify; }'); FHtml.Append(' </style>'); FHtml.Append('</head>'); FHtml.Append('<body bgcolor="#b8bba4">'); if img_name <> '' then FHtml.Append(GetHtmlImage(img_name)); FHtml.Append(Format(' <h1>%s</h1>', [FAutors])); FHtml.Append(' <p1/>'); FHtml.Append(Format(' <h1>%s</h1>', [FBookTitle])); FHtml.Append(' <p1/>'); for i := 0 to FAnnotation.Count - 1 do FHtml.Append(Format(' <p>%s</p>', [FAnnotation[i]])); if FSequenceName <> '' then FHtml.Append(Format(' <h2>����� ����: %s; ����� ����� � �����: %s</h2>', [FSequenceName, FSequenceNum])); Section := FBody.ChildNodes.FindNode('section'); while Section <> nil do begin for i := 0 to Section.ChildNodes.Count - 1 do begin node := Section.ChildNodes.Get(i); if node.NodeName = 'title' then for j := 0 to node.ChildNodes.Count - 1 do begin node1 := node.ChildNodes.Get(j); if node1.NodeName = 'p' then FHtml.Append(Format(' <h3>%s</h3>', [GetHtmlP(node1)])); if node1.NodeName = 'empty-line' then FHtml.Append(' <p1/>'); end; if node.NodeName = 'p' then if node.ChildNodes.Count > 0 then begin node1 := node.ChildNodes.Get(0); if node1.NodeName = 'image' then begin img_name := GetAttributeValue(node, 'image', 'l:href'); img_name := img_name.Replace('#', ''); FHtml.Append(GetHtmlImage(img_name)); end else FHtml.Append(Format(' <p>%s</p>', [GetHtmlP(node)])); end else FHtml.Append(Format(' <p>%s</p>', [GetHtmlP(node)])); if node.NodeName = 'subtitle' then FHtml.Append(Format(' <p>%s</p>', [GetHtmlP(node)])); end; Section := Section.NextSibling; if Section <> nil then if Section.NodeName <> 'section' then Section := nil; end; FHtml.Append('</body>'); FHtml.Append('</FHtml>'); //FHtml.SaveToFile('D:\test.txt'); end; { destructor TBookFB2.Destroy; begin inherited Destroy end; } function TBookFB2.GetFullFileName: string; begin Result := FBookFile.FullFileName end; function TBookFB2.GetFileName: string; begin Result := FBookFile.FileName end; function TBookFB2.GetBody: string; begin Result := FHtml.Text end; { TLibrary } constructor TLibrary.Create(AFileName: TFileName); var node: IXMLNode; begin FullFileName := AFileName; if not FileExists(FullFileName) then begin try //FXml := TXMLDocument.Create(nil); FXml := NewXMLDocument; FXml.Encoding := 'utf-8'; FXml.Options := [doNodeAutoIndent]; FRootXml := FXml.AddChild('Books'); FRootXml.Attributes['Count'] := '1'; FBookXml := FRootXml.AddChild('Book'); FBookXml.Attributes['id'] := '1'; node := FBookXml.AddChild('FileName'); node.Text := '��� ����� �����'; node := FBookXml.AddChild('FileType'); node.Text := 'fb2'; node := FBookXml.AddChild('Autor'); node.Text := '�����������'; node := FBookXml.AddChild('Title'); node.Text := '������������ �����'; node := FBookXml.AddChild('SequenceName'); node.Text := ''; node := FBookXml.AddChild('SequenceNum'); node.Text := ''; node := FBookXml.AddChild('Size'); node.Text := '0'; node := FBookXml.AddChild('Pos'); node.Text := '0'; node := FBookXml.AddChild('Annotation'); node.Text := '���������'; node := FBookXml.AddChild('Data'); node.Text := ''; finally end; end else begin end; end; { destructor TLibrary.Destroy; begin // end; } procedure TLibrary.AddBook(ABook: Variant); begin // end; procedure TLibrary.EditBook; begin // end; procedure TLibrary.DelBook; begin // end; procedure TLibrary.Save; begin FXml.SaveToFile(FullFileName) end; end.