GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
########################################################################### ## #W omput.gi OpenMath Package Andrew Solomon #W Marco Costantini #W Alexander Konovalov ## ## #Y Copyright (C) 1999, 2000, 2001, 2006 #Y School Math and Comp. Sci., University of St. Andrews, Scotland #Y Copyright (C) 2004, 2005, 2006 Marco Costantini ## ## Low-level methods for output in the OpenMath XML format ## ########################################################################### ## #F OMWriteLine( <stream>, <list> ) ## ## Input : List of arguments to print ## Output: \t ^ OMIndent, arguments ## InstallGlobalFunction(OMWriteLine, function(stream, alist) local i; # do the indentation AppendTo( stream, ListWithIdenticalEntries( OMIndent, '\t' ) ); for i in alist do AppendTo(stream, i); od; AppendTo(stream, "\n"); end); ########################################################################### ## ## Basic OpenMath objects and tags ## ########################################################################### ########################################################################### ## #F OMPutVar( <stream>, <name> ) ## ## Input : name as string ## Output: <OMV name="<name>" /> ## InstallMethod( OMPutVar, "to write OMV in XML OpenMath", true, [ IsOpenMathXMLWriter, IsObject ],0, function( writer, name ) OMWriteLine( writer![1], ["<OMV name=\"", String(name), "\"/>"] ); end); ########################################################################### ## #F OMPutSymbol( <stream>, <cd>, <name> ) ## ## Input : cd, name as strings ## Output: <OMS cd="<cd>" name="<name>" /> ## InstallMethod( OMPutSymbol, "to write OMS in XML OpenMath", true, [ IsOpenMathXMLWriter, IsString, IsString ],0, function( writer, cd, name ) OMWriteLine( writer![1], ["<OMS cd=\"", cd, "\" name=\"", name, "\"/>"] ); end); ########################################################################### ## #M OMPutOMAWithId( <OMWriter>, <reference> ) ## ## ## InstallMethod( OMPutOMAWithId, "to put Applications with Ids", true, [IsOpenMathXMLWriter, IsString],0, function(writer, reference) OMWriteLine( writer![1], [ "<OMA id=\"", reference, "\" >" ] ); end); ########################################################################### ## #M OMPutOMA #M OMPutEndOMA ## InstallMethod(OMPutOMA, "to write OMA in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OMA>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOMA, "to write /OMA in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMA>" ] ); end); ########################################################################### ## #M OMPutOMATTR #M OMPutEndOMATTR ## InstallMethod(OMPutOMATTR, "to write OMATTR in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OMATTR>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOMATTR, "to write /OMATTR in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMATTR>" ] ); end); InstallMethod(OMPutOMATP, "to write OMATP in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OMATP>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOMATP, "to write /OMATP in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMATP>" ] ); end); ########################################################################### ## #M OMPutOMBIND #M OMPutEndOMBIND ## InstallMethod(OMPutOMBIND, "to write OMBIND in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OMBIND>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOMBIND, "to write /OMBIND in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMBIND>" ] ); end); ########################################################################### ## #M OMPutOMBVAR #M OMPutEndOMBVAR ## InstallMethod(OMPutOMBVAR, "to write OMBVAR in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OMBVAR>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOMBVAR, "to write /OMBVAR in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMBVAR>" ] ); end); ########################################################################### ## #M OMPutOME #M OMPutEndOME ## InstallMethod(OMPutOME, "to write OME in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMWriteLine( writer![1], [ "<OME>" ] ); OMIndent := OMIndent + 1; end); InstallMethod(OMPutEndOME, "to write /OME in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OME>" ] ); end); ########################################################################### ## #M OMPutOMOBJ #M OMPutEndOMOBJ ## BindGlobal( "OMOBJ_TAG", "<OMOBJ xmlns=\"http://www.openmath.org/OpenMath\" version=\"2.0\">" ); InstallMethod(OMPutOMOBJ, "to write OMOBJ in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := 0; OMWriteLine( writer![1], [ OMOBJ_TAG ] ); OMIndent := 1; end); InstallMethod(OMPutEndOMOBJ, "to write /OMOBJ in XML OpenMath", true, [IsOpenMathXMLWriter],0, function( writer ) OMIndent := OMIndent - 1; OMWriteLine( writer![1], [ "</OMOBJ>" ] ); end); ########################################################################### ## ## Various methods for OMPut ## BindGlobal( "OMINT_LIMIT", 2^15936 ); ########################################################################### ## #M OMPut( <OMWriter>, <int> ) ## ## Printing for integers: specified in the standard ## InstallMethod(OMPut, "for an integer to XML OpenMath", true, [IsOpenMathXMLWriter, IsInt],0, function(writer, x) if x >= OMINT_LIMIT then OMWriteLine( writer![1], ["<OMI>", String(x), "</OMI>"] ); else OMWriteLine( writer![1], ["<OMI>", x, "</OMI>"] ); fi; end); ########################################################################### ## #M OMPut( <OMWriter>, <string> ) ## ## specified in the standard ## InstallMethod(OMPut, "for a string to XML OpenMath", true, [IsOpenMathXMLWriter, IsString],0, function(writer, x) if IsEmpty(x) and not IsEmptyString(x) then TryNextMethod(); fi; # convert XML escaped chars x := ReplacedString( x, "&", "&" ); x := ReplacedString( x, "<", "<" ); OMWriteLine(writer![1], ["<OMSTR>",x,"</OMSTR>"]); end); ########################################################################### ## #M OMPut( <stream>, <float> ) ## ## Printing for floats: specified in the standard ## InstallMethod(OMPut, "for a float", true, [IsOpenMathXMLWriter, IsFloat],0, function(writer, x) local string; # treatment of x=0 separately was added when discovered # that Float("-0") returns -0, but it is also faster. if IsZero(x) then OMWriteLine( writer![1], [ "<OMF dec=\"0\"/>" ] ); else string := String( x ); # the OpenMath standard requires floats encoded in this way, see # section 3.1.2 string := ReplacedString( string, "e+", "e" ); string := ReplacedString( string, "inf", "INF" ); string := ReplacedString( string, "nan", "NaN" ); OMWriteLine( writer![1], [ "<OMF dec=\"", string, "\"/>" ] ); fi; end); ########################################################################### # # Functions and methods for OMPlainString # InstallGlobalFunction( OMPlainString, function( string ) if IsString( string ) then # note that we do not validate the string! return Objectify( OMPlainStringDefaultType, [ string ] ); else Error( "The argument of OMPlainString must be a string" ); fi; end); ########################################################################### ## #M PrintObj( <IsOMPlainString> ) ## InstallMethod( PrintObj, "for IsOMPlainString", [ IsOMPlainStringRep and IsOMPlainString ], function( obj ) Print( obj![1] ); end); ########################################################################### ## #M OMPut( <IsOMPlainString> ) ## InstallMethod( OMPut, "for IsOMPlainString", true, [ IsOpenMathXMLWriter, IsOMPlainString ], 0, function( writer, s ) OMWriteLine( writer![1], [ s ] ); end); ########################################################################### # # OMPutReference( OMWriter, x ); # # This method prints OpenMath references and can be used for printing complex # objects, for example, ideals of polynomial rings (the ideal will carry the # ring R, and each polynomial generating the ideal will also refer to the # ring R). The method uses OMR, if the object x already has the attribute # OMReference, and prints the object x otherwise. # # The concept of references implies that the author of the code is able to # decide which objects needs references, and assign references to them, e.g. # using # SetOMReference( r, Concatenation("polyring", RandomString(16))); # # Once an object obtained a reference, it can not be changed, therefore, the # same reference will be used in communication with all other CASs. # # However, the reference will be not printed automatically for an object # having it - otherwise, you will not be able to send the same object to # multiple CASs. Instead of this, the reference will be printed only when # this will be enforced by the usage of OMPutReference. # # If the SuppressOpenMathReferences is set to true, then # OMPutReference (lib/openmath.gi) will put the actual # OpenMath code for an object whenever it has id or not. # InstallMethod( OMPutReference, "for a stream and an object with reference", true, [ IsOpenMathWriter, IsObject ], 0, function( writer, x ) if HasOMReference( x ) and not SuppressOpenMathReferences then OMWriteLine( writer![1], [ "<OMR href=\"\043", OMReference( x ), "\" />" ] ); else OMPut( writer, x ); fi; end); ########################################################################### #E