--- loncom/xml/londefdef.pm 2011/07/21 03:31:16 1.431 +++ loncom/xml/londefdef.pm 2016/08/13 19:39:40 1.462 @@ -1,8 +1,7 @@ - # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.431 2011/07/21 03:31:16 raeburn Exp $ +# $Id: londefdef.pm,v 1.462 2016/08/13 19:39:40 raeburn Exp $ # # # Copyright Michigan State University Board of Trustees @@ -56,7 +55,7 @@ use LONCAPA(); BEGIN { - &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput')); + &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','style','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput')); } @@ -93,6 +92,14 @@ sub start_m { my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); if ($target eq 'web' || $target eq 'analyze') { &Apache::lonxml::debug("M is starting with:$inside:"); + if (!($inside =~ /^\s*\$.*\$\s*$/ || $inside =~ /^\s*\\[([].*\\[)\]]\s*$/)) { + # Non-math LaTeX will not be rendered correctly with MathJax + # and it should be avoided anyway. + # On top of that, MathJax will render math without $, but + # it will fail with tth. This is worth a warning. + # (even though some people might just use latex for printing) + &Apache::lonxml::warning(&mt("Missing \$ in <m>.")); + } my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); if ($eval eq 'on') { $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); @@ -459,6 +466,32 @@ sub insert_meta { '; } +#-- tag +sub start_style { + my ($target, $token, $tagstack, $parstack, $parser, $safeeval, $style) = @_; + my $currentstring = ''; + + if ($target eq 'tex') { + Apache::lonxml::startredirection(); + } else { + $currentstring = $token->[4]; + } + + return $currentstring; +} + +sub end_style { + my ($target, $token, $tagstack, $parstack, $parser, $safeeval) = @_; + my $currentstring = ''; + + if ($target eq 'tex') { + Apache::lonxml::endredirection(); + } else { + $currentstring = $token->[2]; + } + return $currentstring; +} + # accessrule sub start_accessrule { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_; @@ -545,9 +578,10 @@ sub start_body { # Breadcrumbs &Apache::lonhtmlcommon::clear_breadcrumbs(); if ($env{'request.state'} eq 'construct') { + my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'}); &Apache::lonhtmlcommon::add_breadcrumb({ - 'text' => 'Construction Space', - 'href' => &Apache::loncommon::authorspace(), + 'text' => 'Authoring Space', + 'href' => &Apache::loncommon::authorspace($url), }); &Apache::lonhtmlcommon::add_breadcrumb({ 'text' => 'HTML Editor', @@ -559,26 +593,34 @@ sub start_body { # FIXME Where are we? } + my $args = {'add_entries' => $token->[2], + 'force_register' => 1,}; + if ($target eq 'web') { + $args->{'print_suppress'} = 1; + if ($env{'request.use_absolute'}) { + $args->{'use_absolute'} = $env{'request.use_absolute'}; + } + } $currentstring = &Apache::loncommon::start_page($Apache::londefdef::title, $Apache::londefdef::head - .$extra_head, - {'add_entries' => $token->[2], -# 'no_title' => 1, - 'force_register' => 1}); - + .$extra_head,$args); my $header = ''; if ($env{'request.state'} ne 'published' && $env{'request.state'} ne 'construct') { $header=&Apache::lonmenu::constspaceform(); } if ($env{'request.state'} ne 'published') { - $header.=&Apache::londefdef::edit_controls(); + unless ($env{'form.inhibitmenu'} eq 'yes') { + $header.=&edit_controls(); + } } if ($env{'request.state'} eq 'construct') { - $currentstring.=&Apache::loncommon::head_subbox( - &Apache::loncommon::CSTR_pageheader() - .$header); + unless ($env{'form.inhibitmenu'} eq 'yes') { + $currentstring.=&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader() + .$header); + } } elsif ($env{'request.state'} eq 'edit') { $currentstring.=&Apache::loncommon::head_subbox($header); } @@ -604,13 +646,46 @@ sub edit_controls { } $result .= '
'; + if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) { + my $uri = $env{'request.uri'}; + my $daxeurl = '/daxepage'.$uri; + $result .= ''; + } if (($env{'request.course.id'}) && ($env{'form.forceedit'})) { - my $viewtext = &mt('Course View'); - if (&Apache::loncommon::course_type() eq 'Community') { - $viewtext = &mt('Community View'); + my $url=&Apache::lonnet::hreflocation('',$env{'request.filename'}); + if ($url =~ /\.html?$/i) { + my ($cdom,$cnum); + if ($env{'request.course.id'}) { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'request.filename'} =~ m{/userfiles/supplemental/default|\d+/}) { + if (&Apache::lonnet::is_course_upload($env{'request.filename'}, + $cnum,$cdom)) { + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['folderpath','title']); + } + } + } + my ($symb,$itemtitle,$displayfile,$caller); + if ($url =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}) { + $itemtitle = &mt('Syllabus'); + $caller = "/public/$cdom/$cnum/syllabus"; + } else { + $caller = $url; + ($symb,$itemtitle,$displayfile) = + &Apache::lonxml::get_courseupload_hierarchy($url, + $env{'form.folderpath'}, + $env{'form.title'}); + } + if (($symb ne '') || ($env{'httpref.'.$url} ne '') || + ($url =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/})) { + $result .= (' ' x 3). + &Apache::lonhtmlcommon::dependencies_button()."\n". + &Apache::lonhtmlcommon::dependencycheck_js($symb, + $itemtitle,$url,$env{'form.folderpath'},$caller)."\n"; + } } - $result .= (' ' x 3).''; } $result .= '
@@ -1671,6 +1746,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|supplemental)/)}) { + my $cleanhref = &clean_docs_httpref($linkurl,$url,$cdom,$cnum); + if ($cleanhref) { + &Apache::lonxml::extlink($cleanhref); + } + } } } } @@ -1993,8 +2077,8 @@ sub end_dt { sub item_cleanup { my $item=&Apache::lonxml::endredirection(); - $item=~s/\\begin{center}//g; - $item=~s/\\end{center}//g; + $item=~s/\\begin\{center}//g; + $item=~s/\\end\{center}//g; return $item; } @@ -2048,9 +2132,6 @@ sub start_table { } elsif ($target eq 'tex') { &disable_para(); # Can't have paras in a table. - - # New table code: - # Get the parameters that we can do something about: my $border = &Apache::lonxml::get_param('border', $parstack, $safeeval, undef, 0); @@ -2071,7 +2152,6 @@ sub start_table { $table->cell_border(1); # Default for rules is all if rules not defined. } } - # Only all or nothing for cell borders for now: if ((defined $cell_border)) { if ($cell_border eq 'all') { @@ -2687,7 +2767,9 @@ sub start_img { my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style); return ''; } - &Apache::lonxml::extlink($src); + unless ($src =~ m{^data\:image/gif;base64,}) { + &Apache::lonxml::extlink($src); + } my $currentstring = ''; my $scaling = .3; @@ -2697,8 +2779,10 @@ sub start_img { my $enc = ('yes' eq lc(&Apache::lonxml::get_param('encrypturl',$parstack, $safeeval))); - $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src}, - $enc); + unless ($src =~ m{^data\:image/gif;base64,}) { + $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src}, + $enc); + } # and render unto TeX that which is LaTeX } elsif ($target eq 'tex') { @@ -2741,7 +2825,7 @@ sub start_img { # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src"); - #if original bmp/gif/jpg/png file exist do following: + #if original bmp/gif/jpg/png/svg file exist do following: my $origsrc=$src; my ($path,$file) = &get_eps_image($src); # &Apache::lonnet::logthis("Image source: $src result: $path $file"); @@ -2788,8 +2872,8 @@ sub start_img { my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures')); $currentstring .=&Apache::edit::tag_start($target,$token); $currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70). - &Apache::edit::browse('src',undef,'alt',$only).' '. - &Apache::edit::search('src',undef,'alt').'
'; + &Apache::edit::browse_or_search('src',undef,'alt',$only,undef,1). + '
'; $currentstring .=&Apache::edit::text_arg('Description:','alt',$token,70).'
'; $currentstring .=&Apache::edit::text_arg('width (pixel):','width',$token,5); $currentstring .=&Apache::edit::text_arg('height (pixel):','height',$token,5).'
'; @@ -2811,17 +2895,19 @@ sub start_img { my $src= &Apache::lonxml::get_param('src',$parstack,$safeeval); my $width= &Apache::lonxml::get_param('width',$parstack,$safeeval); my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval); - + my $element = &Apache::edit::get_element('src'); + my $text; if ($token->[2]{'src'}=~/\$/) { - $currentstring.=&mt('Variable image source'); + $text = &mt('Variable image source'); } elsif ($token->[2]{'src'}=~/\S/) { $currentstring .= ''.$alt.''; } else { - $currentstring.=&mt("No image source specified"); + $text = &mt("No image source specified"); } + $currentstring .= ' '.$text.''; } elsif ($target eq 'modified') { my ($osrc,$owidth,$oheight)= ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'}); @@ -2889,10 +2975,7 @@ sub start_applet { &Apache::lonxml::extlink($archive); my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { - $currentstring = &Apache::lonenc::encrypt_ref($token, - {'code'=>$code, - 'archive'=>$archive} - ); + $currentstring = $token->[4]; } elsif ($target eq 'tex') { # Turn off some stuff we can't be inside thank you LaTeX @@ -2978,22 +3061,47 @@ sub end_embed { #-- tag (end tag forbidden) sub start_param { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; - if (&Apache::lonxml::get_param('name',$parstack, - $safeeval,undef,1)=~/^cabbase$/i) { + my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval, + undef,1); + if ($name =~/^cabbase$/i) { my $value=&Apache::lonxml::get_param('value',$parstack, $safeeval,undef,1); &Apache::lonxml::extlink($value); - } - + } elsif ($name eq 'flashvars') { + if (lc(&Apache::lonxml::get_param('type',$parstack,$safeeval,-2,1)) + eq 'application/x-shockwave-flash') { + my $launcher = + &Apache::lonxml::get_param('data',$parstack,$safeeval,-2,1); + if ($launcher) { + &Apache::lonxml::extlink($launcher); + } + my $flashvars=&Apache::lonxml::get_param('value',$parstack, + $safeeval,undef,1); + if ($flashvars ne '') { + foreach my $item (split(/\&/,$flashvars)) { + my ($key,$value)=split(/=/,$item,2); + if ($key eq 'content') { + if ($value ne '') { + my ($dir) = ($launcher =~ m{(.+/)[^/]+$}); + &Apache::lonxml::extlink($dir.$value); + } + } elsif ($key eq 'thumb') { + if ($value ne '') { + &Apache::lonxml::extlink($value); + } + } + } + } + } + } my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); - &Apache::lonxml::extlink($src); + if ($src ne '') { + &Apache::lonxml::extlink($src); + } my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { my %toconvert; - my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); if ($src) { $toconvert{'src'}= $src; } - my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval, - undef,1); if ($name=~/^cabbase$/i) { $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack, $safeeval,undef,1); @@ -3358,7 +3466,7 @@ sub start_caption { my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[4]; - } + } return $currentstring; } @@ -3366,7 +3474,7 @@ sub end_caption { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { - $currentstring = $token->[2]; + $currentstring = $token->[2]; } return $currentstring; } @@ -3499,8 +3607,68 @@ sub start_iframe { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { - $currentstring = $token->[4]; - } + my ($src,$url,$query); + if ($token->[2]->{'src'}) { + $src = $token->[2]->{'src'}; + } elsif ($token->[2]->{'SRC'}) { + $src = $token->[2]->{'SRC'}; + } + if ($src) { + ($url,$query) = ($src =~ /^([^?]+)\??([^?]*)$/); + if ($query =~ /inhibitmenu=yes/) { + $currentstring = $token->[4]; + } else { + my $inhibit; + if ($url =~ m{^[^/.].*\.x?html?$}) { + $inhibit = 1; + } elsif ($url =~ m{^/(uploaded|res)/.*\.x?html?$}) { + $inhibit = 1; + } + if ($inhibit) { + $currentstring = '