# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
# $Id: structuretags.pm,v 1.439 2009/03/09 21:24:12 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
###
=pod
=head1 NAME
Apache::structuretags
=head1 SYNOPSIS
This is part of the LearningOnline Network with CAPA project
described at http://www.lon-capa.org.
=head1 NOTABLE SUBROUTINES
=over
=item
=back
=cut
package Apache::structuretags;
use strict;
use Apache::lonnet;
use Apache::File();
use Apache::lonmenu;
use Apache::lonlocal;
use Apache::lonxml;
use Apache::londefdef;
use Apache::lonenc();
use Time::HiRes qw( gettimeofday tv_interval );
use lib '/home/httpd/lib/perl/';
use LONCAPA;
BEGIN {
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));
}
sub start_web {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
if ($target ne 'edit' && $target ne 'modified') {
my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);
if ($target eq 'web' || $target eq 'webgrade') {
return $bodytext;
}
} elsif ($target eq "edit" ) {
my $bodytext =
&Apache::lonxml::get_all_text_unbalanced("/web",$parser);
my $result = &Apache::edit::tag_start($target,$token);
$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
return $result;
} elsif ( $target eq "modified" ) {
return $token->[4].&Apache::edit::modifiedfield("/web",$parser);
}
return '';
}
sub end_web {
return '';
}
sub start_tex {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
if ($target ne 'edit' && $target ne 'modified') {
my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);
if ($target eq 'tex') {
# If inside a table, occurrences of \\ must be removed;
# else the table blows up.
if (&Apache::londefdef::is_inside_of($tagstack, "table")) {
$bodytext =~ s/\\\\//g;
}
return $bodytext.'{}';
}
} elsif ($target eq "edit" ) {
my $bodytext =
&Apache::lonxml::get_all_text_unbalanced("/tex",$parser);
my $result = &Apache::edit::tag_start($target,$token);
$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
return $result;
} elsif ( $target eq "modified" ) {
return $token->[4].&Apache::edit::modifiedfield("/tex",$parser);
}
return $result;;
}
sub end_tex {
return '';
}
sub homework_js {
return &Apache::loncommon::resize_textarea_js().
&setmode_javascript().
<<'JS';
JS
}
sub setmode_javascript {
return <<"ENDSCRIPT";
ENDSCRIPT
}
sub page_start {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
$extra_head)=@_;
my %found;
foreach my $taginside (@$tagstack) {
foreach my $taglookedfor ('html','body','form') {
if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
}
}
if ($target eq 'tex') {
return
&Apache::londefdef::start_html($target,$token,$tagstack,
$parstack,$parser,$safeeval);
}
$extra_head .= &homework_js();
if ($env{'environment.wysiwygeditor'} eq 'on') {
$extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup");
} else {
$extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
}
my %body_args;
if (defined($found{'html'})) {
$body_args{'skip_phases'}{'head'}=1;
} else {
$extra_head .= &Apache::lonhtmlcommon::spellheader();
$extra_head .= &Apache::londefdef::generate_css_links();
if ($env{'request.state'} eq 'construct') {
$extra_head.=&Apache::edit::js_change_detection().
"\n";
}
}
if (defined($found{'body'})) {
$body_args{'skip_phases'}{'body'}=1;
} elsif (!defined($found{'body'})
&& $env{'request.state'} eq 'construct') {
if ($target eq 'web' || $target eq 'edit') {
if ($env{'environment.remote'} ne 'off') {
$body_args{'only_body'} = 1;
}
}
} elsif (!defined($found{'body'})) {
my %add_entries;
my $background=&Apache::lonxml::get_param('background',$parstack,
$safeeval);
if ($background ne '' ) {
$add_entries{'background'} = $background;
}
my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
$safeeval);
if ($bgcolor eq '' ) { $bgcolor = '#FFFFFF'; }
$body_args{'bgcolor'} = $bgcolor;
$body_args{'no_title'} = 1;
$body_args{'force_register'} = 1;
$body_args{'add_entries'} = \%add_entries;
if ($env{'environment.remote'} eq 'off'
&& $env{'request.state'} eq 'construct') {
$body_args{'only_body'} = 1;
}
}
$body_args{'no_auto_mt_title'} = 1;
my $page_start = &Apache::loncommon::start_page($name,$extra_head,
\%body_args);
if (!defined($found{'body'})
&& $env{'request.state'} ne 'construct'
&& ($target eq 'web' || $target eq 'webgrade')) {
my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
if ($symb eq '' && !$publicuser) {
my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
$help=&mt("Browsing resource, all submissions are temporary.")."
";
$page_start .= $help;
}
}
if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {
$page_start .= &Apache::lonxml::message_location();
}
my $form_tag_start;
if (!defined($found{'form'})) {
$form_tag_start='