{**************************************************************************************************} { } { Project JEDI Code Library (JCL) } { } { The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); } { you may not use this file except in compliance with the License. You may obtain a copy of the } { License at http://www.mozilla.org/MPL/ } { } { Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF } { ANY KIND, either express or implied. See the License for the specific language governing rights } { and limitations under the License. } { } { The Original Code is IdentifierList.dpr. } { } { The Initial Developer of the Original Code is Florent Ouchet } { Portions created by Florent Ouchet are Copyright (C) of Florent Ouchet. } { } { Contributors: } { } {**************************************************************************************************} { } { Last modified: $Date: 2006-11-03 18:55:09 +0100 (ven., 03 nov. 2006) $ } { } {**************************************************************************************************} // note: this program converts the xml output of Doc-o-matic // running on the JCL help files http://jcl.svn.sourceforge.net/viewvc/jcl/trunk/help/ // to text files for the JCL uses expert // this program requires TJvSimpleXml from the JVCL program IdentifierList; {$APPTYPE CONSOLE} uses SysUtils, Classes, JvSimpleXml; var UnitList: TStringList; procedure InitIdentifierList; begin UnitList := TStringList.Create; UnitList.CaseSensitive := False; end; procedure FinalizeIdentifierList; var Index: Integer; IdentifierList: TStringList; begin for Index := 0 to UnitList.Count - 1 do begin IdentifierList := TStringList(UnitList.Objects[Index]); IdentifierList.SaveToFile(Format('%s.txt', [UnitList.Strings[Index]])); IdentifierList.Free; end; UnitList.Free; end; procedure AddIdentifier(const IdentifierName, UnitName: string); var IdentifierList: TStringList; UnitIndex: Integer; Identifier: string; begin if Pos('.', IdentifierName) > 0 then Exit; if Pos('@', IdentifierName) > 0 then Identifier := Copy(IdentifierName, 1, Pos('@', IdentifierName) - 1) else Identifier := IdentifierName; UnitIndex := UnitList.IndexOf(UnitName); if UnitIndex = -1 then begin IdentifierList := TStringList.Create; IdentifierList.CaseSensitive := False; UnitList.AddObject(UnitName, IdentifierList); end else IdentifierList := TStringList(UnitList.Objects[UnitIndex]); IdentifierList.Add(Identifier); end; procedure ProcessXML(const FileName: string); var SimpleXML: TJvSimpleXML; procedure ProcessNode(const Node: TJvSimpleXMLElem); var IndexSection, IndexChild: Integer; SectionNode, ChildNode, LinkNode: TJvSimpleXMLElem; NameProp, IdProp: TJvSimpleXMLProp; begin if SameText(Node.Name, 'topic') then begin for IndexSection := 0 to Node.Items.Count - 1 do begin SectionNode := Node.Items.Item[IndexSection]; NameProp := SectionNode.Properties.ItemNamed['name']; LinkNode := SectionNode.Items.ItemNamed['link']; if Assigned(NameProp) and SameText(SectionNode.Name, 'section') and SameText(NameProp.Value, 'Unit') then begin IdProp := Node.Properties.ItemNamed['id']; if Assigned(IdProp) then begin if Assigned(LinkNode) then AddIdentifier(IdProp.Value, LinkNode.Value) else AddIdentifier(IdProp.Value, SectionNode.Value); end; end; end; end; for IndexChild := 0 to Node.Items.Count - 1 do begin ChildNode := Node.Items.Item[IndexChild]; ProcessNode(ChildNode); end; end; begin SimpleXML := TJvSimpleXML.Create(nil); try Write('Loading XML...'); SimpleXML.LoadFromFile(FileName); WriteLn('done.'); SimpleXML.Options := SimpleXML.Options - [sxoAutoCreate]; Write('Processing XML...'); ProcessNode(SimpleXML.Root); WriteLn('done.'); finally SimpleXML.Free; end; end; begin Write('initializing lists...'); InitIdentifierList; WriteLn('done.'); try ProcessXML(place here the name of the xml generated by Doc-o-matic); finally Write('Saving lists...'); FinalizeIdentifierList; WriteLn('done.'); end; end.