/* 
  построение описания УДК в иерархическом формате
*/

main(X) :-
        F = readXML("ql"+X+".xml"),
        ch  := eXElem(F, "//item"),
        List=makeItemList(^ch),
        doubleVec := newVector([]),
        Vector = newVector([]),
        insert(List, Vector),
 write("-----------------"),
        XXX = printTree(enum(Vector), ""+X),
        writeXML("tree"+X+".xml", <UDC block=_""+X;>_XXX;</UDC>, "w");

makeItemList(DocEnum) :- exhausted(DocEnum), []
        ;
makeItemList(DocEnum) :- 
        Item = eValue(DocEnum),
        [Item|makeItemList(eNext(DocEnum))]
        ;

insert([CurItem|Rest], Vector) :- !,
        ID = sNorm(getXText(CurItem, "//identifier")),
        VectorToInsert = checkNodes(ID, enum(Vector), Vector), !,
        vAdd(VectorToInsert, [ID, CurItem, newVector([])]),
        write("."),
        insert(Rest, Vector)
        ;
insert([], Vector) :- !, Vector
        ;

refsToList(Enum) :- exhausted(Enum), !, [];
refsToList(Enum) :- 
    R = eValue(Enum), !, 
    [R | refsToList(eNext(Enum))];

checkNodes(_, VecEnum, Vec) :- exhausted(VecEnum), !, Vec
        ;
checkNodes(ID, VecEnum, _) :- 
        ItemNode = eValue(VecEnum),
        Ch = checkNode(ID, ItemNode), !,
        (
          Ch=0, !, ^doubleVec /* элемент уже имеется */
         ##
          SubVec = getSubVec(ItemNode),
          checkNodes(ID, enum(SubVec), SubVec)
        )
        ;
checkNodes(CurStr, VecEnum, Vec) :-
        checkNodes(CurStr, eNext(VecEnum), Vec)
        ;
        
checkNode(CurStr, [CurStr | _]) :- !, 0
        ;
checkNode(CurStr, [NodeStr | _]) :-
        startsWith(CurStr, NodeStr, 0), 1
        ;


getSubVec([_, _, SubVec]) :- SubVec;

printTree([ID, CurItem, Vec], Super) :- !, 
   Title = sNorm(getXText(CurItem, "//title")),
   Descr = sNorm(getXText(CurItem, "//description")),
   Refs = eXElem(CurItem, "//references"),
   Depr = getXElem(CurItem, "//isReplacedBy"),
   Status = getXAttr(CurItem, "status"),
   (
     Depr = null, !, Rep = " "
    ##
     Rep = Depr
   ),

   <item status = _Status;>
      <identifier>_ID;</identifier>
      <title>_Title;</title>
      <description>_Descr;</description>
      <isPartOf>_Super;</isPartOf>
      _printTree(enum(Vec), ID);
      _Rep;
      _refsToList(Refs);
   </item>
;
printTree(Enum, _) :- exhausted(Enum), !, [];
printTree(Enum, Super) :- 
        V = eValue(Enum), 
        [printTree(V, Super) | printTree(eNext(Enum), Super)]
        ;

t(N) :- trace("level", N);

