--- loncom/interface/loncommon.pm 2001/12/11 19:37:12 1.14 +++ loncom/interface/loncommon.pm 2001/12/25 21:57:54 1.21 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.14 2001/12/11 19:37:12 harris41 Exp $ +# $Id: loncommon.pm,v 1.21 2001/12/25 21:57:54 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,10 +27,14 @@ # # YEAR=2001 # 2/13-12/7 Guy Albertelli -# 12/11 Scott Harrison +# 12/11,12/12,12/17 Scott Harrison +# 12/21 Gerd Kortemeyer +# 12/21 Scott Harrison +# 12/25 Gerd Kortemeyer # Makes a table out of the previous attempts # Inputs result_from_symbread, user, domain, course_id +# Reads in non-network-related .tab files package Apache::loncommon; @@ -39,87 +43,206 @@ use POSIX qw(strftime); use Apache::Constants qw(:common); use Apache::lonmsg(); +# ----------------------------------------------- Filetypes/Languages/Copyright my %language; my %cprtag; my %fe; my %fd; +my %fc; + +# -------------------------------------------------------------- Thesaurus data +my @therelated; +my @theword; +my @thecount; +my %theindex; +my $thetotalcount; +my $thefuzzy=2; +my $thethreshold=0.1/$thefuzzy; +my $theavecount; # ----------------------------------------------------------------------- BEGIN -sub BEGIN { +BEGIN { # ------------------------------------------------------------------- languages { my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}. '/language.tab'); - while (<$fh>) { - next if /^\#/; - chomp; - my ($key,$val)=(split(/\s+/,$_,2)); - $language{$key}=$val; + if ($fh) { + while (<$fh>) { + next if /^\#/; + chomp; + my ($key,$val)=(split(/\s+/,$_,2)); + $language{$key}=$val; + } } } # ------------------------------------------------------------------ copyrights { + my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonIncludes'}. + '/copyright.tab'); + if ($fh) { + while (<$fh>) { + next if /^\#/; + chomp; + my ($key,$val)=(split(/\s+/,$_,2)); + $cprtag{$key}=$val; + } + } + } +# ------------------------------------------------------------- file categories + { my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}. - '/copyright.tab'); - while (<$fh>) { - next if /^\#/; - chomp; - my ($key,$val)=(split(/\s+/,$_,2)); - $cprtag{$key}=$val; + '/filecategories.tab'); + if ($fh) { + while (<$fh>) { + next if /^\#/; + chomp; + my ($key,$val)=(split(/\s+/,$_,2)); + push @{$fc{$key}},$val; + } } } # ------------------------------------------------------------------ file types { - my $fh=Apache::File->new("$perlvar{'lonTabDir'}/filetypes.tab"); - while (<$fh>) { - next if (/^\#/); - chomp; - my ($ending,$emb,$descr)=split(/\s+/,$_,3); - if ($descr ne '') { - $fe{$ending}=lc($emb); - $fd{$ending}=join(' ',@descr); + my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}. + '/filetypes.tab'); + if ($fh) { + while (<$fh>) { + next if (/^\#/); + chomp; + my ($ending,$emb,$descr)=split(/\s+/,$_,3); + if ($descr ne '') { + $fe{$ending}=lc($emb); + $fd{$ending}=$descr; + } } } } +# -------------------------------------------------------------- Thesaurus data + { + my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}. + '/thesaurus.dat'); + if ($fh) { + while (<$fh>) { + my ($tword,$tindex,$tcount,$trelated)=split(/\@/,$_); + $theindex{$tword}=$tindex; + $theword[$tindex]=$tword; + $thecount[$tindex]=$tcount; + $thetotalcount+=$tcount; + $therelated[$tindex]=$trelated; + } + } + $theavecount=$thetotalcount/$#thecount; + } +} +# ============================================================= END BEGIN BLOCK + + +# ---------------------------------------------------------- Is this a keyword? + +sub keyword { + my $newword=shift; + $newword=~s/\W//g; + $newword=~tr/A-Z/a-z/; + my $tindex=$theindex{$newword}; + if ($tindex) { + if ($thecount[$tindex]>$theavecount) { + return 1; + } + } + return 0; +} +# -------------------------------------------------------- Return related words + +sub related { + my $newword=shift; + $newword=~s/\W//g; + $newword=~tr/A-Z/a-z/; + my $tindex=$theindex{$newword}; + if ($tindex) { + my %found=(); + foreach (split(/\,/,$therelated[$tindex])) { +# - Related word found + my ($ridx,$rcount)=split(/\:/,$_); +# - Direct relation index + my $directrel=$rcount/$thecount[$tindex]; + if ($directrel>$thethreshold) { + foreach (split(/\,/,$therelated[$ridx])) { + my ($rridx,$rrcount)=split(/\:/,$_); + if ($rridx==$tindex) { +# - Determine reverse relation index + my $revrel=$rrcount/$thecount[$ridx]; +# - Calculate full index + $found{$ridx}=$directrel*$revrel; + if ($found{$ridx}>$thethreshold) { + foreach (split(/\,/,$therelated[$ridx])) { + my ($rrridx,$rrrcount)=split(/\:/,$_); + unless ($found{$rrridx}) { + my $revrevrel=$rrrcount/$thecount[$ridx]; + if ( + $directrel*$revrel*$revrevrel>$thethreshold + ) { + $found{$rrridx}= + $directrel*$revrel*$revrevrel; + } + } + } + } + } + } + } + } + } + return (); } # ---------------------------------------------------------------- Language IDs sub languageids { - + return sort(keys(%language)); } # -------------------------------------------------------- Language Description sub languagedescription { - + return $language{shift(@_)}; } # --------------------------------------------------------------- Copyright IDs sub copyrightids { - + return sort(keys(%cprtag)); } # ------------------------------------------------------- Copyright Description sub copyrightdescription { - + return $cprtag{shift(@_)}; } # ------------------------------------------------------------- File Categories sub filecategories { + return sort(keys(%fc)); +} +# -------------------------------------- File Types within a specified category +sub filecategorytypes { + return @{$fc{lc(shift(@_))}}; } # ------------------------------------------------------------------ File Types sub fileextensions { - + return sort(keys(%fe)); } # ------------------------------------------------------------- Embedding Style sub fileembstyle { - + return $fe{lc(shift(@_))}; } # ------------------------------------------------------------ Description Text sub filedescription { + return $fd{lc(shift(@_))}; +} +# ------------------------------------------------------------ Description Text +sub filedescriptionex { + my $ex=shift; + return '.'.$ex.' '.$fd{lc($ex)}; } sub get_previous_attempt { @@ -132,17 +255,17 @@ sub get_previous_attempt { my %lasthash=(); my $version; for ($version=1;$version<=$returnhash{'version'};$version++) { - map { + foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) { $lasthash{$_}=$returnhash{$version.':'.$_}; - } sort(split(/\:/,$returnhash{$version.':keys'})); + } } $prevattempts='
History | '; - map { + foreach (sort(keys %lasthash)) { $prevattempts.=''.$_.' | '; - } sort(keys %lasthash); + } for ($version=1;$version<=$returnhash{'version'};$version++) { $prevattempts.='
---|---|
Attempt '.$version.' | '; - map { + foreach (sort(keys %lasthash)) { my $value; if ($_ =~ /timestamp/) { $value=scalar(localtime($returnhash{$version.':'.$_})); @@ -150,10 +273,10 @@ sub get_previous_attempt { $value=$returnhash{$version.':'.$_}; } $prevattempts.=''.$value.' | '; - } sort(keys %lasthash); + } } $prevattempts.='
Current | '; - map { + foreach (sort(keys %lasthash)) { my $value; if ($_ =~ /timestamp/) { $value=scalar(localtime($lasthash{$_})); @@ -161,7 +284,7 @@ sub get_previous_attempt { $value=$lasthash{$_}; } $prevattempts.=''.$value.' | '; - } sort(keys %lasthash); + } $prevattempts.='