| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999 Sebastian Guenther ([email protected])
- Implementation of DOM level 1 interfaces
-
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- 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.
- **********************************************************************}
- {
- more or less DOM level 1 conformant class library for FreePascal
- }
- {$MODE objfpc}
- {$H+}
- unit DOM;
- interface
- uses sysutils, classes;
- type
- TDOMImplementation = class;
- TDOMDocumentFragment = class;
- TDOMDocument = class;
- TDOMNode = class;
- TDOMNodeList = class;
- TDOMNamedNodeMap = class;
- TDOMCharacterData = class;
- TDOMAttr = class;
- TDOMElement = class;
- TDOMText = class;
- TDOMComment = class;
- TDOMCDATASection = class;
- TDOMDocumentType = class;
- TDOMNotation = class;
- TDOMEntity = class;
- TDOMEntityReference = class;
- TDOMProcessingInstruction = class;
- // -------------------------------------------------------
- // DOMString
- // -------------------------------------------------------
- DOMString = String; // *** should be WideString /sg
- // -------------------------------------------------------
- // DOMException
- // -------------------------------------------------------
- const
- INDEX_SIZE_ERR = 1;
- DOMSTRING_SIZE_ERR = 2;
- HIERARCHY_REQUEST_ERR = 3;
- WRONG_DOCUMENT_ERR = 4;
- INVALID_CHARACTER_ERR = 5;
- NO_DATA_ALLOWED_ERR = 6;
- NO_MODIFICATION_ALLOWED_ERR = 7;
- NOT_FOUND_ERR = 8;
- NOT_SUPPORTED_ERR = 9;
- INUSE_ATTRIBUTE_ERR = 10;
- type
- EDOMError = class(Exception)
- protected
- constructor Create(ACode: Integer; const ASituation: String);
- public
- Code: Integer;
- end;
- EDOMIndexSize = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- EDOMHierarchyRequest = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- EDOMWrongDocument = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- EDOMNotFound = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- EDOMNotSupported = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- EDOMInUseAttribute = class(EDOMError)
- public
- constructor Create(const ASituation: String);
- end;
- // -------------------------------------------------------
- // Node
- // -------------------------------------------------------
- const
- ELEMENT_NODE = 1;
- ATTRIBUTE_NODE = 2;
- TEXT_NODE = 3;
- CDATA_SECTION_NODE = 4;
- ENTITY_REFERENCE_NODE = 5;
- ENTITY_NODE = 6;
- PROCESSING_INSTRUCTION_NODE = 7;
- COMMENT_NODE = 8;
- DOCUMENT_NODE = 9;
- DOCUMENT_TYPE_NODE = 10;
- DOCUMENT_FRAGMENT_NODE = 11;
- NOTATION_NODE = 12;
- type
- TRefClass = class
- protected
- RefCounter: LongInt;
- public
- constructor Create;
- function AddRef: LongInt; virtual;
- function Release: LongInt; virtual;
- end;
- TDOMNode = class
- protected
- FNodeName, FNodeValue: DOMString;
- FNodeType: Integer;
- FParentNode: TDOMNode;
- FPreviousSibling, FNextSibling: TDOMNode;
- FOwnerDocument: TDOMDocument;
- function FGetNodeValue: DOMString; virtual;
- procedure FSetNodeValue(AValue: DOMString); virtual;
- function FGetFirstChild: TDOMNode; virtual;
- function FGetLastChild: TDOMNode; virtual;
- function FGetAttributes: TDOMNamedNodeMap; virtual;
- constructor Create(AOwner: TDOMDocument);
- public
- property NodeName: DOMString read FNodeName;
- property NodeValue: DOMString read FGetNodeValue write FSetNodeValue;
- property NodeType: Integer read FNodeType;
- property ParentNode: TDOMNode read FParentNode;
- // Free NodeList with TDOMNodeList.Release!
- function GetChildNodes: TDOMNodeList; virtual;
- property FirstChild: TDOMNode read FGetFirstChild;
- property LastChild: TDOMNode read FGetLastChild;
- property PreviousSibling: TDOMNode read FPreviousSibling;
- property NextSibling: TDOMNode read FNextSibling;
- property Attributes: TDOMNamedNodeMap read FGetAttributes;
- property OwnerDocument: TDOMDocument read FOwnerDocument;
- function InsertBefore(NewChild, RefChild: TDOMNode): TDOMNode; virtual;
- function ReplaceChild(NewChild, OldChild: TDOMNode): TDOMNode; virtual;
- function RemoveChild(OldChild: TDOMNode): TDOMNode; virtual;
- function AppendChild(NewChild: TDOMNode): TDOMNode; virtual;
- function HasChildNodes: Boolean; virtual;
- function CloneNode(deep: Boolean): TDOMNode;
- // Extensions to DOM interface:
- function FindNode(const ANodeName: DOMString): TDOMNode;
- end;
- { The following class is an implementation specific extension, it is just an
- extended implementation of TDOMNode, the generic DOM::Node interface
- implementation. (Its main purpose is to save memory in a big node tree) }
- TDOMNode_WithChildren = class(TDOMNode)
- protected
- FFirstChild, FLastChild: TDOMNode;
- function FGetFirstChild: TDOMNode; override;
- function FGetLastChild: TDOMNode; override;
- public
- function InsertBefore(NewChild, RefChild: TDOMNode): TDOMNode; override;
- function ReplaceChild(NewChild, OldChild: TDOMNode): TDOMNode; override;
- function RemoveChild(OldChild: TDOMNode): TDOMNode; override;
- function AppendChild(NewChild: TDOMNode): TDOMNode; override;
- function HasChildNodes: Boolean; override;
- end;
- // -------------------------------------------------------
- // NodeList
- // -------------------------------------------------------
- TDOMNodeList = class(TRefClass)
- protected
- node: TDOMNode;
- filter: DOMString;
- UseFilter: Boolean;
- constructor Create(ANode: TDOMNode; AFilter: DOMString);
- function FGetCount: LongWord;
- function FGetItem(index: LongWord): TDOMNode;
- public
- property Item[index: LongWord]: TDOMNode read FGetItem;
- property Count: LongWord read FGetCount;
- end;
- // -------------------------------------------------------
- // NamedNodeMap
- // -------------------------------------------------------
- TDOMNamedNodeMap = class(TList)
- protected
- OwnerDocument: TDOMDocument;
- function FGetItem(index: LongWord): TDOMNode;
- procedure FSetItem(index: LongWord; AItem: TDOMNode);
- function FGetLength: LongWord;
- constructor Create(AOwner: TDOMDocument);
- public
- function GetNamedItem(const name: DOMString): TDOMNode;
- function SetNamedItem(arg: TDOMNode): TDOMNode;
- function RemoveNamedItem(const name: DOMString): TDOMNode;
- property Item[index: LongWord]: TDOMNode read FGetItem write FSetItem;
- property Length: LongWord read FGetLength;
- end;
- // -------------------------------------------------------
- // CharacterData
- // -------------------------------------------------------
- TDOMCharacterData = class(TDOMNode)
- protected
- function FGetLength: LongWord;
- public
- property Data: DOMString read FNodeValue;
- property Length: LongWord read FGetLength;
- function SubstringData(offset, count: LongWord): DOMString;
- procedure AppendData(const arg: DOMString);
- procedure InsertData(offset: LongWord; const arg: DOMString);
- procedure DeleteData(offset, count: LongWord);
- procedure ReplaceData(offset, count: LongWord; const arg: DOMString);
- end;
- // -------------------------------------------------------
- // DOMImplementation
- // -------------------------------------------------------
- TDOMImplementation = class
- public
- function HasFeature(const feature, version: DOMString): Boolean;
- end;
- // -------------------------------------------------------
- // DocumentFragment
- // -------------------------------------------------------
- TDOMDocumentFragment = class(TDOMNode_WithChildren)
- protected
- constructor Create(AOwner: TDOMDocument);
- end;
- // -------------------------------------------------------
- // Document
- // -------------------------------------------------------
- TDOMDocument = class(TDOMNode_WithChildren)
- protected
- FDocType: TDOMDocumentType;
- FImplementation: TDOMImplementation;
- FDocumentElement: TDOMElement;
- public
- property DocType: TDOMDocumentType read FDocType;
- property Impl: TDOMImplementation read FImplementation;
- property DocumentElement: TDOMElement read FDocumentElement;
- function CreateElement(const tagName: DOMString): TDOMElement; virtual;
- function CreateDocumentFragment: TDOMDocumentFragment;
- function CreateTextNode(const data: DOMString): TDOMText;
- function CreateComment(const data: DOMString): TDOMComment;
- function CreateCDATASection(const data: DOMString): TDOMCDATASection;
- virtual;
- function CreateProcessingInstruction(const target, data: DOMString):
- TDOMProcessingInstruction; virtual;
- function CreateAttribute(const name: DOMString): TDOMAttr; virtual;
- function CreateEntityReference(const name: DOMString): TDOMEntityReference;
- virtual;
- // Free NodeList with TDOMNodeList.Release!
- function GetElementsByTagName(const tagname: DOMString): TDOMNodeList;
- // Extensions to DOM interface:
- constructor Create; virtual;
- function CreateEntity(const data: DOMString): TDOMEntity;
- procedure SetDocumentElement(ADocumentElement: TDOMElement);
- end;
- TXMLDocument = class(TDOMDocument)
- public
- function CreateCDATASection(const data: DOMString): TDOMCDATASection;
- virtual;
- function CreateProcessingInstruction(const target, data: DOMString):
- TDOMProcessingInstruction; virtual;
- function CreateEntityReference(const name: DOMString): TDOMEntityReference;
- virtual;
- // Extensions to DOM interface:
- XMLVersion, Encoding: String;
- end;
- // -------------------------------------------------------
- // Attr
- // -------------------------------------------------------
- TDOMAttr = class(TDOMNode_WithChildren)
- protected
- FSpecified: Boolean;
- AttrOwner: TDOMNamedNodeMap;
- function FGetNodeValue: DOMString; override;
- procedure FSetNodeValue(AValue: DOMString); override;
- constructor Create(AOwner: TDOMDocument);
- public
- property Name: DOMString read FNodeName;
- property Specified: Boolean read FSpecified;
- property Value: DOMString read FNodeValue write FSetNodeValue;
- end;
- // -------------------------------------------------------
- // Element
- // -------------------------------------------------------
- TDOMElement = class(TDOMNode_WithChildren)
- protected
- FAttributes: TDOMNamedNodeMap;
- function FGetAttributes: TDOMNamedNodeMap; override;
- constructor Create(AOwner: TDOMDocument); virtual;
- public
- property TagName: DOMString read FNodeName;
- function GetAttribute(const name: DOMString): DOMString;
- procedure SetAttribute(const name, value: DOMString);
- procedure RemoveAttribute(const name: DOMString);
- function GetAttributeNode(const name: DOMString): TDOMAttr;
- procedure SetAttributeNode(NewAttr: TDOMAttr);
- function RemoveAttributeNode(OldAttr: TDOMAttr): TDOMAttr;
- // Free NodeList with TDOMNodeList.Release!
- function GetElementsByTagName(const name: DOMString): TDOMNodeList;
- procedure Normalize;
- end;
- // -------------------------------------------------------
- // Text
- // -------------------------------------------------------
- TDOMText = class(TDOMCharacterData)
- protected
- constructor Create(AOwner: TDOMDocument);
- public
- function SplitText(offset: LongWord): TDOMText;
- end;
- // -------------------------------------------------------
- // Comment
- // -------------------------------------------------------
- TDOMComment = class(TDOMCharacterData)
- protected
- constructor Create(AOwner: TDOMDocument);
- end;
- // -------------------------------------------------------
- // CDATASection
- // -------------------------------------------------------
- TDOMCDATASection = class(TDOMText)
- protected
- constructor Create(AOwner: TDOMDocument);
- end;
- // -------------------------------------------------------
- // DocumentType
- // -------------------------------------------------------
- TDOMDocumentType = class(TDOMNode)
- protected
- FEntities, FNotations: TDOMNamedNodeMap;
- constructor Create(AOwner: TDOMDocument);
- public
- property Name: DOMString read FNodeName;
- property Entities: TDOMNamedNodeMap read FEntities;
- property Notations: TDOMNamedNodeMap read FEntities;
- end;
- // -------------------------------------------------------
- // Notation
- // -------------------------------------------------------
- TDOMNotation = class(TDOMNode)
- protected
- FPublicID, FSystemID: DOMString;
- constructor Create(AOwner: TDOMDocument);
- public
- property PublicID: DOMString read FPublicID;
- property SystemID: DOMString read FSystemID;
- end;
- // -------------------------------------------------------
- // Entity
- // -------------------------------------------------------
- TDOMEntity = class(TDOMNode_WithChildren)
- protected
- FPublicID, FSystemID, FNotationName: DOMString;
- constructor Create(AOwner: TDOMDocument);
- public
- property PublicID: DOMString read FPublicID;
- property SystemID: DOMString read FSystemID;
- property NotationName: DOMString read FNotationName;
- end;
- // -------------------------------------------------------
- // EntityReference
- // -------------------------------------------------------
- TDOMEntityReference = class(TDOMNode_WithChildren)
- protected
- constructor Create(AOwner: TDOMDocument);
- end;
- // -------------------------------------------------------
- // ProcessingInstruction
- // -------------------------------------------------------
- TDOMProcessingInstruction = class(TDOMNode)
- protected
- constructor Create(AOwner: TDOMDocument);
- public
- property Target: DOMString read FNodeName;
- property Data: DOMString read FNodeValue;
- end;
- // =======================================================
- // =======================================================
- implementation
- constructor TRefClass.Create;
- begin
- inherited Create;
- RefCounter := 1;
- end;
- function TRefClass.AddRef: LongInt;
- begin
- Inc(RefCounter);
- Result := RefCounter;
- end;
- function TRefClass.Release: LongInt;
- begin
- Dec(RefCounter);
- Result := RefCounter;
- if RefCounter <= 0 then Free;
- end;
- // -------------------------------------------------------
- // DOM Exception
- // -------------------------------------------------------
- constructor EDOMError.Create(ACode: Integer; const ASituation: String);
- begin
- Code := ACode;
- inherited Create(Self.ClassName + ' in ' + ASituation);
- end;
- constructor EDOMIndexSize.Create(const ASituation: String); // 1
- begin
- inherited Create(INDEX_SIZE_ERR, ASituation);
- end;
- constructor EDOMHierarchyRequest.Create(const ASituation: String); // 3
- begin
- inherited Create(HIERARCHY_REQUEST_ERR, ASituation);
- end;
- constructor EDOMWrongDocument.Create(const ASituation: String); // 4
- begin
- inherited Create(WRONG_DOCUMENT_ERR, ASituation);
- end;
- constructor EDOMNotFound.Create(const ASituation: String); // 8
- begin
- inherited Create(NOT_FOUND_ERR, ASituation);
- end;
- constructor EDOMNotSupported.Create(const ASituation: String); // 9
- begin
- inherited Create(NOT_SUPPORTED_ERR, ASituation);
- end;
- constructor EDOMInUseAttribute.Create(const ASituation: String); // 10
- begin
- inherited Create(INUSE_ATTRIBUTE_ERR, ASituation);
- end;
- // -------------------------------------------------------
- // Node
- // -------------------------------------------------------
- constructor TDOMNode.Create(AOwner: TDOMDocument);
- begin
- FOwnerDocument := AOwner;
- inherited Create;
- end;
- function TDOMNode.FGetNodeValue: DOMString;
- begin
- Result := FNodeValue;
- end;
- procedure TDOMNode.FSetNodeValue(AValue: DOMString);
- begin
- FNodeValue := AValue;
- end;
- function TDOMNode.GetChildNodes: TDOMNodeList;
- begin
- Result := TDOMNodeList.Create(Self, '*');
- end;
- function TDOMNode.FGetFirstChild: TDOMNode; begin Result := nil end;
- function TDOMNode.FGetLastChild: TDOMNode; begin Result := nil end;
- function TDOMNode.FGetAttributes: TDOMNamedNodeMap; begin Result := nil end;
- function TDOMNode.InsertBefore(NewChild, RefChild: TDOMNode): TDOMNode;
- begin
- raise EDOMHierarchyRequest.Create('Node.InsertBefore');
- end;
- function TDOMNode.ReplaceChild(NewChild, OldChild: TDOMNode): TDOMNode;
- begin
- raise EDOMHierarchyRequest.Create('Node.ReplaceChild');
- end;
- function TDOMNode.RemoveChild(OldChild: TDOMNode): TDOMNode;
- begin
- raise EDOMHierarchyRequest.Create('Node.RemoveChild');
- end;
- function TDOMNode.AppendChild(NewChild: TDOMNode): TDOMNode;
- begin
- raise EDOMHierarchyRequest.Create('Node.AppendChild');
- end;
- function TDOMNode.HasChildNodes: Boolean;
- begin
- Result := False;
- end;
- function TDOMNode.CloneNode(deep: Boolean): TDOMNode;
- begin
- Result := nil;
- end;
- function TDOMNode.FindNode(const ANodeName: DOMString): TDOMNode;
- var
- child: TDOMNode;
- begin
- child := FirstChild;
- while child <> nil do begin
- if child.NodeName = ANodeName then begin
- Result := child;
- exit;
- end;
- child := child.NextSibling;
- end;
- Result := nil;
- end;
- function TDOMNode_WithChildren.FGetFirstChild: TDOMNode;
- begin
- Result := FFirstChild;
- end;
- function TDOMNode_WithChildren.FGetLastChild: TDOMNode;
- begin
- Result := FLastChild;
- end;
- function TDOMNode_WithChildren.InsertBefore(NewChild, RefChild: TDOMNode):
- TDOMNode;
- var
- i: Integer;
- begin
- if RefChild = nil then begin
- AppendChild(NewChild);
- exit(NewChild);
- end;
- if NewChild.FOwnerDocument <> FOwnerDocument then
- raise EDOMWrongDocument.Create('NodeWC.InsertBefore');
- if RefChild.ParentNode <> Self then
- raise EDOMHierarchyRequest.Create('NodeWC.InsertBefore');
- if NewChild.NodeType = DOCUMENT_FRAGMENT_NODE then
- raise EDOMNotSupported.Create('NodeWC.InsertBefore for DocumentFragment');
- NewChild.FNextSibling := RefChild;
- if RefChild = FFirstChild then
- FFirstChild := NewChild
- else
- RefChild.FPreviousSibling.FNextSibling := NewChild;
- RefChild.FPreviousSibling := NewChild;
- Result := NewChild;
- end;
- function TDOMNode_WithChildren.ReplaceChild(NewChild, OldChild: TDOMNode):
- TDOMNode;
- begin
- InsertBefore(NewChild, OldChild);
- RemoveChild(OldChild);
- Result := NewChild;
- end;
- function TDOMNode_WithChildren.RemoveChild(OldChild: TDOMNode):
- TDOMNode;
- begin
- if OldChild.ParentNode <> Self then
- raise EDOMHierarchyRequest.Create('NodeWC.RemoveChild');
- if OldChild = FFirstChild then
- FFirstChild := nil
- else
- OldChild.FPreviousSibling.FNextSibling := OldChild.FNextSibling;
- if OldChild = FLastChild then
- FLastChild := nil
- else
- OldChild.FNextSibling.FPreviousSibling := OldChild.FPreviousSibling;
- end;
- function TDOMNode_WithChildren.AppendChild(NewChild: TDOMNode): TDOMNode;
- var
- parent: TDOMNode;
- begin
- if NewChild.FOwnerDocument <> FOwnerDocument then
- raise EDOMWrongDocument.Create('NodeWC.AppendChild');
- parent := Self;
- while parent <> nil do begin
- if parent = NewChild then
- raise EDOMHierarchyRequest.Create('NodeWC.AppendChild (cycle in tree)');
- parent := parent.ParentNode;
- end;
- if NewChild.FParentNode = Self then
- RemoveChild(NewChild);
- if NewChild.NodeType = DOCUMENT_FRAGMENT_NODE then begin
- raise EDOMNotSupported.Create('NodeWC.AppendChild for DocumentFragments');
- end else begin
- if FLastChild = nil then
- FFirstChild := NewChild
- else begin
- FLastChild.FNextSibling := NewChild;
- NewChild.FPreviousSibling := FLastChild;
- end;
- FLastChild := NewChild;
- NewChild.FParentNode := Self;
- end;
- Result := NewChild;
- end;
- function TDOMNode_WithChildren.HasChildNodes: Boolean;
- begin
- Result := FFirstChild <> nil;
- end;
- // -------------------------------------------------------
- // NodeList
- // -------------------------------------------------------
- constructor TDOMNodeList.Create(ANode: TDOMNode; AFilter: DOMString);
- begin
- inherited Create;
- node := ANode;
- filter := AFilter;
- UseFilter := filter <> '*';
- end;
- function TDOMNodeList.FGetCount: LongWord;
- var
- child: TDOMNode;
- begin
- Result := 0;
- child := node.FirstChild;
- while child <> nil do begin
- if (not UseFilter) or (child.NodeName = filter) then
- Inc(Result);
- child := child.NextSibling;
- end;
- end;
- function TDOMNodeList.FGetItem(index: LongWord): TDOMNode;
- var
- child: TDOMNode;
- begin
- Result := nil;
- if index < 0 then exit;
- child := node.FirstChild;
- while child <> nil do begin
- if index = 0 then begin
- Result := child;
- break;
- end;
- if (not UseFilter) or (child.NodeName = filter) then
- Dec(index);
- child := child.NextSibling;
- end;
- end;
- // -------------------------------------------------------
- // NamedNodeMap
- // -------------------------------------------------------
- constructor TDOMNamedNodeMap.Create(AOwner: TDOMDocument);
- begin
- inherited Create;
- OwnerDocument := AOwner;
- end;
- function TDOMNamedNodeMap.FGetItem(index: LongWord): TDOMNode;
- begin
- Result := TDOMNode(Items[index]);
- end;
- procedure TDOMNamedNodeMap.FSetItem(index: LongWord; AItem: TDOMNode);
- begin
- Items[index] := AItem;
- end;
- function TDOMNamedNodeMap.FGetLength: LongWord;
- begin
- Result := LongWord(Count);
- end;
- function TDOMNamedNodeMap.GetNamedItem(const name: DOMString): TDOMNode;
- var
- i: Integer;
- begin
- for i := 0 to Count - 1 do
- if Item[i].NodeName = name then
- exit(Item[i]);
- Result := nil;
- end;
- function TDOMNamedNodeMap.SetNamedItem(arg: TDOMNode): TDOMNode;
- var
- i: Integer;
- begin
- if arg.FOwnerDocument <> OwnerDocument then
- raise EDOMWrongDocument.Create('NamedNodeMap.SetNamedItem');
- if arg.NodeType = ATTRIBUTE_NODE then begin
- if TDOMAttr(arg).AttrOwner <> nil then
- raise EDOMInUseAttribute.Create('NamedNodeMap.SetNamedItem');
- TDOMAttr(arg).AttrOwner := Self;
- end;
- for i := 0 to Count - 1 do
- if Item[i].NodeName = arg.NodeName then begin
- Result := Item[i];
- Item[i] := arg;
- exit;
- end;
- Add(arg);
- Result := nil;
- end;
- function TDOMNamedNodeMap.RemoveNamedItem(const name: DOMString): TDOMNode;
- var
- i: Integer;
- begin
- for i := 0 to Count - 1 do
- if Item[i].NodeName = name then begin
- Result := Item[i];
- Result.FParentNode := nil;
- exit;
- end;
- raise EDOMNotFound.Create('NamedNodeMap.RemoveNamedItem');
- end;
- // -------------------------------------------------------
- // CharacterData
- // -------------------------------------------------------
- function TDOMCharacterData.FGetLength: LongWord;
- begin
- Result := system.Length(FNodeValue);
- end;
- function TDOMCharacterData.SubstringData(offset, count: LongWord): DOMString;
- begin
- if (offset < 0) or (offset > Length) or (count < 0) then
- raise EDOMIndexSize.Create('CharacterData.SubstringData');
- Result := Copy(FNodeValue, offset + 1, count);
- end;
- procedure TDOMCharacterData.AppendData(const arg: DOMString);
- begin
- FNodeValue := FNodeValue + arg;
- end;
- procedure TDOMCharacterData.InsertData(offset: LongWord; const arg: DOMString);
- begin
- if (offset < 0) or (offset > Length) then
- raise EDOMIndexSize.Create('CharacterData.InsertData');
- FNodeValue := Copy(FNodeValue, 1, offset) + arg +
- Copy(FNodeValue, offset + 1, Length);
- end;
- procedure TDOMCharacterData.DeleteData(offset, count: LongWord);
- begin
- if (offset < 0) or (offset > Length) or (count < 0) then
- raise EDOMIndexSize.Create('CharacterData.DeleteData');
- FNodeValue := Copy(FNodeValue, 1, offset) +
- Copy(FNodeValue, offset + count + 1, Length);
- end;
- procedure TDOMCharacterData.ReplaceData(offset, count: LongWord; const arg: DOMString);
- begin
- DeleteData(offset, count);
- InsertData(offset, arg);
- end;
- // -------------------------------------------------------
- // DocumentFragmet
- // -------------------------------------------------------
- constructor TDOMDocumentFragment.Create(AOwner: TDOMDocument);
- begin
- FNodeType := DOCUMENT_FRAGMENT_NODE;
- FNodeName := '#document-fragment';
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // DOMImplementation
- // -------------------------------------------------------
- function TDOMImplementation.HasFeature(const feature, version: DOMString):
- Boolean;
- begin
- Result := False;
- end;
- // -------------------------------------------------------
- // Document
- // -------------------------------------------------------
- constructor TDOMDocument.Create;
- begin
- FNodeType := DOCUMENT_NODE;
- FNodeName := '#document';
- inherited Create(nil);
- FOwnerDocument := Self;
- end;
- procedure TDOMDocument.SetDocumentElement(ADocumentElement: TDOMElement);
- begin
- FDocumentElement := ADocumentElement;
- end;
- function TDOMDocument.CreateElement(const tagName: DOMString): TDOMElement;
- begin
- Result := TDOMElement.Create(Self);
- Result.FNodeName := tagName;
- end;
- function TDOMDocument.CreateDocumentFragment: TDOMDocumentFragment;
- begin
- Result := TDOMDocumentFragment.Create(Self);
- end;
- function TDOMDocument.CreateTextNode(const data: DOMString): TDOMText;
- begin
- Result := TDOMText.Create(Self);
- Result.FNodeValue := data;
- end;
- function TDOMDocument.CreateComment(const data: DOMString): TDOMComment;
- begin
- Result := TDOMComment.Create(Self);
- Result.FNodeValue := data;
- end;
- function TDOMDocument.CreateCDATASection(const data: DOMString):
- TDOMCDATASection;
- begin
- raise EDOMNotSupported.Create('DOMDocument.CreateCDATASection');
- end;
- function TDOMDocument.CreateProcessingInstruction(const target,
- data: DOMString): TDOMProcessingInstruction;
- begin
- raise EDOMNotSupported.Create('DOMDocument.CreateProcessingInstruction');
- end;
- function TDOMDocument.CreateAttribute(const name: DOMString): TDOMAttr;
- begin
- Result := TDOMAttr.Create(Self);
- Result.FNodeName := name;
- end;
- function TDOMDocument.CreateEntityReference(const name: DOMString):
- TDOMEntityReference;
- begin
- raise EDOMNotSupported.Create('DOMDocument.CreateEntityReference');
- end;
- function TDOMDocument.CreateEntity(const data: DOMString): TDOMEntity;
- begin
- Result := TDOMEntity.Create(Self);
- Result.FNodeValue := data;
- end;
- function TDOMDocument.GetElementsByTagName(const tagname: DOMString): TDOMNodeList;
- begin
- Result := TDOMNodeList.Create(Self, tagname);
- end;
- function TXMLDocument.CreateCDATASection(const data: DOMString):
- TDOMCDATASection;
- begin
- Result := TDOMCDATASection.Create(Self);
- Result.FNodeValue := data;
- end;
- function TXMLDocument.CreateProcessingInstruction(const target,
- data: DOMString): TDOMProcessingInstruction;
- begin
- Result := TDOMProcessingInstruction.Create(Self);
- Result.FNodeName := target;
- Result.FNodeValue := data;
- end;
- function TXMLDocument.CreateEntityReference(const name: DOMString):
- TDOMEntityReference;
- begin
- Result := TDOMEntityReference.Create(Self);
- Result.FNodeName := name;
- end;
- // -------------------------------------------------------
- // Attr
- // -------------------------------------------------------
- constructor TDOMAttr.Create(AOwner: TDOMDocument);
- begin
- FNodeType := ATTRIBUTE_NODE;
- inherited Create(AOwner);
- end;
- function TDOMAttr.FGetNodeValue: DOMString;
- var
- child: TDOMNode;
- begin
- if FFirstChild = nil then
- Result := ''
- else begin
- Result := '';
- child := FFirstChild;
- while child <> nil do begin
- if child.NodeType = ENTITY_REFERENCE_NODE then
- Result := Result + '&' + child.NodeName + ';'
- else
- Result := Result + child.NodeValue;
- child := child.NextSibling;
- end;
- end;
- end;
- procedure TDOMAttr.FSetNodeValue(AValue: DOMString);
- var
- tn: TDOMText;
- begin
- FSpecified := True;
- tn := TDOMText.Create(FOwnerDocument);
- tn.FNodeValue := AValue;
- if FFirstChild <> nil then
- ReplaceChild(tn, FFirstChild)
- else
- AppendChild(tn);
- end;
- // -------------------------------------------------------
- // Element
- // -------------------------------------------------------
- constructor TDOMElement.Create(AOwner: TDOMDocument);
- begin
- FNodeType := ELEMENT_NODE;
- inherited Create(AOwner);
- FAttributes := TDOMNamedNodeMap.Create(AOwner);
- end;
- function TDOMElement.FGetAttributes: TDOMNamedNodeMap;
- begin
- Result := FAttributes;
- end;
- function TDOMElement.GetAttribute(const name: DOMString): DOMString;
- var
- i: Integer;
- begin
- for i := 0 to FAttributes.Count - 1 do
- if FAttributes.Item[i].NodeName = name then begin
- Result := FAttributes.Item[i].NodeValue;
- exit;
- end;
- Result := '';
- end;
- procedure TDOMElement.SetAttribute(const name, value: DOMString);
- var
- i: Integer;
- attr: TDOMAttr;
- begin
- for i := 0 to FAttributes.Count - 1 do
- if FAttributes.Item[i].NodeName = name then begin
- FAttributes.Item[i].NodeValue := value;
- exit;
- end;
- attr := TDOMAttr.Create(FOwnerDocument);
- attr.FNodeName := name;
- attr.NodeValue := value;
- FAttributes.Add(attr);
- end;
- procedure TDOMElement.RemoveAttribute(const name: DOMString);
- var
- i: Integer;
- begin
- for i := 0 to FAttributes.Count - 1 do
- if FAttributes.Item[i].NodeName = name then begin
- FAttributes.Delete(i);
- FAttributes.Item[i].Free;
- exit;
- end;
- end;
- function TDOMElement.GetAttributeNode(const name: DOMString): TDOMAttr;
- var
- i: Integer;
- begin
- for i := 0 to FAttributes.Count - 1 do
- if FAttributes.Item[i].NodeName = name then
- exit(TDOMAttr(FAttributes.Item[i]));
- Result := nil;
- end;
- procedure TDOMElement.SetAttributeNode(NewAttr: TDOMAttr);
- var
- i: Integer;
- begin
- for i := 0 to FAttributes.Count - 1 do
- if FAttributes.Item[i].NodeName = NewAttr.NodeName then begin
- FAttributes.Item[i].Free;
- FAttributes.Item[i] := NewAttr;
- exit;
- end;
- end;
- function TDOMElement.RemoveAttributeNode(OldAttr: TDOMAttr): TDOMAttr;
- var
- i: Integer;
- node: TDOMNode;
- begin
- for i := 0 to FAttributes.Count - 1 do begin
- node := FAttributes.Item[i];
- if node = OldAttr then begin
- FAttributes.Delete(i);
- exit(TDOMAttr(node));
- end;
- end;
- end;
- function TDOMElement.GetElementsByTagName(const name: DOMString): TDOMNodeList;
- begin
- Result := TDOMNodeList.Create(Self, name);
- end;
- procedure TDOMElement.Normalize;
- begin
- end;
- // -------------------------------------------------------
- // Text
- // -------------------------------------------------------
- constructor TDOMText.Create(AOwner: TDOMDocument);
- begin
- FNodeType := TEXT_NODE;
- FNodeName := '#text';
- inherited Create(AOwner);
- end;
- function TDOMText.SplitText(offset: LongWord): TDOMText;
- var
- nt: TDOMText;
- begin
- if offset > Length then
- raise EDOMIndexSize.Create('Text.SplitText');
- nt := TDOMText.Create(FOwnerDocument);
- nt.FNodeValue := Copy(FNodeValue, offset + 1, Length);
- FNodeValue := Copy(FNodeValue, 1, offset);
- FParentNode.InsertBefore(nt, FNextSibling);
- end;
- // -------------------------------------------------------
- // Comment
- // -------------------------------------------------------
- constructor TDOMComment.Create(AOwner: TDOMDocument);
- begin
- FNodeType := COMMENT_NODE;
- FNodeName := '#comment';
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // CDATASection
- // -------------------------------------------------------
- constructor TDOMCDATASection.Create(AOwner: TDOMDocument);
- begin
- inherited Create(AOwner);
- FNodeType := CDATA_SECTION_NODE;
- FNodeName := '#cdata-section';
- end;
- // -------------------------------------------------------
- // DocumentType
- // -------------------------------------------------------
- constructor TDOMDocumentType.Create(AOwner: TDOMDocument);
- begin
- FNodeType := DOCUMENT_TYPE_NODE;
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // Notation
- // -------------------------------------------------------
- constructor TDOMNotation.Create(AOwner: TDOMDocument);
- begin
- FNodeType := NOTATION_NODE;
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // Entity
- // -------------------------------------------------------
- constructor TDOMEntity.Create(AOwner: TDOMDocument);
- begin
- FNodeType := ENTITY_NODE;
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // EntityReference
- // -------------------------------------------------------
- constructor TDOMEntityReference.Create(AOwner: TDOMDocument);
- begin
- FNodeType := ENTITY_REFERENCE_NODE;
- inherited Create(AOwner);
- end;
- // -------------------------------------------------------
- // ProcessingInstruction
- // -------------------------------------------------------
- constructor TDOMProcessingInstruction.Create(AOwner: TDOMDocument);
- begin
- FNodeType := PROCESSING_INSTRUCTION_NODE;
- inherited Create(AOwner);
- end;
- end.
- {
- $Log$
- Revision 1.6 1999-12-05 22:00:10 sg
- * Bug workaround for problem with "exit(<some string type>)"
- Revision 1.5 1999/07/12 12:19:49 michael
- + More fixes from Sebastian Guenther
- Revision 1.4 1999/07/11 20:20:11 michael
- + Fixes from Sebastian Guenther
- Revision 1.3 1999/07/10 21:48:26 michael
- + Made domelement constructor virtual, needs overriding in thtmlelement
- Revision 1.2 1999/07/09 21:05:49 michael
- + fixes from Guenther Sebastian
- Revision 1.1 1999/07/09 08:35:09 michael
- + Initial implementation by Sebastian Guenther
- }
|