--- loncom/interface/lonsyllabus.pm 2013/04/24 02:43:59 1.117
+++ loncom/interface/lonsyllabus.pm 2024/01/25 22:23:32 1.155
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Syllabus
#
-# $Id: lonsyllabus.pm,v 1.117 2013/04/24 02:43:59 raeburn Exp $
+# $Id: lonsyllabus.pm,v 1.155 2024/01/25 22:23:32 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -35,10 +35,12 @@ use Apache::loncommon;
use Apache::lonnet;
use Apache::lontexconvert;
use Apache::lonfeedback;
+use Apache::lonhtmlgateway;
use Apache::lonannounce;
use Apache::lonlocal;
use Apache::lonhtmlcommon;
use Apache::lonspeller();
+use Apache::lonwrapper();
use HTML::Entities();
sub handler {
@@ -53,7 +55,7 @@ sub handler {
# ------------------------------------------------------------ Get query string
&Apache::loncommon::get_unprocessed_cgi
($ENV{'QUERY_STRING'},['register','forceedit','todocs',
- 'folderpath','title']);
+ 'folderpath','title','only_body']);
# ----------------------------------------------------- Is this even a course?
my $homeserver=&Apache::lonnet::homeserver($cnum,$cdom);
if ($homeserver eq 'no_host') {
@@ -71,12 +73,7 @@ sub handler {
}
# ------------------------------------- There is such a course, get environment
my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum);
-
-# ------------------------------------------------------------ Print the screen
-
- if ($target eq 'tex') {
- $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}));
- }
+ my $crstype = &Apache::loncommon::course_type();
# --------------------------------------------------------------- Force Student
my ($forceedit,$forcestudent);
@@ -100,31 +97,76 @@ sub handler {
# -------------------------------------------------- Let's see who handles this
my $external=$courseenv{'externalsyllabus'};
my $uploaded=$courseenv{'uploadedsyllabus'};
+ my $minimal=$courseenv{'minimalsyllabus'};
- if ($uploaded =~/\w/) {
- if ($external =~ m{\Q$uploaded\E$}) {
- undef($external);
+ if (($minimal =~/\w/) || ($uploaded =~/\w/)) {
+ my ($item,$is_pdf);
+ if ($minimal =~/\w/) {
+ if ($external =~ m{\Q$minimal\E$}) {
+ undef($external);
+ }
+ $item = $minimal;
+ } elsif ($uploaded =~/\w/) {
+ if ($external =~ m{\Q$uploaded\E$}) {
+ undef($external);
+ }
+ $item = $uploaded;
+ if ($item =~ /\.pdf$/i) {
+ $is_pdf = 1;
+ }
}
unless ($allowed && $forceedit) {
- my $file=&Apache::lonnet::filelocation("",$uploaded);
- if ($file =~ /\.(sty|css|js|txt|tex|html?)$/) {
- my $filetype;
- if ($file =~ /\.(sty|css|js|txt|tex)$/) {
- $filetype=$1;
- } else {
- $filetype='html';
- }
- my $result = '';
+ my $file=&Apache::lonnet::filelocation("",$item);
+ if ($file =~ /\.(tex|x?html?)$/) {
+ my $filetype = $1;
my $filecontents=&Apache::lonnet::getfile($file);
if ($filecontents eq -1) {
$r->print(&mt('Syllabus file unavailable'));
- } elsif ($filetype eq 'html') {
+ } elsif ($filetype eq 'tex') {
+ if ($target eq 'tex') {
+ $r->print($filecontents);
+ } else {
+ my $texengine = $env{'form.texengine'};
+ if ($texengine eq '') {
+ $texengine = 'tth';
+ } elsif (lc($texengine) eq 'jsmath') {
+ $texengine = 'MathJax';
+ }
+ my $result = &Apache::lontexconvert::converted(\$filecontents,$texengine);
+ my %args;
+ &get_breadcrumbs($cdom,$cnum,$crstype,\%args);
+ if ($env{'form.only_body'}) {
+ $args{'only_body'} = 1;
+ }
+ if ($env{'request.use_absolute'}) {
+ $args{'use_absolute'} = $env{'request.use_absolute'};
+ }
+ $r->print(&Apache::loncommon::start_page("Syllabus",undef,\%args).
+ $result.
+ &Apache::loncommon::end_page());
+ }
+ } else {
my %mystyle;
+ unless ($target eq 'tex') {
+ $target = 'web';
+ }
&Apache::structuretags::reset_problem_globals();
my $oldfile = $env{'request.filename'};
- $env{'request.filename'} = $uploaded;
- $result = &Apache::lonxml::xmlparse($r,'web',$filecontents,
- '',%mystyle);
+ $env{'request.filename'} = $item;
+ my $oldinhibit;
+ if ($env{'form.only_body'}) {
+ $oldinhibit = $env{'form.inhibitmenu'};
+ $env{'form.inhibitmenu'} = 'yes';
+ }
+ my $result = &Apache::lonxml::xmlparse($r,$target,$filecontents,
+ '',%mystyle);
+ if ($env{'form.only_body'}) {
+ if ($oldinhibit ne '') {
+ $env{'form.inhibitmenu'} = $oldinhibit;
+ } else {
+ delete($env{'form.inhibitmenu'});
+ }
+ }
&Apache::structuretags::reset_problem_globals();
&Apache::lonhomework::finished_parsing();
$env{'request.filename'} = $oldfile;
@@ -132,17 +174,73 @@ sub handler {
$r->print($result);
}
} else {
- $r->print(&Apache::lonwrapper::wrapper($uploaded));
+ if ($target eq 'tex') {
+ $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}).
+ ' \strut \\\\ \textbf{'.&mt('Syllabus').'} \strut \\\\ '.
+ &mt('Unsupported file type.').' \strut \\\\ '.
+ &mt('Print the syllabus directly from your web browser').
+ '\end{document}');
+ } else {
+ my $brcrum;
+ if ($env{'form.folderpath'} =~ /^supplemental/) {
+ &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom);
+ my $title = $env{'form.title'};
+ if ($title eq '') {
+ $title = &mt('Syllabus');
+ }
+ $brcrum =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
+ }
+ $r->print(&Apache::lonwrapper::wrapper($r,$item,$brcrum,$env{'request.use_absolute'},
+ undef,$is_pdf,undef,'','',&mt('Syllabus')));
+ }
}
return OK;
}
} elsif ($external=~/\w/) {
unless ($allowed && $forceedit) {
- $r->print(&Apache::lonwrapper::wrapper($external));
+ if (($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public') &&
+ ($ENV{'SERVER_PORT'} == 443) && ($external =~ m{^http://}) && !($env{'form.usehttp'})) {
+ my $hostname = $r->hostname();
+ unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) {
+ &redirect_to_http($r);
+ return OK;
+ }
+ }
+ if ($target eq 'tex') {
+ $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}).
+ ' \strut \\\\ \textbf{'.&mt('Syllabus').'} \strut \\\\ '.$external.' '.
+ ' \strut \\\\ '.&mt('Print the syllabus directly from your web browser').
+ '\end{document}');
+ } else {
+ my $is_ext = 1;
+ my ($is_pdf,$brcrum);
+ if ($external =~ /\.pdf$/i) {
+ $is_pdf = 1;
+ }
+ if ($env{'form.folderpath'} =~ /^supplemental/) {
+ &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom);
+ my $title = $env{'form.title'};
+ if ($title eq '') {
+ $title = &mt('Syllabus');
+ }
+ $title = &HTML::Entities::encode($title,'\'"<>&');
+ $brcrum =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
+ }
+ $r->print(&Apache::lonwrapper::wrapper($r,$external,$brcrum,$env{'request.use_absolute'},
+ $is_ext,$is_pdf,undef,'','',&mt('Syllabus')));
+ }
return OK;
}
}
+# ------------------------------------------------------------ Print the screen
+
+ if ($target eq 'tex') {
+ $r->print(&Apache::lonprintout::print_latex_header($env{'form.latex_type'}));
+ }
+
# ------------------------------ The buck stops here: internal syllabus display
# --------------------------------------------------------- The syllabus fields
my %syllabusfields=&Apache::lonlocal::texthash(
@@ -161,353 +259,65 @@ sub handler {
'jjj_weblinks' => 'Web Links',
'kkk_textbook' => 'Textbook',
'lll_includeurl' => 'URLs To Include in Syllabus');
-# ----------------------------------------------------------------- Make header
- if ($target ne 'tex') {
- my $rss_link = &Apache::lonrss::rss_link($cnum,$cdom);
- my $js;
- if ($env{'form.backto'} eq 'coursecatalog') {
- $js .= <<"ENDSCRIPT";
-
-
-
-ENDSCRIPT
- }
- if ($allowed && $forceedit) {
- my $check_uncheck = &Apache::loncommon::check_uncheck_jscript();
- my $invurl = &mt('Invalid URL');
- my $urlregexp = <<'ENDREGEXP';
-/^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
-ENDREGEXP
-
- $js .= <<"ENDSCRIPT";
-
-
-
-ENDSCRIPT
- }
- my $args = {'function' => undef,
- 'domain' => $cdom};
- my $forcereg;
- if ($env{'form.register'}) {
- $forcereg = 1;
- $args->{'force_register'} = $forcereg;
- }
- if ($env{'form.backto'} eq 'coursecatalog') {
- &Apache::lonhtmlcommon::clear_breadcrumbs();
- my $brcrum = [{href=>"javascript:ToCatalog();",
- text=>&mt('Course/Community Catalog'),
- no_mt=>1}
- ];
- if ($env{'form.coursenum'} ne '') {
- push(@{$brcrum},
- {href=>"javascript:ToCatalog('details')",
- text=>"Course details"});
- }
- push(@{$brcrum},
- {href=>$r->uri,
- text=>"Course syllabus"});
- $args->{'bread_crumbs'} = $brcrum;
- } elsif ($env{'form.folderpath'} =~ /^supplemental/) {
- my $crstype = &Apache::loncommon::course_type();
- my $title = $env{'form.title'};
- if ($title eq '') {
- $title = &mt('Syllabus');
- }
- my $brcrum =
- &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
- if (ref($brcrum) eq 'ARRAY') {
- $args->{'bread_crumbs'} = $brcrum;
- }
- }
- my $start_page =
- &Apache::loncommon::start_page("Syllabus", $rss_link.$js,$args);
- $r->print($start_page);
- }
# ---------------------------------------------------------- Load syllabus info
my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum);
- my %displayfields;
+ my ($output,%displayfields,%noshow);
# This handler might be called anonymously ...
# ----------------------------------------------------- Only if not public call
if ($allowed) {
-#store what the user typed in to the template
- if ($env{'form.storesyl'}) {
- foreach my $syl_field (keys(%syllabusfields)) {
- my $field=$env{'form.'.$syl_field};
- chomp($field);
- $field=~s/\s+$//s;
- $field=~s/^\s+//s;
- $field=~s/\
$//s;
- $field=&Apache::lonfeedback::clear_out_html($field,1);
- #here it will be stored
- $syllabus{$syl_field}=$field;
- if ($syl_field eq 'lll_includeurl') { # clean up included URLs
- my $field='';
- foreach my $value (split(/\n/,$syllabus{$syl_field})) {
- my $url=$value;
-# get rid of leading and trailing spaces
- $url=~s/^\s+//;
- $url=~s/\s+$//;
- if ($url=~m|^https?\://([^/]+)/(.+)$|) {
- my $host = $1;
- my $remainder=$2;
-# remove the hostname from internal URLs
- my $hostname = &Apache::lonnet::hostname($host);
- my %all_hostnames = &Apache::lonnet::all_hostnames();
- foreach my $possible_host (keys(%all_hostnames)) {
- if ($possible_host =~ /\Q$hostname\E/i) {
- $url=$remainder;
- }
- }
- }
-# norm internal URLs
- unless ($url=~/^https?\:/) {
- $url=&Apache::lonnet::clutter($url);
- }
-# re-assemble field
- if ($url) {
- $field.=$url."\n";
- }
- }
- $syllabus{$syl_field}=$field;
+ if (($env{'form.choice'} =~ /^(template|minimal|url|file)$/) ||
+ ($env{'form.phase'} =~ /^(upload|check)_embedded$/)) {
+ my $earlyout;
+ ($earlyout,$uploaded,$external,$minimal,$output) =
+ &save_changes($cnum,$cdom,$uploaded,$external,$minimal,
+ \%syllabus,\%syllabusfields,\%courseenv);
+ if (($env{'form.choice'} eq 'minimal') &&
+ ($minimal eq "/uploaded/$cdom/$cnum/portfolio/syllabus/loncapa.html")) {
+ delete($env{'form.symb'});
+ delete($env{'request.symb'});
+ $r->internal_redirect("$minimal?editmode=1&forceedit=1");
+ return OK;
+ }
+ if ($earlyout) {
+ if ($target ne 'tex') {
+ &print_header($r,$cnum,$cdom,$crstype,$allowed,$forceedit,
+ \%syllabus,\%syllabusfields);
+ $r->print($output.
+ &Apache::loncommon::end_page());
}
+ return OK;
}
- $syllabus{'uploaded.domain'}=$env{'user.domain'};
- $syllabus{'uploaded.name'}=$env{'user.name'};
- $syllabus{'uploaded.lastmodified'}=time;
- &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum);
- my %storehash;
- if ($courseenv{'uploadedsyllabus'}) {
- &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.uploadedsyllabus');
- $storehash{'uploadedsyllabus'} = '';
- }
- if ($courseenv{'externalsyllabus'}) {
- &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.externalsyllabus');
- $storehash{'externalsyllabus'} = '';
- }
- if ($courseenv{'externalsyllabus'} || $courseenv{'uploadedsyllabus'}) {
- &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum);
- undef($uploaded);
- undef($external);
+ }
+ }
+ if ($target ne 'tex') {
+ &print_header($r,$cnum,$cdom,$crstype,$allowed,$forceedit,\%syllabus,
+ \%syllabusfields);
+ $r->print($output);
+ }
+
+# -------------------------------------------- Determine which fields are shown
+
+ if ($syllabus{'uploaded.fields'}) {
+ if ($syllabus{'uploaded.fields'} eq 'none') {
+ foreach my $field (keys(%syllabusfields)) {
+ $displayfields{$field} = ' style="display:none;"';
+ $noshow{$field} = 1;
}
- } elsif ($env{'form.storeurl'}) {
- if ($env{'form.externalsyllabus'} =~ m{^https?://}) {
- if ($env{'form.externalsyllabus'} eq $external) {
- $r->print('
' - .&mt('This syllabus can be publicly viewed at [_1]' - ,''.$protocol.'://'.&Apache::lonnet::hostname($homeserver).$r->uri.'') - .' '.&Apache::loncommon::help_open_topic('Syllabus_ExtLink') - .'
' - .''. + &mt('All feeds currently hidden'). + $msg. + '
'); + } else { + $r->print(''. + &mt('No current feeds'). + $msg. + '
'); + } + $rsslinktext = &mt('Manage Course RSS Feeds/Blogs'); + if ($crstype eq 'Community') { + $rsslinktext = &mt('Manage Community RSS Feeds/Blogs'); + } + } my $editurl= &Apache::lonnet::absolute_url().'/adm/'.$cdom.'/'.$cnum.'/_rss.html'; - $r->print( ''.&mt('New RSS Feed or Blog').''); + $r->print( ''.$rsslinktext.''); &Apache::lontemplate::print_end_template($r); } else { - unless ($syllabus{'000_showrssfeeds'} eq 'no') { - if (&Apache::lonrss::advertisefeeds($cnum,$cdom) ne '') { + unless ($hidefeeds) { + my $feeds = &Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit); + if ($feeds ne '') { &Apache::lontemplate::print_start_template($r,&mt('RSS Feeds and Blogs'),'LC_Box'); - $r->print(&Apache::lonrss::advertisefeeds($cnum,$cdom,$forceedit)); + $r->print($feeds); &Apache::lontemplate::print_end_template($r); } } @@ -663,11 +489,6 @@ ENDSCRIPT } # ---------------------------------------------------------------- Get syllabus if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { - if ($allowed) { - $r->print(''. + $r->print('