GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
##############################################################################
##
## Assume that the old version (which may be hand edited) of the bibliography
## is stored in `gap-publishednicer.bib',
## and that the new version (from St Andrews)
## is stored in `gap-publishednicer.bib.new'.
##
## The old version is renamed to `gap-publishednicer.bib~',
## and a corrected version of the new version (using the entries in the old
## version) is written to `gap-publishednicer.bib'.
##
CorrectGAPBibliography:= function()
local dirs, fileold, filenew, parseold, parsenew, valid, entry, oldentry,
stringnew, pos, sc;
dirs:= DirectoriesPackageLibrary( "Browse", "bibl" );
fileold:= Filename( dirs, "gap-publishednicer.bib" );
filenew:= Filename( dirs, "gap-publishednicer.bib.new" );
parseold:= ParseBibFiles( fileold );
parsenew:= ParseBibFiles( filenew );
valid:= [];
for entry in parsenew[1] do
if StringBibAsXMLext( entry, parsenew[2], parsenew[3] ) = fail then
#T is there another function just for this purpose?
# Check if the old file contains a valid entry with the same key,
# and if yes then take this one.
oldentry:= First( parseold[1], r -> r.Label = entry.Label );
if oldentry <> fail and
StringBibAsXMLext( oldentry, parseold[2], parseold[3] ) <> fail then
Print( "#I replacing invalid entry '", entry.Label, "'\n" );
Add( valid, oldentry );
else
Print( "#E omitting invalid entry '", entry.Label, "'\n" );
fi;
else
# Take this entry, no matter whether the old file contains it.
Add( valid, entry );
fi;
od;
SortParallel(List(valid, x-> x.Label), valid);
Exec( Concatenation( "mv ", fileold, " ", fileold, "~" ) );
WriteBibFile( fileold, [ valid, parsenew[2], parsenew[3] ] );
stringnew:= StringFile( filenew );;
pos:= PositionSublist( stringnew, "\n%%%%%" );
if pos <> fail then
sc:= SizeScreen();
SizeScreen( [ 200 ] );
AppendTo( fileold, stringnew{ [ pos+1 .. Length( stringnew ) ] } );
SizeScreen( sc );
fi;
end;