--- loncom/xml/londefdef.pm 2013/09/22 15:35:45 1.446 +++ loncom/xml/londefdef.pm 2013/10/14 17:11:18 1.450 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.446 2013/09/22 15:35:45 raeburn Exp $ +# $Id: londefdef.pm,v 1.450 2013/10/14 17:11:18 raeburn Exp $ # # # Copyright Michigan State University Board of Trustees @@ -1728,6 +1728,15 @@ sub start_a { if (!&Apache::lonnet::allowed('bre',$linkurl)) { if (&Apache::lonnet::is_on_map($url)) { &Apache::lonxml::extlink($linkurl); + } elsif ($env{'request.course.id'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($linkurl =~ m{^([^/]|/uploaded/$cdom/$cnum/docs/)}) { + my $cleanhref = &clean_docs_httpref($linkurl,$url,$cdom,$cnum); + if ($cleanhref) { + &Apache::lonxml::extlink($cleanhref); + } + } } } } @@ -3606,11 +3615,32 @@ sub start_iframe { } } $currentstring =~ s/\s+$//; - $currentstring .= '>'; + if ($token->[4] =~ m{/>$}) { + $currentstring .= ' />'; + } else { + $currentstring .= '>'; + } } else { $currentstring = $token->[4]; } } + if (($url !~ m{^https?://}) && ($env{'request.course.id'})) { + my $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'}); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($url =~ m{^([^/]|/uploaded/)}) { + my $cleanhref = &clean_docs_httpref($url,$docuri,$cdom,$cnum); + if ($cleanhref) { + &Apache::lonxml::extlink($cleanhref); + } + } elsif (($url =~ m{/res/$LONCAPA::domain_re/}) && ($docuri =~ m{^\Q/uploaded/$cdom/$cnum/docs/\E})) { + if (!&Apache::lonnet::allowed('bre',$url)) { + if (&Apache::lonnet::is_on_map($url)) { + &Apache::lonxml::extlink($url); + } + } + } + } } else { $currentstring = $token->[4]; } @@ -4562,6 +4592,62 @@ sub latex_header { } +sub clean_docs_httpref { + my ($href,$docuri,$cdom,$cnum) = @_; + if ($docuri eq '') { + $docuri = &Apache::lonnet::hreflocation('',$env{'request.filename'}); + } + if ($cdom eq '') { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } + if ($cnum eq '') { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + my $cleanhref; + if ($docuri =~ m{^(\Q/uploaded/$cdom/$cnum/docs/\E)(.+/)[^/]+$}) { + my $prefix = $1; + my $relpath = $2; + my ($hrefpath,$fname); + if ($href =~ m{^/}) { + if ($href =~ m{^\Q$prefix\E(.+/)([^/]+)$}) { + $hrefpath = $1; + $fname = $2; + } else { + return $cleanhref; + } + } else { + if ($href =~ m{/}) { + (my $path,$fname) = ($href =~ m{^(.*)/([^/]*)$}); + $hrefpath = $relpath.$path; + if ($path eq '') { + $hrefpath =~ s{/$}{}; + } + } else { + $fname = $href; + $hrefpath = $relpath; + $hrefpath =~ s{/$}{}; + } + } + if ($fname ne '') { + my $cleanrelpath; + foreach my $dir (split(/\//,$hrefpath)) { + next if ($dir eq '.'); + if ($dir eq '..') { + $cleanrelpath =~ s{([^/]+/)$}{}; + } else { + $cleanrelpath .= $dir.'/'; + } + } + if ($cleanrelpath ne '') { + $cleanhref = $prefix.$cleanrelpath.$fname; + } else { + $cleanhref = $prefix.$fname; + } + } + } + return $cleanhref; +} + =pod =head1 NAME @@ -4656,7 +4742,22 @@ described at http://www.lon-capa.org. I'm in a table.... } - +=item clean_docs_httpref($href,$docuri,$cdom,$cnum) + HTML pages uploaded to a course which contain dependencies either from iframes, + javascript files or objects (FlashPlayerSwf, MediaSrc, XMPSrc, ConfigurationSrc, + and PosterImageSrc) for which dependency is another file uploaded to the same + course. + + Required input: + href - dependency (either a relative URL, or an absolute URL) + Optional inputs: + docuri - URL of HTML page containing the dependency + cdom - Course domain + cnum - CourseID + + Output: + returns an absolute URL constructed from the href provided, and the calling context. + (this will be null, if the URL does not begin: /uploaded/$cdom/$cnum/docs/). =back