Diff for /loncom/interface/loncommon.pm between versions 1.111 and 1.112

version 1.111, 2003/08/13 20:40:31 version 1.112, 2003/08/20 18:18:45
Line 47  Apache::loncommon - pile of common routi Line 47  Apache::loncommon - pile of common routi
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Referenced by other mod_perl Apache modules.  Common routines for manipulating connections, student answers,
       domains, common Javascript fragments, etc.
   
 Invocation:  =head1 OVERVIEW
  &Apache::loncommon::SUBROUTINENAME(ARGUMENTS);  
   
 =head1 INTRODUCTION  A collection of commonly used subroutines that don't have a natural
   home anywhere else. This collection helps remove
 Common collection of used subroutines.  This collection helps remove  
 redundancy from other modules and increase efficiency of memory usage.  redundancy from other modules and increase efficiency of memory usage.
   
 Current things done:  
   
  Makes a table out of the previous homework attempts  
  Inputs result_from_symbread, user, domain, course_id  
  Reads in non-network-related .tab files  
   
 This is part of the LearningOnline Network with CAPA project  
 described at http://www.lon-capa.org.  
   
 =head2 General Subroutines  
   
 =over 4  
   
 =cut   =cut 
   
 # End of POD header  # End of POD header
Line 86  my $readit; Line 72  my $readit;
   
 =pod   =pod 
   
 =item Global Variables  =head1 Global Variables
   
 =over 4  
   
 =cut  =cut
   
 # ----------------------------------------------- Filetypes/Languages/Copyright  # ----------------------------------------------- Filetypes/Languages/Copyright
 my %language;  my %language;
 my %cprtag;  my %cprtag;
Line 103  my %designhash; Line 88  my %designhash;
   
 # ---------------------------------------------- Thesaurus variables  # ---------------------------------------------- Thesaurus variables
   
   # FIXME: I don't think it's necessary to document these things;
   # they're privately used - Jeremy
   
 =pod  =pod
   
 =item %Keywords    =over 4
   
   =item * %Keywords  
   
 A hash used by &keyword to determine if a word is considered a keyword.  A hash used by &keyword to determine if a word is considered a keyword.
   
 =item $thesaurus_db_file  =item * $thesaurus_db_file
   
 Scalar containing the full path to the thesaurus database.                   Scalar containing the full path to the thesaurus database.                 
   
   =back
   
 =cut  =cut
   
 my %Keywords;  my %Keywords;
 my $thesaurus_db_file;  my $thesaurus_db_file;
   
   # ----------------------------------------------------------------------- BEGIN
   
   # FIXME: I don't think this needs to be documented, it prepares
   # private data structures - Jeremy
 =pod  =pod
   
 =back  =head1 General Subroutines
   
 =cut  
   
 # ----------------------------------------------------------------------- BEGIN  
   
 =pod  =over 4
   
 =item BEGIN()   =item * BEGIN() 
   
 Initialize values from language.tab, copyright.tab, filetypes.tab,  Initialize values from language.tab, copyright.tab, filetypes.tab,
 thesaurus.tab, and filecategories.tab.  thesaurus.tab, and filecategories.tab.
   
   =back
   
 =cut  =cut
   
 # ----------------------------------------------------------------------- BEGIN  # ----------------------------------------------------------------------- BEGIN
Line 228  BEGIN { Line 221  BEGIN {
     }  # end of unless($readit)       }  # end of unless($readit) 
           
 }  }
 # ============================================================= END BEGIN BLOCK  
 ###############################################################  ###############################################################
 ##           HTML and Javascript Helper Functions            ##  ##           HTML and Javascript Helper Functions            ##
 ###############################################################  ###############################################################
   
 =pod   =pod 
   
 =item browser_and_searcher_javascript   =head1 HTML and Javascript Functions
   
 Returns scalar containing javascript to open a browser window  =over 4
 or a searcher window.  Also creates   
   =item * browser_and_searcher_javascript ()
   
   X<browsing, javascript>X<searching, javascript>Returns a string
   containing javascript with two functions, C<openbrowser> and
   C<opensearcher>. Returned string does not contain E<lt>scriptE<gt>
   tags.
   
 =over 4  =over 4
   
 =item openbrowser(formname,elementname,only,omit) [javascript]  =item * openbrowser(formname,elementname,only,omit) [javascript]
   
 inputs: formname, elementname, only, omit  inputs: formname, elementname, only, omit
   
Line 255  with the given extension.  Can be a comm Line 254  with the given extension.  Can be a comm
 Specifying 'omit' will restrict the browser to NOT displaying files  Specifying 'omit' will restrict the browser to NOT displaying files
 with the given extension.  Can be a comma seperated list.  with the given extension.  Can be a comma seperated list.
   
 =item opensearcher(formname, elementname) [javascript]  =item * opensearcher(formname, elementname) [javascript]
   
 Inputs: formname, elementname  Inputs: formname, elementname
   
Line 266  of the element the selection from the se Line 265  of the element the selection from the se
   
 =cut  =cut
   
 ###############################################################  
 sub browser_and_searcher_javascript {  sub browser_and_searcher_javascript {
     return <<END;      return <<END;
     var editbrowser = null;      var editbrowser = null;
Line 387  sub selectcourse_link { Line 385  sub selectcourse_link {
         '","'.$udomele.'");'."'>Select Course</a>";          '","'.$udomele.'");'."'>Select Course</a>";
 }  }
   
 ###############################################################  
   
 =pod  =pod
   
 =item linked_select_forms(...)  =item * linked_select_forms(...)
   
 linked_select_forms returns a string containing a <script></script> block  linked_select_forms returns a string containing a <script></script> block
 and html for two <select> menus.  The select menus will be linked in that  and html for two <select> menus.  The select menus will be linked in that
Line 403  linked_select_forms takes the following Line 399  linked_select_forms takes the following
   
 =over 4  =over 4
   
 =item $formname, the name of the <form> tag  =item * $formname, the name of the <form> tag
   
 =item $middletext, the text which appears between the <select> tags  =item * $middletext, the text which appears between the <select> tags
   
 =item $firstdefault, the default value for the first menu  =item * $firstdefault, the default value for the first menu
   
 =item $firstselectname, the name of the first <select> tag  =item * $firstselectname, the name of the first <select> tag
   
 =item $secondselectname, the name of the second <select> tag  =item * $secondselectname, the name of the second <select> tag
   
 =item $hashref, a reference to a hash containing the data for the menus.  =item * $hashref, a reference to a hash containing the data for the menus.
   
 =back   =back 
   
Line 424  first menu value is given in $menu{$choi Line 420  first menu value is given in $menu{$choi
 and text for the second menu are given in the hash pointed to by   and text for the second menu are given in the hash pointed to by 
 $menu{$choice1}->{'select2'}.    $menu{$choice1}->{'select2'}.  
   
 my %menu = ( A1 => { text =>"Choice A1" ,   my %menu = ( A1 => { text =>"Choice A1" ,
                       default => "B3",                         default => "B3",
                       select2 => {                          select2 => { 
                           B1 => "Choice B1",                             B1 => "Choice B1",
                           B2 => "Choice B2",                             B2 => "Choice B2",
                           B3 => "Choice B3",                             B3 => "Choice B3",
                           B4 => "Choice B4"                             B4 => "Choice B4"
                           }                             }
                   },                     },
               A2 => { text =>"Choice A2" ,                 A2 => { text =>"Choice A2" ,
                       default => "C2",                         default => "C2",
                       select2 => {                          select2 => { 
                           C1 => "Choice C1",                             C1 => "Choice C1",
                           C2 => "Choice C2",                             C2 => "Choice C2",
                           C3 => "Choice C3"                             C3 => "Choice C3"
                           }                             }
                   },                     },
               A3 => { text =>"Choice A3" ,                 A3 => { text =>"Choice A3" ,
                       default => "D6",                         default => "D6",
                       select2 => {                          select2 => { 
                           D1 => "Choice D1",                             D1 => "Choice D1",
                           D2 => "Choice D2",                             D2 => "Choice D2",
                           D3 => "Choice D3",                             D3 => "Choice D3",
                           D4 => "Choice D4",                             D4 => "Choice D4",
                           D5 => "Choice D5",                             D5 => "Choice D5",
                           D6 => "Choice D6",                             D6 => "Choice D6",
                           D7 => "Choice D7"                             D7 => "Choice D7"
                           }                             }
                   }                     }
               );                 );
   
 =cut  =cut
   
 # ------------------------------------------------  
   
 sub linked_select_forms {  sub linked_select_forms {
     my ($formname,      my ($formname,
         $middletext,          $middletext,
Line 537  END Line 531  END
     return $result;      return $result;
 }   #  end of sub linked_select_forms {  }   #  end of sub linked_select_forms {
   
 ###############################################################  
   
 =pod  =pod
   
 =item help_open_topic($topic, $text, $stayOnPage, $width, $height)  =item * help_open_topic($topic, $text, $stayOnPage, $width, $height)
   
 Returns a string corresponding to an HTML link to the given help $topic, where $topic corresponds to the name of a .tex file in /home/httpd/html/adm/help/tex, with underscores replaced by spaces.  
   
 $text will optionally be linked to the same topic, allowing you to link text in addition to the graphic. If you do not want to link text, but wish to specify one of the later parameters, pass an empty string.  Returns a string corresponding to an HTML link to the given help
   $topic, where $topic corresponds to the name of a .tex file in
 $stayOnPage is a value that will be interpreted as a boolean. If true, the link will not open a new window. If false, the link will open a new window using Javascript. (Default is false.)  /home/httpd/html/adm/help/tex, with underscores replaced by
   spaces. 
 $width and $height are optional numerical parameters that will override the width and height of the popped up window, which may be useful for certain help topics with big pictures included.  
   $text will optionally be linked to the same topic, allowing you to
   link text in addition to the graphic. If you do not want to link
   text, but wish to specify one of the later parameters, pass an
   empty string. 
   
   $stayOnPage is a value that will be interpreted as a boolean. If true,
   the link will not open a new window. If false, the link will open
   a new window using Javascript. (Default is false.) 
   
   $width and $height are optional numerical parameters that will
   override the width and height of the popped up window, which may
   be useful for certain help topics with big pictures included. 
   
 =cut  =cut
   
Line 617  sub helpLatexCheatsheet { Line 619  sub helpLatexCheatsheet {
   
 =pod  =pod
   
 =item csv_translate($text)   =item * csv_translate($text) 
   
 Translate $text to allow it to be output as a 'comma seperated values'   Translate $text to allow it to be output as a 'comma seperated values' 
 format.  format.
   
   =back
   
 =cut  =cut
   
 sub csv_translate {  sub csv_translate {
Line 634  sub csv_translate { Line 638  sub csv_translate {
 ###############################################################  ###############################################################
 ##        Home server <option> list generating code          ##  ##        Home server <option> list generating code          ##
 ###############################################################  ###############################################################
 #-------------------------------------------  
   
 =pod  =pod
   
 =item get_domains()  =head1 Home Server option list generating code
   
   =over 4
   
   =item * get_domains()
   
 Returns an array containing each of the domains listed in the hosts.tab  Returns an array containing each of the domains listed in the hosts.tab
 file.  file.
Line 660  sub get_domains { Line 667  sub get_domains {
   
 =pod  =pod
   
 =item select_form($defdom,$name,%hash)  =item * select_form($defdom,$name,%hash)
   
 Returns a string containing a <select name='$name' size='1'> form to   Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select options from a hash option_name => displayed text.    allow a user to select options from a hash option_name => displayed text.  
Line 686  sub select_form { Line 693  sub select_form {
   
 =pod  =pod
   
 =item select_dom_form($defdom,$name,$includeempty)  =item * select_dom_form($defdom,$name,$includeempty)
   
 Returns a string containing a <select name='$name' size='1'> form to   Returns a string containing a <select name='$name' size='1'> form to 
 allow a user to select the domain to preform an operation in.    allow a user to select the domain to preform an operation in.  
Line 716  sub select_dom_form { Line 723  sub select_dom_form {
   
 =pod  =pod
   
 =item get_library_servers($domain)  =item * get_library_servers($domain)
   
 Returns a hash which contains keys like '103l3' and values like   Returns a hash which contains keys like '103l3' and values like 
 'kirk.lite.msu.edu'.  All of the keys will be for machines in the  'kirk.lite.msu.edu'.  All of the keys will be for machines in the
Line 740  sub get_library_servers { Line 747  sub get_library_servers {
   
 =pod  =pod
   
 =item home_server_option_list($domain)  =item * home_server_option_list($domain)
   
 returns a string which contains an <option> list to be used in a   returns a string which contains an <option> list to be used in a 
 <select> form input.  See loncreateuser.pm for an example.  <select> form input.  See loncreateuser.pm for an example.
Line 758  sub home_server_option_list { Line 765  sub home_server_option_list {
     }      }
     return $result;      return $result;
 }  }
 ###############################################################  
 ##    End of home server <option> list generating code       ##  =pod
 ###############################################################  
   =back
   
   =cut
   
 ###############################################################  ###############################################################
   ##                  Decoding User Agent                      ##
 ###############################################################  ###############################################################
   
 =pod  =pod
   
 =item &decode_user_agent()  =head1 Decoding the User Agent
   
   =over 4
   
   =item * &decode_user_agent()
   
 Inputs: $r  Inputs: $r
   
Line 775  Outputs: Line 790  Outputs:
   
 =over 4  =over 4
   
 =item $httpbrowser  =item * $httpbrowser
   
 =item $clientbrowser  =item * $clientbrowser
   
 =item $clientversion  =item * $clientversion
   
 =item $clientmathml  =item * $clientmathml
   
 =item $clientunicode  =item * $clientunicode
   
 =item $clientos  =item * $clientos
   
 =back  =back
   
Line 827  sub decode_user_agent { Line 842  sub decode_user_agent {
             $clientunicode,$clientos,);              $clientunicode,$clientos,);
 }  }
   
 ###############################################################  =pod
 ###############################################################  
   =back
   
   =cut
   
 ###############################################################  ###############################################################
 ##    Authentication changing form generation subroutines    ##  ##    Authentication changing form generation subroutines    ##
Line 843  sub decode_user_agent { Line 860  sub decode_user_agent {
   
 =pod  =pod
   
 =item authform_xxxxxx  =head1 Authentication Routines
   
   =over 4
   
   =item * authform_xxxxxx
   
 The authform_xxxxxx subroutines provide javascript and html forms which   The authform_xxxxxx subroutines provide javascript and html forms which 
 handle some of the conveniences required for authentication forms.    handle some of the conveniences required for authentication forms.  
Line 853  See loncreateuser.pm for invocation and Line 874  See loncreateuser.pm for invocation and
   
 =over 4  =over 4
   
 =item authform_header  =item * authform_header
   
 =item authform_authorwarning  =item * authform_authorwarning
   
 =item authform_nochange  =item * authform_nochange
   
 =item authform_kerberos  =item * authform_kerberos
   
 =item authform_internal  =item * authform_internal
   
 =item authform_filesystem  =item * authform_filesystem
   
 =back  =back
   
Line 1061  END Line 1082  END
     return $result;      return $result;
 }  }
   
 ###############################################################  =pod
 ##   End Authentication changing form generation functions   ##  
 ###############################################################  =back
   
   =cut
   
 ###############################################################  ###############################################################
 ##    Get Authentication Defaults for Domain                 ##  ##    Get Authentication Defaults for Domain                 ##
 ###############################################################  ###############################################################
 ##  
 ## Returns default authentication type and an associated argument  
 ## as listed in file domain.tab  
 ##  
 #-------------------------------------------  
   
 =pod  =pod
   
 =item get_auth_defaults  =head1 Domains and Authentication
   
   Returns default authentication type and an associated argument as
   listed in file 'domain.tab'.
   
   =over 4
   
   =item * get_auth_defaults
   
 get_auth_defaults($target_domain) returns the default authentication  get_auth_defaults($target_domain) returns the default authentication
 type and an associated argument (initial password or a kerberos domain).  type and an associated argument (initial password or a kerberos domain).
Line 1086  These values are stored in lonTabs/domai Line 1111  These values are stored in lonTabs/domai
   
 If target_domain is not found in domain.tab, returns nothing ('').  If target_domain is not found in domain.tab, returns nothing ('').
   
 =over 4  
   
 =item get_auth_defaults  
   
 =back  
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
Line 1115  sub get_auth_defaults { Line 1134  sub get_auth_defaults {
   
 =pod  =pod
   
 =item get_kerberos_defaults  =item * get_kerberos_defaults
   
 get_kerberos_defaults($target_domain) returns the default kerberos  get_kerberos_defaults($target_domain) returns the default kerberos
 version and domain. If not found in domain.tabs, it defaults to  version and domain. If not found in domain.tabs, it defaults to
Line 1123  version 4 and the domain of the server. Line 1142  version 4 and the domain of the server.
   
 ($def_version, $def_krb_domain) = &get_kerberos_defaults($target_domain);  ($def_version, $def_krb_domain) = &get_kerberos_defaults($target_domain);
   
 =over 4  
   
 =item get_kerberos_defaults  
   
 =back  
   
 =cut  =cut
   
 #-------------------------------------------  #-------------------------------------------
Line 1144  sub get_kerberos_defaults { Line 1157  sub get_kerberos_defaults {
     }      }
     return ($krbdef,$krbdefdom);      return ($krbdef,$krbdefdom);
 }  }
 ###############################################################  
 ##   End Get Kerberos Defaults for Domain              ##  =pod
 ###############################################################  
   =back
   
   =cut
   
 ###############################################################  ###############################################################
 ##                Thesaurus Functions                        ##  ##                Thesaurus Functions                        ##
Line 1154  sub get_kerberos_defaults { Line 1170  sub get_kerberos_defaults {
   
 =pod  =pod
   
 =item initialize_keywords  =head1 Thesaurus Functions
   
   =over 4
   
   =item * initialize_keywords
   
 Initializes the package variable %Keywords if it is empty.  Uses the  Initializes the package variable %Keywords if it is empty.  Uses the
 package variable $thesaurus_db_file.  package variable $thesaurus_db_file.
Line 1199  sub initialize_keywords { Line 1219  sub initialize_keywords {
   
 =pod  =pod
   
 =item keyword($word)  =item * keyword($word)
   
 Returns true if $word is a keyword.  A keyword is a word that appears more   Returns true if $word is a keyword.  A keyword is a word that appears more 
 than the average number of times in the thesaurus database.  Calls   than the average number of times in the thesaurus database.  Calls 
Line 1220  sub keyword { Line 1240  sub keyword {
   
 =pod   =pod 
   
 =item get_related_words  =item * get_related_words
   
 Look up a word in the thesaurus.  Takes a scalar arguement and returns  Look up a word in the thesaurus.  Takes a scalar arguement and returns
 an array of words.  If the keyword is not in the thesaurus, an empty array  an array of words.  If the keyword is not in the thesaurus, an empty array
Line 1257  sub get_related_words { Line 1277  sub get_related_words {
     return @Words;      return @Words;
 }  }
   
 ###############################################################  =pod
 ##              End Thesaurus Functions                      ##  
 ###############################################################  =back
   
   =cut
   
 # -------------------------------------------------------------- Plaintext name  # -------------------------------------------------------------- Plaintext name
 =pod  =pod
   
 =item plainname($uname,$udom)  =head1 User Name Functions
   
 Gets a users name and returns it as a string in  =over 4
 "first middle last generation"  
 form  =item * plainname($uname,$udom)
   
   Takes a users logon name and returns it as a string in
   "first middle last generation" form
   
 =cut  =cut
   
Line 1288  sub plainname { Line 1313  sub plainname {
 # -------------------------------------------------------------------- Nickname  # -------------------------------------------------------------------- Nickname
 =pod  =pod
   
 =item nickname($uname,$udom)  =item * nickname($uname,$udom)
   
 Gets a users name and returns it as a string as  Gets a users name and returns it as a string as
   
Line 1323  sub nickname { Line 1348  sub nickname {
   
 =pod  =pod
   
 =item screenname($uname,$udom)  =item * screenname($uname,$udom)
   
 Gets a users screenname and returns it as a string  Gets a users screenname and returns it as a string
   
Line 1368  sub syllabuswrapper { Line 1393  sub syllabuswrapper {
     return "<a href='/public/$domain/$coursedir/syllabus'>$linktext</a>";      return "<a href='/public/$domain/$coursedir/syllabus'>$linktext</a>";
 }  }
   
 # ---------------------------------------------------------------- Language IDs  =pod
   
   =back
   
   =head1 Access .tab File Data
   
   =over 4
   
   =item * languageids() 
   
   returns list of all language ids
   
   =cut
   
 sub languageids {  sub languageids {
     return sort(keys(%language));      return sort(keys(%language));
 }  }
   
 # -------------------------------------------------------- Language Description  =pod
   
   =item * languagedescription() 
   
   returns description of a specified language id
   
   =cut
   
 sub languagedescription {  sub languagedescription {
     return $language{shift(@_)};      return $language{shift(@_)};
 }  }
   
   =pod
   
   =item * copyrightids() 
   
   returns list of all copyrights
   
   =cut
   
   sub copyrightids {
       return sort(keys(%cprtag));
   }
   
   =pod
   
   =item * copyrightdescription() 
   
   returns description of a specified copyright id
   
   =cut
   
   sub copyrightdescription {
       return $cprtag{shift(@_)};
   }
   
   =pod
   
   =item * filecategories() 
   
   returns list of all file categories
   
   =cut
   
   sub filecategories {
       return sort(keys(%category_extensions));
   }
   
   =pod
   
   =item * filecategorytypes() 
   
   returns list of file types belonging to a given file
   category
   
   =cut
   
   sub filecategorytypes {
       return @{$category_extensions{lc($_[0])}};
   }
   
   =pod
   
   =item * fileembstyle() 
   
   returns embedding style for a specified file type
   
   =cut
   
   sub fileembstyle {
       return $fe{lc(shift(@_))};
   }
   
   =pod
   
   =item * filedescription() 
   
   returns description for a specified file type
   
   =cut
   
   sub filedescription {
       return $fd{lc(shift(@_))};
   }
   
   =pod
   
   =item * filedescriptionex() 
   
   returns description for a specified file type with
   extra formatting
   
   =cut
   
   sub filedescriptionex {
       my $ex=shift;
       return '.'.$ex.' '.$fd{lc($ex)};
   }
   
   # End of .tab access
   =pod
   
   =back
   
   =cut
   
   # ------------------------------------------------------------------ File Types
   sub fileextensions {
       return sort(keys(%fe));
   }
   
 # ----------------------------------------------------------- Display Languages  # ----------------------------------------------------------- Display Languages
 # returns a hash with all desired display languages  # returns a hash with all desired display languages
 #  #
Line 1404  sub display_languages { Line 1548  sub display_languages {
     return %languages;      return %languages;
 }  }
   
 # --------------------------------------------------------------- Copyright IDs  ###############################################################
 sub copyrightids {  ##               Student Answer Attempts                     ##
     return sort(keys(%cprtag));  ###############################################################
 }  
   
 # ------------------------------------------------------- Copyright Description  =pod
 sub copyrightdescription {  
     return $cprtag{shift(@_)};  
 }  
   
 # ------------------------------------------------------------- File Categories  =head1 Alternate Problem Views
 sub filecategories {  
     return sort(keys(%category_extensions));  
 }  
   
 # -------------------------------------- File Types within a specified category  =over 4
 sub filecategorytypes {  
     return @{$category_extensions{lc($_[0])}};  
 }  
   
 # ------------------------------------------------------------------ File Types  =item * get_previous_attempt($symb, $username, $domain, $course,
 sub fileextensions {      $getattempt, $regexp, $gradesub)
     return sort(keys(%fe));  
 }  
   
 # ------------------------------------------------------------- Embedding Style  Return string with previous attempt on problem. Arguments:
 sub fileembstyle {  
     return $fe{lc(shift(@_))};  
 }  
   
 # ------------------------------------------------------------ Description Text  =over 4
 sub filedescription {  
     return $fd{lc(shift(@_))};  
 }  
   
 # ------------------------------------------------------------ Description Text  =item * $symb: Problem, including path
 sub filedescriptionex {  
     my $ex=shift;  =item * $username: username of the desired student
     return '.'.$ex.' '.$fd{lc($ex)};  
 }  =item * $domain: domain of the desired student
   
   =item * $course: Course ID
   
   =item * $getattempt: Leave blank for all attempts, otherwise put
       something
   
   =item * $regexp: if string matches this regexp, the string will be
       sent to $gradesub
   
   =item * $gradesub: routine that processes the string if it matches $regexp
   
   =back
   
   The output string is a table containing all desired attempts, if any.
   
   =cut
   
 # ---- Retrieve attempts by students  
 # input  
 # $symb             - problem including path  
 # $username,$domain - that of the student  
 # $course           - course name  
 # $getattempt       - leave blank if want all attempts, else put something.  
 # $regexp           - regular expression. If string matches regexp send to  
 # $gradesub         - routine that process the string if it matches regexp  
 #   
 # output  
 # formatted as a table all the attempts, if any.  
 #  
 sub get_previous_attempt {  sub get_previous_attempt {
   my ($symb,$username,$domain,$course,$getattempt,$regexp,$gradesub)=@_;    my ($symb,$username,$domain,$course,$getattempt,$regexp,$gradesub)=@_;
   my $prevattempts='';    my $prevattempts='';
Line 1557  sub relative_to_absolute { Line 1687  sub relative_to_absolute {
     return $output;      return $output;
 }  }
   
   =pod
   
   =item * get_student_view
   
   show a snapshot of what student was looking at
   
   =cut
   
 sub get_student_view {  sub get_student_view {
   my ($symb,$username,$domain,$courseid,$target) = @_;    my ($symb,$username,$domain,$courseid,$target) = @_;
   my ($map,$id,$feedurl) = split(/___/,$symb);    my ($map,$id,$feedurl) = split(/___/,$symb);
Line 1585  sub get_student_view { Line 1723  sub get_student_view {
   return $userview;    return $userview;
 }  }
   
   =pod
   
   =item * get_student_answers() 
   
   show a snapshot of how student was answering problem
   
   =cut
   
 sub get_student_answers {  sub get_student_answers {
   my ($symb,$username,$domain,$courseid,%form) = @_;    my ($symb,$username,$domain,$courseid,%form) = @_;
   my ($map,$id,$feedurl) = split(/___/,$symb);    my ($map,$id,$feedurl) = split(/___/,$symb);
Line 1604  sub get_student_answers { Line 1750  sub get_student_answers {
   return $userview;    return $userview;
 }  }
   
   =pod
   
   =back
   
   =cut
   
 ###############################################  ###############################################
   
   
Line 1668  sub findallcourses { Line 1820  sub findallcourses {
   
 =pod  =pod
   
 =item &determinedomain()  =head1 Domain Template Functions
   
   =over 4
   
   =item * &determinedomain()
   
 Inputs: $domain (usually will be undef)  Inputs: $domain (usually will be undef)
   
Line 1692  sub determinedomain { Line 1848  sub determinedomain {
 ###############################################  ###############################################
 =pod  =pod
   
 =item &domainlogo()  =item * &domainlogo()
   
 Inputs: $domain (usually will be undef)  Inputs: $domain (usually will be undef)
   
Line 1700  Returns: A link to a domain logo, if the Line 1856  Returns: A link to a domain logo, if the
 If the domain logo does not exist, a description of the domain.  If the domain logo does not exist, a description of the domain.
   
 =cut  =cut
   
 ###############################################  ###############################################
 sub domainlogo {  sub domainlogo {
     my $domain = &determinedomain(shift);          my $domain = &determinedomain(shift);    
Line 1719  sub domainlogo { Line 1876  sub domainlogo {
   
 =pod  =pod
   
 =item &designparm()  =item * &designparm()
   
 Inputs: $which parameter; $domain (usually will be undef)  Inputs: $which parameter; $domain (usually will be undef)
   
 Returns: value of designparamter $which  Returns: value of designparamter $which
   
 =cut  =cut
   
 ##############################################  ##############################################
 sub designparm {  sub designparm {
     my ($which,$domain)=@_;      my ($which,$domain)=@_;
Line 1756  sub designparm { Line 1914  sub designparm {
   
 =pod  =pod
   
 =item &bodytag()  =back
   
   =head1 HTTP Helpers
   
   =over 4
   
   =item * &bodytag()
   
 Returns a uniform header for LON-CAPA web pages.  Returns a uniform header for LON-CAPA web pages.
   
 Inputs:   Inputs: 
   
  $title, A title to be displayed on the page.  =over 4
  $function, the current role (can be undef).  
  $addentries, extra parameters for the <body> tag.  =item * $title, A title to be displayed on the page.
  $bodyonly, if defined, only return the <body> tag.  
  $domain, if defined, force a given domain.  =item * $function, the current role (can be undef).
  $forcereg, if page should register as content page (relevant for   
   =item * $addentries, extra parameters for the <body> tag.
   
   =item * $bodyonly, if defined, only return the <body> tag.
   
   =item * $domain, if defined, force a given domain.
   
   =item * $forcereg, if page should register as content page (relevant for 
             text interface only)              text interface only)
   
   =back
   
 Returns: A uniform header for LON-CAPA web pages.    Returns: A uniform header for LON-CAPA web pages.  
 If $bodyonly is nonzero, a string containing a <body> tag will be returned.  If $bodyonly is nonzero, a string containing a <body> tag will be returned.
 If $bodyonly is undef or zero, an html string containing a <body> tag and   If $bodyonly is undef or zero, an html string containing a <body> tag and 
Line 1777  other decorations will be returned. Line 1950  other decorations will be returned.
   
 =cut  =cut
   
 ###############################################  
   
   
 ###############################################  
 sub bodytag {  sub bodytag {
     my ($title,$function,$addentries,$bodyonly,$domain,$forcereg)=@_;      my ($title,$function,$addentries,$bodyonly,$domain,$forcereg)=@_;
     unless ($function) {      unless ($function) {
Line 1947  sub get_posted_cgi { Line 2116  sub get_posted_cgi {
     $r->headers_in->unset('Content-length');      $r->headers_in->unset('Content-length');
 }  }
   
 ###############################################  =pod
   
   =item * get_unprocessed_cgi($query,$possible_names)
   
   Modify the %ENV hash to contain unprocessed CGI form parameters held in
   $query.  The parameters listed in $possible_names (an array reference),
   will be set in $ENV{'form.name'} if they do not already exist.
   
   Typically called with $ENV{'QUERY_STRING'} as the first parameter.  
   $possible_names is an ref to an array of form element names.  As an example:
   get_unprocessed_cgi($ENV{'QUERY_STRING'},['uname','udom']);
   will result in $ENV{'form.uname'} and $ENV{'form.udom'} being set.
   
   =cut
   
 sub get_unprocessed_cgi {  sub get_unprocessed_cgi {
   my ($query,$possible_names)= @_;    my ($query,$possible_names)= @_;
Line 1964  sub get_unprocessed_cgi { Line 2146  sub get_unprocessed_cgi {
   }    }
 }  }
   
   =pod
   
   =item * cacheheader() 
   
   returns cache-controlling header code
   
   =cut
   
 sub cacheheader {  sub cacheheader {
   unless ($ENV{'request.method'} eq 'GET') { return ''; }    unless ($ENV{'request.method'} eq 'GET') { return ''; }
   my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime);    my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime);
Line 1973  sub cacheheader { Line 2163  sub cacheheader {
   return $output;    return $output;
 }  }
   
   =pod
   
   =item * no_cache($r) 
   
   specifies header code to not have cache
   
   =cut
   
 sub no_cache {  sub no_cache {
   my ($r) = @_;    my ($r) = @_;
   unless ($ENV{'request.method'} eq 'GET') { return ''; }    unless ($ENV{'request.method'} eq 'GET') { return ''; }
Line 1982  sub no_cache { Line 2180  sub no_cache {
   #$r->header_out("Expires" => $date);    #$r->header_out("Expires" => $date);
 }  }
   
   =pod
   
   =item * add_to_env($name,$value) 
   
   adds $name to the %ENV hash with value
   $value, if $name already exists, the entry is converted to an array
   reference and $value is added to the array.
   
   =cut
   
 sub add_to_env {  sub add_to_env {
   my ($name,$value)=@_;    my ($name,$value)=@_;
   if (defined($ENV{$name})) {    if (defined($ENV{$name})) {
Line 2003  sub add_to_env { Line 2211  sub add_to_env {
   
 =back   =back 
   
 =head2 CSV Upload/Handling functions  =head1 CSV Upload/Handling functions
   
 =over 4  =over 4
   
 =item  upfile_store($r)  =item * upfile_store($r)
   
 Store uploaded file, $r should be the HTTP Request object,  Store uploaded file, $r should be the HTTP Request object,
 needs $ENV{'form.upfile'}  needs $ENV{'form.upfile'}
Line 2034  sub upfile_store { Line 2242  sub upfile_store {
   
 =pod  =pod
   
 =item load_tmp_file($r)  =item * load_tmp_file($r)
   
 Load uploaded file from tmp, $r should be the HTTP Request object,  Load uploaded file from tmp, $r should be the HTTP Request object,
 needs $ENV{'form.datatoken'},  needs $ENV{'form.datatoken'},
Line 2057  sub load_tmp_file { Line 2265  sub load_tmp_file {
   
 =pod  =pod
   
 =item upfile_record_sep()  =item * upfile_record_sep()
   
 Separate uploaded file into records  Separate uploaded file into records
 returns array of records,  returns array of records,
Line 2074  sub upfile_record_sep { Line 2282  sub upfile_record_sep {
   
 =pod  =pod
   
 =item record_sep($record)  =item * record_sep($record)
   
 Separate a record into fields $record should be an item from the upfile_record_sep(), needs $ENV{'form.upfiletype'}  Separate a record into fields $record should be an item from the upfile_record_sep(), needs $ENV{'form.upfiletype'}
   
Line 2126  sub record_sep { Line 2334  sub record_sep {
   
 =pod  =pod
   
 =item upfile_select_html()  =item * upfile_select_html()
   
 return HTML code to select file and specify its type  return HTML code to select file and specify its type
   
Line 2146  ENDUPFORM Line 2354  ENDUPFORM
   
 =pod  =pod
   
 =item csv_print_samples($r,$records)  =item * csv_print_samples($r,$records)
   
 Prints a table of sample values from each column uploaded $r is an  Prints a table of sample values from each column uploaded $r is an
 Apache Request ref, $records is an arrayref from  Apache Request ref, $records is an arrayref from
Line 2178  sub csv_print_samples { Line 2386  sub csv_print_samples {
   
 =pod  =pod
   
 =item csv_print_select_table($r,$records,$d)  =item * csv_print_select_table($r,$records,$d)
   
 Prints a table to create associations between values and table columns.  Prints a table to create associations between values and table columns.
 $r is an Apache Request ref,  $r is an Apache Request ref,
Line 2212  sub csv_print_select_table { Line 2420  sub csv_print_select_table {
   
 =pod  =pod
   
 =item csv_samples_select_table($r,$records,$d)  =item * csv_samples_select_table($r,$records,$d)
   
 Prints a table of sample values from the upload and can make associate samples to internal names.  Prints a table of sample values from the upload and can make associate samples to internal names.
   
Line 2252  sub csv_samples_select_table { Line 2460  sub csv_samples_select_table {
   
 =pod  =pod
   
 =item check_if_partid_hidden($id,$symb,$udom,$uname)  =item * check_if_partid_hidden($id,$symb,$udom,$uname)
   
 Returns either 1 or undef  Returns either 1 or undef
   
Line 2278  sub check_if_partid_hidden { Line 2486  sub check_if_partid_hidden {
     return undef;      return undef;
 }  }
   
   
   
 1;  
 __END__;  
   
 =pod  =pod
   
 =back  =back
   
 =head2 Access .tab File Data  =cut
   
 =over 4  
   
 =item languageids()   
   
 returns list of all language ids  
   
 =item languagedescription()   
   
 returns description of a specified language id  
   
 =item copyrightids()   
   
 returns list of all copyrights  
   
 =item copyrightdescription()   
   
 returns description of a specified copyright id  
   
 =item filecategories()   
   
 returns list of all file categories  
   
 =item filecategorytypes()   
   
 returns list of file types belonging to a given file  
 category  
   
 =item fileembstyle()   
   
 returns embedding style for a specified file type  
   
 =item filedescription()   
   
 returns description for a specified file type  
   
 =item filedescriptionex()   
   
 returns description for a specified file type with  
 extra formatting  
   
 =back  
   
 =head2 Alternate Problem Views  
   
 =over 4  
   
 =item get_previous_attempt()   
   
 return string with previous attempt on problem  
   
 =item get_student_view()   
   
 show a snapshot of what student was looking at  
   
 =item get_student_answers()   
   
 show a snapshot of how student was answering problem  
   
 =back  
   
 =head2 HTTP Helper  
   
 =over 4  
   
 =item get_unprocessed_cgi($query,$possible_names)  
   
 Modify the %ENV hash to contain unprocessed CGI form parameters held in  
 $query.  The parameters listed in $possible_names (an array reference),  
 will be set in $ENV{'form.name'} if they do not already exist.  
   
 Typically called with $ENV{'QUERY_STRING'} as the first parameter.    
 $possible_names is an ref to an array of form element names.  As an example:  
 get_unprocessed_cgi($ENV{'QUERY_STRING'},['uname','udom']);  
 will result in $ENV{'form.uname'} and $ENV{'form.udom'} being set.  
   
 =item cacheheader()   
   
 returns cache-controlling header code  
   
 =item no_cache($r)   
   
 specifies header code to not have cache  
   
 =item add_to_env($name,$value)   
   
 adds $name to the %ENV hash with value  
 $value, if $name already exists, the entry is converted to an array  
 reference and $value is added to the array.  
   
 =back  1;
   __END__;
   
 =cut  

Removed from v.1.111  
changed lines
  Added in v.1.112


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>