version 1.1135, 2013/07/03 05:03:12
|
version 1.1148, 2013/08/20 01:51:50
|
Line 2349 Outputs:
|
Line 2349 Outputs:
|
|
|
=item * $clientos |
=item * $clientos |
|
|
|
=item * $clientmobile |
|
|
|
=item * $clientinfo |
|
|
=back |
=back |
|
|
=back |
=back |
Line 2367 sub decode_user_agent {
|
Line 2371 sub decode_user_agent {
|
my $clientversion='0'; |
my $clientversion='0'; |
my $clientmathml=''; |
my $clientmathml=''; |
my $clientunicode='0'; |
my $clientunicode='0'; |
|
my $clientmobile=0; |
for (my $i=0;$i<=$#browsertype;$i++) { |
for (my $i=0;$i<=$#browsertype;$i++) { |
my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\:/,$browsertype[$i]); |
my ($bname,$match,$notmatch,$vreg,$minv,$univ)=split(/\:/,$browsertype[$i]); |
if (($httpbrowser=~/$match/i) && ($httpbrowser!~/$notmatch/i)) { |
if (($httpbrowser=~/$match/i) && ($httpbrowser!~/$notmatch/i)) { |
Line 2378 sub decode_user_agent {
|
Line 2383 sub decode_user_agent {
|
} |
} |
} |
} |
my $clientos='unknown'; |
my $clientos='unknown'; |
|
my $clientinfo; |
if (($httpbrowser=~/linux/i) || |
if (($httpbrowser=~/linux/i) || |
($httpbrowser=~/unix/i) || |
($httpbrowser=~/unix/i) || |
($httpbrowser=~/ux/i) || |
($httpbrowser=~/ux/i) || |
Line 2389 sub decode_user_agent {
|
Line 2395 sub decode_user_agent {
|
($httpbrowser=~/powerpc/i)) { $clientos='mac'; } |
($httpbrowser=~/powerpc/i)) { $clientos='mac'; } |
if ($httpbrowser=~/win/i) { $clientos='win'; } |
if ($httpbrowser=~/win/i) { $clientos='win'; } |
if ($httpbrowser=~/embed/i) { $clientos='pda'; } |
if ($httpbrowser=~/embed/i) { $clientos='pda'; } |
|
if ($httpbrowser=~/(Android|iPod|iPad|iPhone|webOS|Blackberry|Windows Phone|Opera m(?:ob|in)|Fennec)/i) { |
|
$clientmobile=lc($1); |
|
} |
|
if ($httpbrowser=~ m{Firefox/(\d+\.\d+)}) { |
|
$clientinfo = 'firefox-'.$1; |
|
} elsif ($httpbrowser=~ m{chromeframe/(\d+\.\d+)\.}) { |
|
$clientinfo = 'chromeframe-'.$1; |
|
} |
return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
return ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
$clientunicode,$clientos,); |
$clientunicode,$clientos,$clientmobile,$clientinfo); |
} |
} |
|
|
############################################################### |
############################################################### |
Line 3060 sub get_related_words {
|
Line 3074 sub get_related_words {
|
|
|
=pod |
=pod |
|
|
|
=back |
|
|
=head1 Spell checking |
=head1 Spell checking |
|
|
=over 4 |
=over 4 |
Line 3093 Note: This sub assumes that aspell is in
|
Line 3109 Note: This sub assumes that aspell is in
|
=cut |
=cut |
|
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
|
sub check_spelling { |
sub check_spelling { |
my ($wordlist, $language) = @_; |
my ($wordlist, $language) = @_; |
my @misspellings; |
my @misspellings; |
Line 3314 sub screenname {
|
Line 3324 sub screenname {
|
# ------------------------------------------------------------- Confirm Wrapper |
# ------------------------------------------------------------- Confirm Wrapper |
=pod |
=pod |
|
|
=item confirmwrapper |
=item * &confirmwrapper($message) |
|
|
Wrap messages about completion of operation in box |
Wrap messages about completion of operation in box |
|
|
Line 7312 ADDMETA
|
Line 7322 ADDMETA
|
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
.'<link rel="stylesheet" type="text/css" href="'.$url.'" />' |
.$inhibitprint |
.$inhibitprint |
.$head_extra; |
.$head_extra; |
|
if ($env{'browser.mobile'}) { |
|
$result .= ' |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
|
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
|
} |
return $result.'</head>'; |
return $result.'</head>'; |
} |
} |
|
|
Line 7645 var modalWindow = {
|
Line 7660 var modalWindow = {
|
$(".LCmodal-overlay").click(function(){modalWindow.close();}); |
$(".LCmodal-overlay").click(function(){modalWindow.close();}); |
} |
} |
}; |
}; |
var openMyModal = function(source,width,height,scrolling) |
var openMyModal = function(source,width,height,scrolling,transparency,style) |
{ |
{ |
modalWindow.windowId = "myModal"; |
modalWindow.windowId = "myModal"; |
modalWindow.width = width; |
modalWindow.width = width; |
modalWindow.height = height; |
modalWindow.height = height; |
modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='true' src='" + source + "'></iframe>"; |
modalWindow.content = "<iframe width='"+width+"' height='"+height+"' frameborder='0' scrolling='"+scrolling+"' allowtransparency='"+transparency+"' src='" + source + "' style='"+style+"'></iframe>"; |
modalWindow.open(); |
modalWindow.open(); |
}; |
}; |
// END LON-CAPA Internal --> |
// END LON-CAPA Internal --> |
Line 7660 ENDMODAL
|
Line 7675 ENDMODAL
|
} |
} |
|
|
sub modal_link { |
sub modal_link { |
my ($link,$linktext,$width,$height,$target,$scrolling,$title)=@_; |
my ($link,$linktext,$width,$height,$target,$scrolling,$title,$transparency,$style)=@_; |
unless ($width) { $width=480; } |
unless ($width) { $width=480; } |
unless ($height) { $height=400; } |
unless ($height) { $height=400; } |
unless ($scrolling) { $scrolling='yes'; } |
unless ($scrolling) { $scrolling='yes'; } |
|
unless ($transparency) { $transparency='true'; } |
|
|
my $target_attr; |
my $target_attr; |
if (defined($target)) { |
if (defined($target)) { |
$target_attr = 'target="'.$target.'"'; |
$target_attr = 'target="'.$target.'"'; |
} |
} |
return <<"ENDLINK"; |
return <<"ENDLINK"; |
<a href="$link" $target_attr title="$title" onclick="javascript:openMyModal('$link',$width,$height,'$scrolling'); return false;"> |
<a href="$link" $target_attr title="$title" onclick="javascript:openMyModal('$link',$width,$height,'$scrolling','$transparency','$style'); return false;"> |
$linktext</a> |
$linktext</a> |
ENDLINK |
ENDLINK |
} |
} |
Line 7696 sub modal_adhoc_inner {
|
Line 7713 sub modal_adhoc_inner {
|
my ($funcname,$width,$height,$content)=@_; |
my ($funcname,$width,$height,$content)=@_; |
my $innerwidth=$width-20; |
my $innerwidth=$width-20; |
$content=&js_ready( |
$content=&js_ready( |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
&start_page('Dialog',undef,{'only_body'=>1,'bgcolor'=>'#FFFFFF'}). |
&start_scrollbox($width.'px',$innerwidth.'px',$height.'px'). |
&start_scrollbox($width.'px',$innerwidth.'px',$height.'px','myModal','#FFFFFF',undef,1). |
$content. |
$content. |
&end_scrollbox(). |
&end_scrollbox(). |
&end_page() |
&end_page() |
); |
); |
return &modal_adhoc_script($funcname,$width,$height,$content); |
return &modal_adhoc_script($funcname,$width,$height,$content); |
} |
} |
Line 7917 sub validate_page {
|
Line 7934 sub validate_page {
|
|
|
|
|
sub start_scrollbox { |
sub start_scrollbox { |
my ($outerwidth,$width,$height,$id,$bgcolor)=@_; |
my ($outerwidth,$width,$height,$id,$bgcolor,$cursor,$needjsready) = @_; |
unless ($outerwidth) { $outerwidth='520px'; } |
unless ($outerwidth) { $outerwidth='520px'; } |
unless ($width) { $width='500px'; } |
unless ($width) { $width='500px'; } |
unless ($height) { $height='200px'; } |
unless ($height) { $height='200px'; } |
my ($table_id,$div_id,$tdcol); |
my ($table_id,$div_id,$tdcol); |
if ($id ne '') { |
if ($id ne '') { |
$table_id = " id='table_$id'"; |
$table_id = ' id="table_'.$id.'"'; |
$div_id = " id='div_$id'"; |
$div_id = ' id="div_'.$id.'"'; |
} |
} |
if ($bgcolor ne '') { |
if ($bgcolor ne '') { |
$tdcol = "background-color: $bgcolor;"; |
$tdcol = "background-color: $bgcolor;"; |
} |
} |
|
my $nicescroll_js; |
|
if ($env{'browser.mobile'}) { |
|
$nicescroll_js = &nicescroll_javascript('div_'.$id,$cursor,$needjsready); |
|
} |
return <<"END"; |
return <<"END"; |
<table style="width: $outerwidth; border: 1px solid none;"$table_id><tr><td style="width: $width;$tdcol"><div style="overflow:auto; width:$width; height: $height;"$div_id> |
$nicescroll_js |
|
|
|
<table style="width: $outerwidth; border: 1px solid none;"$table_id><tr><td style="width: $width;$tdcol"> |
|
<div style="overflow:auto; width:$width; height:$height;"$div_id> |
END |
END |
} |
} |
|
|
Line 7938 sub end_scrollbox {
|
Line 7962 sub end_scrollbox {
|
return '</div></td></tr></table>'; |
return '</div></td></tr></table>'; |
} |
} |
|
|
|
sub nicescroll_javascript { |
|
my ($id,$cursor,$needjsready,$framecheck,$location) = @_; |
|
my %options; |
|
if (ref($cursor) eq 'HASH') { |
|
%options = %{$cursor}; |
|
} |
|
unless ($options{'railalign'} =~ /^left|right$/) { |
|
$options{'railalign'} = 'left'; |
|
} |
|
unless ($options{'cursorcolor'} =~ /^\#\w+$/) { |
|
my $function = &get_users_function(); |
|
$options{'cursorcolor'} = &designparm($function.'.sidebg',$env{'request.role.domain'}); |
|
unless ($options{'cursorcolor'} =~ /^\#\w+$/) { |
|
$options{'cursorcolor'} = '#00F'; |
|
} |
|
} |
|
if ($options{'cursoropacity'} =~ /^[\d.]+$/) { |
|
unless ($options{'cursoropacity'} >= 0.0 && $options{'cursoropacity'} <=1.0) { |
|
$options{'cursoropacity'}='1.0'; |
|
} |
|
} else { |
|
$options{'cursoropacity'}='1.0'; |
|
} |
|
if ($options{'cursorfixedheight'} eq 'none') { |
|
delete($options{'cursorfixedheight'}); |
|
} else { |
|
unless ($options{'cursorfixedheight'} =~ /^\d+$/) { $options{'cursorfixedheight'}='50'; } |
|
} |
|
unless ($options{'railoffset'} =~ /^{[\w\:\d\-,]+}$/) { |
|
delete($options{'railoffset'}); |
|
} |
|
my @niceoptions; |
|
while (my($key,$value) = each(%options)) { |
|
if ($value =~ /^\{.+\}$/) { |
|
push(@niceoptions,$key.':'.$value); |
|
} else { |
|
push(@niceoptions,$key.':"'.$value.'"'); |
|
} |
|
} |
|
my $nicescroll_js = ' |
|
$(document).ready( |
|
function() { |
|
$("#'.$id.'").niceScroll({'.join(',',@niceoptions).'}); |
|
} |
|
); |
|
'; |
|
if ($framecheck) { |
|
$nicescroll_js .= ' |
|
function expand_div(caller) { |
|
if (top === self) { |
|
document.getElementById("'.$id.'").style.width = "auto"; |
|
document.getElementById("'.$id.'").style.height = "auto"; |
|
} else { |
|
try { |
|
if (parent.frames) { |
|
if (parent.frames.length > 1) { |
|
var framesrc = parent.frames[1].location.href; |
|
var currsrc = framesrc.replace(/\#.*$/,""); |
|
if ((caller == "search") || (currsrc == "'.$location.'")) { |
|
document.getElementById("'.$id.'").style.width = "auto"; |
|
document.getElementById("'.$id.'").style.height = "auto"; |
|
} |
|
} |
|
} |
|
} catch (e) { |
|
return; |
|
} |
|
} |
|
return; |
|
} |
|
'; |
|
} |
|
if ($needjsready) { |
|
$nicescroll_js = ' |
|
<script type="text/javascript">'."\n".$nicescroll_js."\n</script>\n"; |
|
} else { |
|
$nicescroll_js = &Apache::lonhtmlcommon::scripttag($nicescroll_js); |
|
} |
|
return $nicescroll_js; |
|
} |
|
|
sub simple_error_page { |
sub simple_error_page { |
my ($r,$title,$msg) = @_; |
my ($r,$title,$msg) = @_; |
my $page = |
my $page = |
Line 8568 Incoming parameters:
|
Line 8673 Incoming parameters:
|
1. user's username |
1. user's username |
2. user's domain |
2. user's domain |
3. quota name - portfolio, author, or course |
3. quota name - portfolio, author, or course |
(if no quota name provided, defaults to portfolio). |
(if no quota name provided, defaults to portfolio). |
|
4. crstype - official, unofficial or community, if quota name is |
|
course |
|
|
Returns: |
Returns: |
1. Disk quota (in Mb) assigned to student. |
1. Disk quota (in Mb) assigned to student. |
Line 8590 defined for the user's institutional sta
|
Line 8697 defined for the user's institutional sta
|
|
|
|
|
sub get_user_quota { |
sub get_user_quota { |
my ($uname,$udom,$quotaname) = @_; |
my ($uname,$udom,$quotaname,$crstype) = @_; |
my ($quota,$quotatype,$settingstatus,$defquota); |
my ($quota,$quotatype,$settingstatus,$defquota); |
if (!defined($udom)) { |
if (!defined($udom)) { |
$udom = $env{'user.domain'}; |
$udom = $env{'user.domain'}; |
Line 8641 sub get_user_quota {
|
Line 8748 sub get_user_quota {
|
if ($quota eq '' || wantarray) { |
if ($quota eq '' || wantarray) { |
if ($quotaname eq 'course') { |
if ($quotaname eq 'course') { |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
$defquota = $domdefs{'uploadquota'}; |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || ($crstype eq 'community')) { |
|
$defquota = $domdefs{$crstype.'quota'}; |
|
} |
|
if ($defquota eq '') { |
|
$defquota = 500; |
|
} |
} else { |
} else { |
($defquota,$settingstatus) = &default_quota($udom,$inststatus,$quotaname); |
($defquota,$settingstatus) = &default_quota($udom,$inststatus,$quotaname); |
} |
} |
Line 8670 Retrieves default quota assigned for sto
|
Line 8782 Retrieves default quota assigned for sto
|
given an (optional) user's institutional status. |
given an (optional) user's institutional status. |
|
|
Incoming parameters: |
Incoming parameters: |
|
|
1. domain |
1. domain |
2. (Optional) institutional status(es). This is a : separated list of |
2. (Optional) institutional status(es). This is a : separated list of |
status types (e.g., faculty, staff, student etc.) |
status types (e.g., faculty, staff, student etc.) |
Line 8680 Incoming parameters:
|
Line 8793 Incoming parameters:
|
(if no quota name provided, defaults to portfolio). |
(if no quota name provided, defaults to portfolio). |
|
|
Returns: |
Returns: |
|
|
1. Default disk quota (in Mb) for user portfolios in the domain. |
1. Default disk quota (in Mb) for user portfolios in the domain. |
2. (Optional) institutional type which determined the value of the |
2. (Optional) institutional type which determined the value of the |
default quota. |
default quota. |
Line 8693 If the user's status includes multiple t
|
Line 8807 If the user's status includes multiple t
|
the largest default quota which applies to the user determines the |
the largest default quota which applies to the user determines the |
default quota returned. |
default quota returned. |
|
|
=back |
|
|
|
=cut |
=cut |
|
|
############################################### |
############################################### |
Line 8743 sub default_quota {
|
Line 8855 sub default_quota {
|
$defquota = $quotahash{'quotas'}{'default'}; |
$defquota = $quotahash{'quotas'}{'default'}; |
} |
} |
$settingstatus = 'default'; |
$settingstatus = 'default'; |
|
if ($defquota eq '') { |
|
if ($quotaname eq 'author') { |
|
$defquota = 500; |
|
} |
|
} |
} |
} |
} else { |
} else { |
$settingstatus = 'default'; |
$settingstatus = 'default'; |
Line 8763 sub default_quota {
|
Line 8880 sub default_quota {
|
|
|
=pod |
=pod |
|
|
=item * &excess_filesize_authorspace() |
=item * &excess_filesize_warning() |
|
|
Returns warning message if upload of file to authoring space, or copying |
Returns warning message if upload of file to authoring space, or copying |
of existing file within authoring space will cause quota to be exceeded. |
of existing file within authoring space will cause quota for the authoring |
|
space to be exceeded. |
|
|
|
Same, if upload of a file directly to a course/community via Course Editor |
|
will cause quota for uploaded content for the course to be exceeded. |
|
|
Inputs: 6 |
Inputs: 6 |
1. username |
1. username or coursenum |
2. domain |
2. domain |
3. directory path for top level of current authoring space |
3. context ('author' or 'course') |
4. filename of file for which action is being requested |
4. filename of file for which action is being requested |
5. filesize (kB) of file |
5. filesize (kB) of file |
6. action being taken: copy or upload. |
6. action being taken: copy or upload. |
|
|
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
otherwise return null. |
otherwise return null. |
|
|
|
=back |
|
|
=cut |
=cut |
|
|
sub excess_filesize_authorspace { |
sub excess_filesize_warning { |
my ($uname,$udom,$authorspace,$filename,$filesize,$action) = @_; |
my ($uname,$udom,$context,$filename,$filesize,$action) = @_; |
my $disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author'); #expressed in MB |
my $current_disk_usage = 0; |
|
my $disk_quota = &get_user_quota($uname,$udom,$context); #expressed in MB |
|
if ($context eq 'author') { |
|
my $authorspace = $Apache::lonnet::perlvar{'lonDocRoot'}."/priv/$udom/$uname"; |
|
$current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$authorspace); |
|
} else { |
|
foreach my $subdir ('docs','supplemental') { |
|
$current_disk_usage += &Apache::lonnet::diskusage($udom,$uname,"userfiles/$subdir",1); |
|
} |
|
} |
$disk_quota = int($disk_quota * 1000); |
$disk_quota = int($disk_quota * 1000); |
my $current_disk_usage = &Apache::lonnet::diskusage($udom,$uname,$authorspace); |
|
if (($current_disk_usage + $filesize) > $disk_quota) { |
if (($current_disk_usage + $filesize) > $disk_quota) { |
return '<p><span class="LC_warning">'. |
return '<p><span class="LC_warning">'. |
&mt("Unable to $action [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.", |
&mt("Unable to $action [_1]. (size = [_2] kilobytes). Disk quota will be exceeded.", |
Line 8800 sub excess_filesize_authorspace {
|
Line 8931 sub excess_filesize_authorspace {
|
############################################### |
############################################### |
|
|
|
|
|
|
|
|
sub get_secgrprole_info { |
sub get_secgrprole_info { |
my ($cdom,$cnum,$needroles,$type) = @_; |
my ($cdom,$cnum,$needroles,$type) = @_; |
my %sections_count = &get_sections($cdom,$cnum); |
my %sections_count = &get_sections($cdom,$cnum); |
Line 9728 sub ask_for_embedded_content {
|
Line 9861 sub ask_for_embedded_content {
|
$embed_file = $file; |
$embed_file = $file; |
} |
} |
my $absolutepath; |
my $absolutepath; |
if ($embed_file =~ m{^\w+://}) { |
my $cleaned_file = &clean_path($embed_file); |
$newfiles{$embed_file} = 1; |
if ($cleaned_file =~ m{^\w+://}) { |
$mapping{$embed_file} = $embed_file; |
$newfiles{$cleaned_file} = 1; |
|
$mapping{$cleaned_file} = $embed_file; |
} else { |
} else { |
if ($embed_file =~ m{^/}) { |
if ($embed_file =~ m{^/}) { |
$absolutepath = $embed_file; |
$absolutepath = $embed_file; |
$embed_file =~ s{^(/+)}{}; |
|
} |
} |
if ($embed_file =~ m{/}) { |
if ($cleaned_file =~ m{/}) { |
my ($path,$fname) = ($embed_file =~ m{^(.+)/([^/]*)$}); |
my ($path,$fname) = ($cleaned_file =~ m{^(.+)/([^/]*)$}); |
$path = &check_for_traversal($path,$url,$toplevel); |
$path = &check_for_traversal($path,$url,$toplevel); |
my $item = $fname; |
my $item = $fname; |
if ($path ne '') { |
if ($path ne '') { |
Line 9754 sub ask_for_embedded_content {
|
Line 9887 sub ask_for_embedded_content {
|
} else { |
} else { |
$dependencies{$embed_file} = 1; |
$dependencies{$embed_file} = 1; |
if ($absolutepath) { |
if ($absolutepath) { |
$mapping{$embed_file} = $absolutepath; |
$mapping{$cleaned_file} = $absolutepath; |
} else { |
} else { |
$mapping{$embed_file} = $embed_file; |
$mapping{$cleaned_file} = $embed_file; |
} |
} |
} |
} |
} |
} |
Line 10130 sub ask_for_embedded_content {
|
Line 10263 sub ask_for_embedded_content {
|
return ($output,$counter,$numpathchg); |
return ($output,$counter,$numpathchg); |
} |
} |
|
|
|
=pod |
|
|
|
=item * clean_path($name) |
|
|
|
Performs clean-up of directories, subdirectories and filename in an |
|
embedded object, referenced in an HTML file which is being uploaded |
|
to a course or portfolio, where |
|
"Upload embedded images/multimedia files if HTML file" checkbox was |
|
checked. |
|
|
|
Clean-up is similar to replacements in lonnet::clean_filename() |
|
except each / between sub-directory and next level is preserved. |
|
|
|
=cut |
|
|
|
sub clean_path { |
|
my ($embed_file) = @_; |
|
$embed_file =~s{^/+}{}; |
|
my @contents; |
|
if ($embed_file =~ m{/}) { |
|
@contents = split(/\//,$embed_file); |
|
} else { |
|
@contents = ($embed_file); |
|
} |
|
my $lastidx = scalar(@contents)-1; |
|
for (my $i=0; $i<=$lastidx; $i++) { |
|
$contents[$i]=~s{\\}{/}g; |
|
$contents[$i]=~s/\s+/\_/g; |
|
$contents[$i]=~s{[^/\w\.\-]}{}g; |
|
if ($i == $lastidx) { |
|
$contents[$i]=~s/\.(\d+)(?=\.)/_$1/g; |
|
} |
|
} |
|
if ($lastidx > 0) { |
|
return join('/',@contents); |
|
} else { |
|
return $contents[0]; |
|
} |
|
} |
|
|
sub embedded_file_element { |
sub embedded_file_element { |
my ($context,$num,$embed_file,$mapping,$allfiles,$codebase,$type) = @_; |
my ($context,$num,$embed_file,$mapping,$allfiles,$codebase,$type) = @_; |
return unless ((ref($mapping) eq 'HASH') && (ref($allfiles) eq 'HASH') && |
return unless ((ref($mapping) eq 'HASH') && (ref($allfiles) eq 'HASH') && |
Line 10518 sub modify_html_refs {
|
Line 10691 sub modify_html_refs {
|
my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); |
$count += $numchg; |
$count += $numchg; |
$allfiles{$newname} = $allfiles{$ref}; |
$allfiles{$newname} = $allfiles{$ref}; |
|
delete($allfiles{$ref}); |
} |
} |
if ($env{'form.embedded_codebase_'.$i} ne '') { |
if ($env{'form.embedded_codebase_'.$i} ne '') { |
$codebase = &unescape($env{'form.embedded_codebase_'.$i}); |
$codebase = &unescape($env{'form.embedded_codebase_'.$i}); |
Line 12973 sub restore_settings {
|
Line 13147 sub restore_settings {
|
|
|
=item * &build_recipient_list() |
=item * &build_recipient_list() |
|
|
Build recipient lists for five types of e-mail: |
Build recipient lists for following types of e-mail: |
(a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors |
(a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors |
(d) Help requests, (e) Course requests needing approval, generated by |
(d) Help requests, (e) Course requests needing approval, (f) loncapa |
lonerrorhandler.pm, CHECKRPMS, loncron, lonsupportreq.pm and |
module change checking, student/employee ID conflict checks, as |
loncoursequeueadmin.pm respectively. |
generated by lonerrorhandler.pm, CHECKRPMS, loncron, |
|
lonsupportreq.pm, loncoursequeueadmin.pm, searchcat.pl respectively. |
|
|
Inputs: |
Inputs: |
defmail (scalar - email address of default recipient), |
defmail (scalar - email address of default recipient), |
mailing type (scalar - errormail, packagesmail, or helpdeskmail), |
mailing type (scalar: errormail, packagesmail, helpdeskmail, |
|
requestsmail, updatesmail, or idconflictsmail). |
|
|
defdom (domain for which to retrieve configuration settings), |
defdom (domain for which to retrieve configuration settings), |
|
|
origmail (scalar - email address of recipient from loncapa.conf, |
origmail (scalar - email address of recipient from loncapa.conf, |
i.e., predates configuration by DC via domainprefs.pm |
i.e., predates configuration by DC via domainprefs.pm |
|
|
Line 13360 sub assign_category_rows {
|
Line 13538 sub assign_category_rows {
|
if (ref($cats->[$depth]{$parent}) eq 'ARRAY') { |
if (ref($cats->[$depth]{$parent}) eq 'ARRAY') { |
my $numchildren = @{$cats->[$depth]{$parent}}; |
my $numchildren = @{$cats->[$depth]{$parent}}; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
$text .= '<td><table class="LC_datatable">'; |
$text .= '<td><table class="LC_data_table">'; |
for (my $j=0; $j<$numchildren; $j++) { |
for (my $j=0; $j<$numchildren; $j++) { |
$name = $cats->[$depth]{$parent}[$j]; |
$name = $cats->[$depth]{$parent}[$j]; |
$item = &escape($name).':'.&escape($parent).':'.$depth; |
$item = &escape($name).':'.&escape($parent).':'.$depth; |
Line 14158 sub init_user_environment {
|
Line 14336 sub init_user_environment {
|
# ------------------------------------ Check browser type and MathML capability |
# ------------------------------------ Check browser type and MathML capability |
|
|
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
my ($httpbrowser,$clientbrowser,$clientversion,$clientmathml, |
$clientunicode,$clientos) = &decode_user_agent($r); |
$clientunicode,$clientos,$clientmobile,$clientinfo) = &decode_user_agent($r); |
|
|
# ------------------------------------------------------------- Get environment |
# ------------------------------------------------------------- Get environment |
|
|
Line 14189 sub init_user_environment {
|
Line 14367 sub init_user_environment {
|
"browser.mathml" => $clientmathml, |
"browser.mathml" => $clientmathml, |
"browser.unicode" => $clientunicode, |
"browser.unicode" => $clientunicode, |
"browser.os" => $clientos, |
"browser.os" => $clientos, |
|
"browser.mobile" => $clientmobile, |
|
"browser.info" => $clientinfo, |
"server.domain" => $Apache::lonnet::perlvar{'lonDefDomain'}, |
"server.domain" => $Apache::lonnet::perlvar{'lonDefDomain'}, |
"request.course.fn" => '', |
"request.course.fn" => '', |
"request.course.uri" => '', |
"request.course.uri" => '', |
Line 14441 sub parse_supplemental_title {
|
Line 14621 sub parse_supplemental_title {
|
return $title; |
return $title; |
} |
} |
|
|
|
sub recurse_supplemental { |
|
my ($cnum,$cdom,$suppmap,$numfiles,$errors) = @_; |
|
if ($suppmap) { |
|
my ($errtext,$fatal) = &LONCAPA::map::mapread('/uploaded/'.$cdom.'/'.$cnum.'/'.$suppmap); |
|
if ($fatal) { |
|
$errors ++; |
|
} else { |
|
if ($#LONCAPA::map::resources > 0) { |
|
foreach my $res (@LONCAPA::map::resources) { |
|
my ($title,$src,$ext,$type,$status)=split(/\:/,$res); |
|
if (($src ne '') && ($status eq 'res')) { |
|
if ($src =~ m{^\Q/uploaded/$cdom/$cnum/\E(supplemental_\d+\.sequence)$}) { |
|
($numfiles,$errors) = &recurse_supplemental($cnum,$cdom,$1,$numfiles,$errors); |
|
} else { |
|
$numfiles ++; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return ($numfiles,$errors); |
|
} |
|
|
sub symb_to_docspath { |
sub symb_to_docspath { |
my ($symb) = @_; |
my ($symb) = @_; |
return unless ($symb); |
return unless ($symb); |
Line 14470 sub symb_to_docspath {
|
Line 14674 sub symb_to_docspath {
|
my $thistitle = $res->title(); |
my $thistitle = $res->title(); |
$path .= '&'. |
$path .= '&'. |
&Apache::lonhtmlcommon::entity_encode($thisurl).'&'. |
&Apache::lonhtmlcommon::entity_encode($thisurl).'&'. |
&Apache::lonhtmlcommon::entity_encode($thistitle). |
&escape($thistitle). |
':'.$res->randompick(). |
':'.$res->randompick(). |
':'.$res->randomout(). |
':'.$res->randomout(). |
':'.$res->encrypted(). |
':'.$res->encrypted(). |
Line 14486 sub symb_to_docspath {
|
Line 14690 sub symb_to_docspath {
|
} |
} |
$path .= (($path ne '')? '&' : ''). |
$path .= (($path ne '')? '&' : ''). |
&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
&Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
&Apache::lonhtmlcommon::entity_encode($maptitle). |
&escape($maptitle). |
':'.$mapresobj->randompick(). |
':'.$mapresobj->randompick(). |
':'.$mapresobj->randomout(). |
':'.$mapresobj->randomout(). |
':'.$mapresobj->encrypted(). |
':'.$mapresobj->encrypted(). |
Line 14499 sub symb_to_docspath {
|
Line 14703 sub symb_to_docspath {
|
$maptitle = 'Main Content'; |
$maptitle = 'Main Content'; |
} |
} |
$path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
$path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'. |
&Apache::lonhtmlcommon::entity_encode($maptitle).':::::'.$ispage; |
&escape($maptitle).':::::'.$ispage; |
} |
} |
unless ($mapurl eq 'default') { |
unless ($mapurl eq 'default') { |
$path = 'default&'. |
$path = 'default&'. |
&Apache::lonhtmlcommon::entity_encode('Main Content'). |
&escape('Main Content'). |
':::::&'.$path; |
':::::&'.$path; |
} |
} |
return $path; |
return $path; |