Kaynağa Gözat

Автодок: сортировка

Arthur Yefimov 2 yıl önce
ebeveyn
işleme
7bfda00658

+ 1 - 1
src/Autodoc/AutodocHtml.Mod

@@ -94,7 +94,7 @@ PROCEDURE OpenGroup(title: ARRAY OF CHAR);
 BEGIN
   WriteLn('<article class="group">');
   Write('<h3 class="group-title">');
-  IF title # '-' THEN Write(title) ELSE Write('* * *') END;
+  IF title # '-' THEN Write(title) END;
   WriteLn('</h3>');
   WriteLn('<div class="group-content">');
 END OpenGroup;

+ 57 - 2
src/Autodoc/AutodocParser.Mod

@@ -515,6 +515,17 @@ VAR G: Group;
 BEGIN NEW(G); Strings.Copy(curTitle, G.comment)
 RETURN G END NewGroup;
 
+(** Returns object with the minimum name from a non-empty list L *)
+PROCEDURE FindMinName(L: List): Object;
+VAR x, min: Object;
+BEGIN
+  min := L.first; x := min.next;
+  WHILE x # NIL DO
+    IF x.name < min.name THEN min := x END;
+    x := x.next
+  END
+RETURN min END FindMinName;
+
 PROCEDURE AddToList(L: List; o: Object);
 BEGIN
   IF L.first = NIL THEN L.first := o ELSE L.last.next := o END;
@@ -837,7 +848,7 @@ RETURN L END ParseVars;
 PROCEDURE ParseConstDecl(M: Module);
 VAR C: Const;
   line2: INTEGER;
-BEGIN M.consts := NewList(); curTitle[0] := 0X;
+BEGIN M.consts := NewList(); curTitle := '-';
   IF sym = const THEN GetSym;
     WHILE sym = ident DO
       UpdateCurGroup(M.consts);
@@ -1043,6 +1054,48 @@ BEGIN
     (sym = end) OR (sym = const) OR (sym = type) OR (sym = var)
 END ParseImport;
 
+PROCEDURE SortGroup(G: Group);
+VAR x: Object;
+  L: List;
+BEGIN
+  IF G.first # NIL THEN L := NewList();
+    WHILE G.first # NIL DO
+      x := FindMinName(G);
+      RemoveFromList(G, x);
+      AddToList(L, x)
+    END;
+    G.first := L.first; G.last := L.last
+  END
+END SortGroup;
+
+PROCEDURE SortGroups(L: List);
+VAR x: Object;
+  common: Group;
+BEGIN
+  IF L.first # NIL THEN
+    common := NIL; x := L.first;
+    WHILE x # NIL DO
+      SortGroup(x(Group));
+      IF x.comment = '-' THEN common := x(Group) END;
+      x := x.next
+    END;
+    IF (common # NIL) & (common # L.first) THEN
+      x := L.first; WHILE x.next # common DO x := x.next END;
+      x.next := common.next;
+      common.next := L.first;
+      L.first := common
+    END
+  END
+END SortGroups;
+
+PROCEDURE SortModule(M: Module);
+BEGIN
+  SortGroups(M.consts);
+  SortGroups(M.vars);
+  SortGroups(M.types);
+  SortGroups(M.procedures)
+END SortModule;
+
 PROCEDURE ParseModule*(VAR r: Files.Rider; VAR err: ARRAY OF CHAR): Module;
 VAR M: Module;
 BEGIN NEW(M); InitObject(M); M.foreign := FALSE;
@@ -1071,7 +1124,9 @@ BEGIN NEW(M); InitObject(M); M.foreign := FALSE;
     END
   ELSE MarkExp('MODULE')
   END;
-  IF lastError # -1 THEN M := NIL; err := 'Error' (*!FIXME*) END
+  IF lastError = -1 THEN SortModule(M)
+  ELSE M := NIL; err := 'Error' (*!FIXME*)
+  END
 RETURN M END ParseModule;
 
 BEGIN curFname[0] := 0X;

+ 7 - 5
src/Autodoc/Test/Apples.Mod

@@ -25,20 +25,22 @@ MODULE Apples;
 IMPORT Out, Fruits;
 
 CONST
+  str4* = "В двойных кавычках.";
+  str5* = "Кавычки 'в' кавычках.";
   str1* = '';
+  appleJuice* = 'сок';
   str2* = 'H';
   str3* = 'Привет   Как  дела?';
-  str4* = "В двойных кавычках.";
-  str5* = "Кавычки 'в' кавычках.";
   str6* = 'Кавычки "в двойных" кавычках.';
 
   (** Общие постоянные **)
 
-  maxApples*  =  5; (** Maximum amount of apples*)
-  maxSeeds*   = 10; (** Currently not in use *)
   (** Start amount of apples. Used in Reset *)
   startApples =  0;
 
+  maxApples*  =  5; (** Maximum amount of apples*)
+  maxSeeds*   = 10; (** Currently not in use *)
+
   (** Качество яблока **)
   unknown* = 0; (** Неизвестное качество *)
   good*    = 1; (** Сносное качество *)
@@ -75,7 +77,7 @@ TYPE
   P2* = PROCEDURE(); (** Процедура с пустыми скобками *)
   P3* = PROCEDURE(): BOOLEAN; (** Булева процедура без параметров *)
   P4* = PROCEDURE(a, b: INTEGER): BOOLEAN; (** Булева процедура *)
-  P4* = PROCEDURE(x: INTEGER; y: CHAR; z: CHAR); (** Процедура с параметрами *)
+  P5* = PROCEDURE(x: INTEGER; y: CHAR; z: CHAR); (** Процедура с параметрами *)
 
 VAR
   applesCreated*: INTEGER; (** How many apples were created using Init *)