пятница, 19 апреля 2013 г.

Ещё о "микросхемах"

Интерфейс и подход, которыми я горжусь:

 Ik2TagGenerator = interface(IUnknown)
  {* Генератор тегов }
   ['{694DAEA5-80F3-4E12-9CCF-2B9950479734}']
   procedure pm_SetCharsInLine(aValue: Integer);
   function pm_GetCurrentStartLevel: Integer;
   function pm_GetNextGenerator: Ik2TagGenerator;
   procedure pm_SetNextGenerator(const aValue: Ik2TagGenerator);
   function pm_GetContext: Ik2Op;
   function Get_CurrentVersion: Integer;
   procedure Set_CurrentVersion(aValue: Integer);
   procedure AddStringAtom(TagID: Integer;
    const Value: AnsiString;
    aCodePage: Integer = CP_ANSI); overload;
     {* добавить строковый атом. }
   procedure AddPCharLenAtom(TagID: Integer;
    const Value: Tl3WString);
     {* добавить строковый атом. }
   procedure AddObjectAtom(TagID: Integer;
    Value: TObject;
    Shared: Boolean = true);
   procedure AddStreamAtom(TagID: Integer;
    aStream: TStream);
     {* добавить атом из потока. }
   procedure AddTransparentAtom(TagID: Integer);
     {* добавить "прозрачный" атом. }
   procedure AddIntegerAtom(TagID: Integer;
    Value: Integer);
     {* добавить целочисленный атом. }
   procedure AddBoolAtom(TagID: Integer;
    Value: Boolean);
   procedure AddAtom(AtomIndex: Integer;
    TK: Tk2TypeKind;
    const Value);
     {* добавить атом. }
   procedure AddStringAtom(TagID: Integer;
    Value: Tl3PrimString); overload;
   procedure AddAtomEx(AtomIndex: Integer;
    const Value: Tk2Variant);
   procedure Start;
     {* начать генерацию. }
   procedure StartChild(TypeID: Integer);
     {* начать дочерний объект тега. }
   procedure StartDefaultChild;
     {* начать дочерний объект тега с типом по-умолчанию. }
   procedure StartTag(TagID: Integer);
     {* начать вложеный тег. }
   procedure Finish(NeedUndo: Boolean = false);
     {* закрыть скобку этапа генерации. }
   procedure Rollback(CheckBrackets: Boolean = false);
     {* откатить все открытые "скобки". }
   function Pixel2Char(Pixel: Integer): Integer;
   function Char2Pixel(Ch: Integer): Integer;
   procedure AddStringAtomClone(TagID: Integer;
    Value: Tl3CustomString);
   procedure AddInt64Atom(aTagID: Integer;
    aValue: Int64);
     {* Добавляет 64-битный атом }
   property CharsInLine: Integer
     write pm_SetCharsInLine;
   property CurrentStartLevel: Integer
     read pm_GetCurrentStartLevel;
   property NextGenerator: Ik2TagGenerator
     read pm_GetNextGenerator
     write pm_SetNextGenerator;
     {* следующий генератор в цепочке. }
   property Context: Ik2Op
     read pm_GetContext;
     {* Контекст генерации }
   property CurrentVersion: Integer
     read Get_CurrentVersion
     write Set_CurrentVersion;
     {* Текущая версия формата }
 end;//Ik2TagGenerator

-- у нас на этом построены все преобразователи форматов различных текстов.

Ну такой "местный" SAX "на коленке".

Ну и конечно к этому прилагается свой DTD.

Комментариев нет:

Отправить комментарий