From 1dc3cb34c58d0fe9cc30b54f8ea46e532e293948 Mon Sep 17 00:00:00 2001 From: Glen Whitney Date: Tue, 21 May 2019 13:51:30 +0200 Subject: [PATCH] Handle documentation of DeclareCategoryCollection declarations. Note that AutoDoc here duplicates logic in gap/lib/coll.gd to determine the actual name of the symbol being defined by the call (since that symbol is computed on the fly by the declaration and does not appear verbatim anywhere in the call). This is unfortunate, but I could not see any way to call the relevant code in the standard library, as the name computation of the collections category is not split out into a separately executable function. Also, modify worksheet.g to include an example of DeclareCategoryCollection to make sure the new capacity is tested. --- gap/Parser.gi | 33 ++++++++++++- .../general.expected/_Chapter_SomeChapter.xml | 48 +++++++++++++++++++ tst/worksheets/general.sheet/worksheet.g | 10 ++++ 3 files changed, 89 insertions(+), 2 deletions(-) diff --git a/gap/Parser.gi b/gap/Parser.gi index 4178c1ea..04f4fb28 100644 --- a/gap/Parser.gi +++ b/gap/Parser.gi @@ -63,7 +63,15 @@ InstallGlobalFunction( AutoDoc_Type_Of_Item, function( current_item, type, default_chapter_data ) local item_rec, entries, has_filters, ret_val; item_rec := current_item; - if PositionSublist( type, "DeclareCategory" ) <> fail then + if PositionSublist( type, "DeclareCategoryCollections") <> fail then + entries := [ "Filt", "categories" ]; + ret_val := "true or false"; + has_filters := "No"; + if not IsBound( item_rec!.arguments ) then + item_rec!.arguments := "obj"; + fi; + item_rec!.coll_suffix := true; + elif PositionSublist( type, "DeclareCategory" ) <> fail then entries := [ "Filt", "categories" ]; ret_val := "true or false"; has_filters := 1; @@ -229,7 +237,7 @@ InstallGlobalFunction( AutoDoc_Parser_ReadFiles, return false; fi; current_line := current_line{ [ position_parentesis + 1 .. Length( current_line ) ] }; - ## Not the funny part begins: + ## Now the funny part begins: ## try fetching the name: ## Assuming the name is in the same line as its while PositionSublist( current_line, "," ) = fail and PositionSublist( current_line, ");" ) = fail do @@ -238,6 +246,27 @@ InstallGlobalFunction( AutoDoc_Parser_ReadFiles, current_line := StripBeginEnd( current_line, " " ); current_item!.name := current_line{ [ 1 .. Minimum( [ PositionSublist( current_line, "," ), PositionSublist( current_line, ");" ) ] ) - 1 ] }; current_item!.name := StripBeginEnd( ReplacedString( current_item!.name, "\"", "" ), " " ); + + # Deal with DeclareCategoryCollections: this has some special + # rules on how the name of a new category is derived from the + # string given to it. Since the code for that is not available in + # a separate GAP function, we have to replicate this logic here. + # To understand what's going on, please refer to the + # DeclareCategoryCollections documentation and implementation. + if IsBound(current_item!.coll_suffix) then + if EndsWith(current_item!.name, "Collection") then + current_item!.name := + current_item!.name{[1..Length(current_item!.name)-6]}; + fi; + if EndsWith(current_item!.name, "Coll") then + current_item!.coll_suffix := "Coll"; + else + current_item!.coll_suffix := "Collection"; + fi; + current_item!.name := Concatenation(current_item!.name, + current_item!.coll_suffix); + fi; + current_line := current_line{ [ Minimum( [ PositionSublist( current_line, "," ), PositionSublist( current_line, ");" ) ] ) + 1 .. Length( current_line ) ] }; filter_string := "for "; ## FIXME: The next two if's can be merged at some point diff --git a/tst/worksheets/general.expected/_Chapter_SomeChapter.xml b/tst/worksheets/general.expected/_Chapter_SomeChapter.xml index ef98e510..7e73a2d2 100644 --- a/tst/worksheets/general.expected/_Chapter_SomeChapter.xml +++ b/tst/worksheets/general.expected/_Chapter_SomeChapter.xml @@ -14,6 +14,54 @@ gap> Size(S5); And we wrap up with some dummy text +
+Some categories + +Intro text + + + true or false + + +

+ + + + + + + true or false + + +

+ + + + + + + true or false + + +

+ + + + + + + true or false + + +

+ + + + +Let's wrap up with something, though. +

+ +
SomeSection diff --git a/tst/worksheets/general.sheet/worksheet.g b/tst/worksheets/general.sheet/worksheet.g index 9ca142a3..6f0e3b3e 100644 --- a/tst/worksheets/general.sheet/worksheet.g +++ b/tst/worksheets/general.sheet/worksheet.g @@ -22,6 +22,16 @@ Print( "(Even though we never use it that way.\n" ); #! @EndExampleSession #! And we wrap up with some dummy text +#! @Section Some categories +#! Intro text +DeclareCategory("MyThings", IsObject); +DeclareCategoryCollections("MyThings"); +DeclareCategoryCollections("MyThingsColl"); +DeclareCategoryCollections("MyThingsCollection"); +Now here is some text with a bunch of &!$%*!/ weird things in it. But that +should be OK, nothing should end up in a weird place. +#! Let's wrap up with something, though. + #! @Section SomeSection #! Some test just inside a section. We can use test some markdown features here: