From: Sebastien B. <sb...@us...> - 2003-03-23 16:20:53
|
Update of /cvsroot/jvcl/jvcl/source In directory sc8-pr-cvs1:/tmp/cvs-serv8949 Modified Files: JvSimpleXml.pas Log Message: Added sort method Index: JvSimpleXml.pas =================================================================== RCS file: /cvsroot/jvcl/jvcl/source/JvSimpleXml.pas,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** JvSimpleXml.pas 17 Mar 2003 14:50:55 -0000 1.28 --- JvSimpleXml.pas 23 Mar 2003 16:20:47 -0000 1.29 *************** *** 32,40 **** uses ! {$IFDEF COMPILER6_UP} ! Variants, ! {$ENDIF} ! SysUtils, Classes, IniFiles, ! JvComponent; type --- 32,36 ---- uses ! SysUtils, Classes, IniFiles, JvComponent{$IFDEF COMPILER6_UP}, Variants{$ENDIF}; type *************** *** 151,161 **** end; TJvSimpleXmlElems = class(TObject) private - FElems: THashedStringList; FParent: TJvSimpleXmlElem; function GetCount: Integer; function GetItemNamed(const Name: string): TJvSimpleXmlElem; protected function GetItem(const Index: Integer): TJvSimpleXmlElem; procedure AddChild(const Value: TJvSimpleXmlElem); --- 147,159 ---- end; + TJvSimpleXmlElemCompare = function(Elems: TJvSimpleXmlElems; Index1, Index2: Integer): Integer of object; TJvSimpleXmlElems = class(TObject) private FParent: TJvSimpleXmlElem; function GetCount: Integer; function GetItemNamed(const Name: string): TJvSimpleXmlElem; protected + FElems: THashedStringList; + FCompare: TJvSimpleXmlElemCompare; function GetItem(const Index: Integer): TJvSimpleXmlElem; procedure AddChild(const Value: TJvSimpleXmlElem); *************** *** 186,189 **** --- 184,189 ---- function LoadFromStream(const Stream: TStream; AParent: TJvSimpleXml = nil): string; procedure SaveToStream(const Stream: TStream; const Level: string = ''; Parent: TJvSimpleXml = nil); + procedure Sort; + procedure CustomSort(AFunction: TJvSimpleXmlElemCompare); property Parent: TJvSimpleXmlElem read FParent write FParent; property Item[const Index: Integer]: TJvSimpleXmlElem read GetItem; default; *************** *** 481,707 **** function SimpleXmlEncode(const Value: string): string; var ! I: Integer; lDiff: Boolean; begin //http://www.cs.tut.fi/~jkorpela/latin1/3.html#60 ! Result := Value; ! lDiff := False; ! for I := 1 to Length(Value) do ! if Value[I] in ['<', '>', '&', '"', ''''] then begin if not lDiff then begin ! lDiff := True; ! Result := Copy(Value, 1, I - 1); ! end; ! case Value[i] of ! '<': Result := Result + '<'; ! '>': Result := Result + '>'; ! '&': Result := Result + '&'; ! '"': Result := Result + '"'; ! '''': Result := Result + ''''; ! else ! Result := Result + '&#' + IntToStr(Ord(Value[I])) + ';'; end; end else if lDiff then ! Result := Result + Value[I]; end; procedure SimpleXmlDecode(var Value: string; TrimMultiple: Boolean = True); var ! I, J, K, L: Integer; ! St: string; begin ! St := ''; ! J := -1; ! K := 1; ! for I := 1 to Length(Value) do ! case Value[I] of ! ' ', #10, #13: ! if (not TrimMultiple) or ((K = 1) or not (Value[K - 1] in [' ', #10, #13])) then begin ! if J > 0 then ! St := St + Value[I] else begin ! Value[K] := Value[I]; ! Inc(K); end; end; '&': begin ! if J <> -1 then begin ! Value[K] := '&'; ! Inc(K); ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; end; ! J := 0; ! St := ''; end; '#': ! if J = 0 then ! J := 1 ! else ! if J <> -1 then begin ! Value[K] := '&'; ! Inc(K); ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; ! Value[K] := Value[I]; ! Inc(K); ! St := ''; end else begin ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; ! Value[K] := Value[I]; ! Inc(K); ! St := ''; end; '0'..'9': ! if J >= 1 then begin ! St := St + Value[I]; ! J := 2; end else begin ! Value[K] := Value[I]; ! Inc(K); end; 'a'..'z', 'A'..'Z': ! if J >= 0 then begin ! St := St + Value[I]; ! Inc(J); end else begin ! Value[K] := Value[I]; ! Inc(K); end; ';': ! if J <> 0 then begin ! J := StrToIntDef(St, -1); ! case J of -1: begin ! st := LowerCase(St); if st = 'lt' then begin ! Value[K] := '<'; ! Inc(K); ! end ! else ! if st = 'gt' then ! begin ! Value[K] := '>'; ! Inc(K); end ! else ! if st = 'amp' then begin ! Value[K] := '&'; ! Inc(K); end ! else ! if st = 'quot' then begin ! Value[K] := '"'; ! Inc(K); end else - if J >= 0 then begin ! Value[K] := '&'; ! Inc(K); ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; ! Value[K] := ';'; ! Inc(K); ! end ! else ! begin ! Value[K] := ';'; ! Inc(K); end end; 0..100: begin ! Value[K] := Char(J); ! Inc(K); end; 233: begin ! Value[K] := 'é'; ! Inc(K); end; 232: begin ! Value[K] := 'è'; ! Inc(K); end; end; ! St := ''; ! J := -1; end else begin ! Value[K] := Value[I]; ! Inc(K); end; ! else ! begin ! if J > 0 then begin ! Value[K] := '&'; ! Inc(K); ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; ! end ! else ! if J = 0 then ! begin ! Value[K] := '&'; ! Inc(K); end; - Value[K] := Value[I]; - Inc(K); - J := -1; - end; end; ! if J <> -1 then begin ! Value[K] := '&'; ! Inc(K); ! for L := 1 to Length(St) do begin ! Value[K] := St[L]; ! Inc(K); end; end; ! SetLength(Value, K - 1); end; --- 481,687 ---- function SimpleXmlEncode(const Value: string): string; var ! i: Integer; lDiff: Boolean; begin //http://www.cs.tut.fi/~jkorpela/latin1/3.html#60 ! result := Value; ! lDiff := false; ! for i := 1 to Length(Value) do ! if Value[i] in ['<','>','&','"',''''] then begin if not lDiff then begin ! lDiff := true; ! result := Copy(Value,1,i-1); end; + result := result + '&#' + IntToStr(Ord(Value[i])) + ';'; end else if lDiff then ! result := result + Value[i]; end; procedure SimpleXmlDecode(var Value: string; TrimMultiple: Boolean = True); var ! i, j, k, l: Integer; ! st: string; begin ! st := ''; ! j := -1; ! k := 1; ! for i := 1 to Length(Value) do ! case Value[i] of ! ' ',#10,#13: ! if (not TrimMultiple) or ((k=1) or not (Value[k-1] in [' ',#10,#13])) then begin ! if j>0 then ! st := st + Value[i] else begin ! Value[k] := Value[i]; ! inc(k); end; end; '&': begin ! if j <> -1 then begin ! Value[k] := '&'; ! inc(k); ! for l:=1 to Length(st) do begin ! Value[k] := st[l]; ! inc(k); end; end; ! j := 0; ! st := ''; end; '#': ! if j = 0 then ! j := 1 ! else if (j <> -1) then begin ! Value[k] := '&'; ! inc(k); ! for l:=1 to Length(st) do begin ! Value[k] := st[l]; ! inc(k); end; ! Value[k] := Value[i]; ! inc(k); ! st := ''; end else begin ! for l:=1 to Length(st) do begin ! Value[k] := st[l]; ! inc(k); end; ! Value[k] := Value[i]; ! inc(k); ! st := ''; end; '0'..'9': ! if j >= 1 then begin ! st := st + Value[i]; ! j := 2; end else begin ! Value[k] := Value[i]; ! inc(k); end; 'a'..'z', 'A'..'Z': ! if j >= 0 then begin ! st := st + Value[i]; ! inc(j); end else begin ! Value[k] := Value[i]; ! inc(k); end; ';': ! if j <> 0 then begin ! j := StrToIntDef(st, -1); ! case j of -1: begin ! st := LowerCase(st); if st = 'lt' then begin ! Value[k] := '<'; ! inc(k); end ! else if st = 'gt' then begin ! Value[k] := '>'; ! inc(k); end ! else if st = 'amp' then begin ! Value[k] := '&'; ! inc(k); end else begin ! if st <> '' then begin ! Value[k] := '&'; ! inc(k); ! for l:=1 to Length(st) do ! begin ! Value[k] := st[l]; ! inc(k); ! end; ! st := ''; end; ! Value[k] := ';'; ! inc(k); end end; 0..100: begin ! Value[k] := Char(j); ! inc(k); end; 233: begin ! Value[k] := 'é'; ! inc(k); end; 232: begin ! Value[k] := 'è'; ! inc(k); end; end; ! st := ''; ! j := -1; end else begin ! Value[k] := Value[i]; ! inc(k); end; ! else begin ! if j > 0 then begin ! Value[k] := '&'; ! inc(k); ! for l:=1 to Length(st) do ! begin ! Value[k] := st[l]; ! inc(k); ! end; ! end ! else if j = 0 then ! begin ! Value[k] := '&'; ! inc(k); end; ! Value[k] := Value[i]; ! inc(k); ! j := -1; end; end; ! if j <> -1 then begin ! Value[k] := '&'; ! inc(k); ! for l:=1 to Length(st) do begin ! Value[k] := st[l]; ! inc(k); end; end; ! SetLength(Value,k-1); end; *************** *** 1381,1384 **** --- 1361,1396 ---- end; + function SortItems(List: TStringList; Index1, Index2: Integer): Integer; + var + i: Integer; + begin + result := 0; + for i:=0 to GSorts.Count-1 do + if TJvSimpleXmlElems(GSorts[i]).FElems = List then + begin + result := TJvSimpleXmlElems(GSorts[i]).FCompare(TJvSimpleXmlElems(GSorts[i]), Index1, Index2); + Exit; + end; + end; + + procedure TJvSimpleXmlElems.CustomSort( + AFunction: TJvSimpleXmlElemCompare); + begin + if FElems<>nil then + begin + GSorts.Add(self); + FCompare := AFunction; + FElems.CustomSort(SortItems); + GSorts.Remove(self); + end; + end; + + procedure TJvSimpleXmlElems.Sort; + begin + if FElems<>nil then + FElems.Sort; + end; + + //=== TJvSimpleXmlProps ====================================================== *************** *** 2671,2682 **** end; end; initialization XmlVariant := TXmlVariant.Create; ! finalization FreeAndNil(XmlVariant); {$ENDIF} ! end. --- 2683,2698 ---- end; end; + {$ENDIF} initialization + {$IFDEF COMPILER6_UP} XmlVariant := TXmlVariant.Create; ! {$ENDIF} ! GSorts := TList.Create; finalization + {$IFDEF COMPILER6_UP} FreeAndNil(XmlVariant); {$ENDIF} ! FreeAndNil(GSorts); end. |