tag (end tag required)
@@ -633,12 +729,12 @@ sub start_center {
my ($target,$token,$tagstack) = @_;
my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} elsif ($target eq 'tex') {
if (&is_inside_of($tagstack, "table")) {
$currentstring .= ¢er_correction();
}
- $currentstring .= '\begin{center}';
+ $currentstring .= '\begin{center}';
}
return $currentstring;
}
@@ -647,9 +743,9 @@ sub end_center {
my ($target,$token,$tagstack) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = '\end{center}';
+ $currentstring = '\end{center}';
if (&is_inside_of($tagstack, "table")) {
$currentstring .= ¢er_end_correction();
}
@@ -663,11 +759,11 @@ sub start_b {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
&disable_para();
- $currentstring .= '\textbf{';
- }
+ $currentstring .= '\textbf{';
+ }
return $currentstring;
}
@@ -675,11 +771,11 @@ sub end_b {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
&enable_para();
$currentstring = '}';
- }
+ }
return $currentstring;
}
@@ -689,11 +785,11 @@ sub start_strong {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
&disable_para();
- $currentstring = '\textbf{';
- }
+ $currentstring = '\textbf{';
+ }
return $currentstring;
}
@@ -701,10 +797,10 @@ sub end_strong {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
&enable_para();
- $currentstring = '}';
+ $currentstring = '}';
}
return $currentstring;
}
@@ -727,7 +823,7 @@ sub start_h1 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
} elsif ($target eq 'meta') {
$currentstring.='';
&start_output($target);
@@ -742,7 +838,7 @@ sub end_h1 {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
my $post='\vskip 0 mm ';
- my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
+ my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
@@ -754,7 +850,7 @@ sub end_h1 {
} elsif ($target eq 'meta') {
&end_output($target);
$currentstring='';
- }
+ }
return $currentstring;
}
@@ -776,8 +872,8 @@ sub start_h2 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
@@ -797,7 +893,7 @@ sub end_h2 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -819,8 +915,8 @@ sub start_h3 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
@@ -840,7 +936,7 @@ sub end_h3 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -862,8 +958,8 @@ sub start_h4 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
@@ -883,7 +979,7 @@ sub end_h4 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -905,8 +1001,8 @@ sub start_h5 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
@@ -926,7 +1022,7 @@ sub end_h5 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -948,8 +1044,8 @@ sub start_h6 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
@@ -969,7 +1065,7 @@ sub end_h6 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -1015,7 +1111,7 @@ sub end_i {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1050,7 +1146,7 @@ sub start_dfn {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\textit{';
- }
+ }
return $currentstring;
}
@@ -1119,7 +1215,7 @@ sub start_code {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\texttt{';
- }
+ }
return $currentstring;
}
@@ -1130,7 +1226,7 @@ sub end_code {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1153,7 +1249,7 @@ sub end_em {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1176,7 +1272,7 @@ sub end_q {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1192,7 +1288,7 @@ sub end_q {
my $closing_string = ''; # String required to close
# Some tags are
fragile meaning that
inside of them
-# does not work within TeX mode. This is managed via the
+# does not work within TeX mode. This is managed via the
# counter below:
#
@@ -1221,6 +1317,10 @@ sub start_p {
$currentstring .= &end_p(); # close off prior para if in progress.
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
+ if (!defined $align) {
+ # check inline CSS
+ $align = &get_css_property('text-align',$parstack,$safeeval);
+ }
if ($align eq 'center') {
$currentstring .='\begin{center}\par ';
$closing_string = '\end{center}';
@@ -1228,13 +1328,13 @@ sub start_p {
$currentstring = ¢er_correction().$currentstring;
}
} elsif ($align eq 'right') {
- $currentstring.="\n".'{\flushright ';
+ $currentstring.="\n".'\begin{flushright}';
# $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
- $closing_string= "}\n";
+ $closing_string= '\end{flushright}'."\n";
} elsif ($align eq 'left') {
- $currentstring.= "\n".'{\flushleft ';
+ $currentstring.= "\n".'\begin{flushleft}';
# $currentstring.='\noindent\makebox['.$env{'form.textwidth'}.']{{';
- $closing_string = "}\n";
+ $closing_string = '\end{flushleft}'."\n";
} else {
$currentstring.='\par ';
if (&is_inside_of($tagstack, 'table')) {
@@ -1288,7 +1388,7 @@ sub start_br {
if ($signal != 1) {
$currentstring .= '\strut \\\\ \strut ';
}
-
+
}
return $currentstring;
}
@@ -1310,7 +1410,7 @@ sub start_big {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '{\large ';
- }
+ }
return $currentstring;
}
@@ -1353,7 +1453,7 @@ sub start_basefont {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $basesize) {
@@ -1367,7 +1467,7 @@ sub end_basefont {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $basesize) {
@@ -1383,7 +1483,7 @@ sub start_font {
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $fontsize) {
@@ -1397,7 +1497,7 @@ sub end_font {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $fontsize) {
@@ -1406,7 +1506,7 @@ sub end_font {
}
return $currentstring;
}
-
+
#-- tag (end tag required)
sub start_strike {
my ($target,$token) = @_;
@@ -1415,7 +1515,7 @@ sub start_strike {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
@@ -1426,8 +1526,8 @@ sub end_strike {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring=&Apache::lonxml::endredirection();
- $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
- $currentstring=~s/^\s*(\S)/\\underline\{$1/;
+ $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
+ $currentstring=~s/^\s*(\S)/\\underline\{$1/;
$currentstring=~s/(\S)\s*$/$1\}/;
}
return $currentstring;
@@ -1441,7 +1541,7 @@ sub start_s {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
@@ -1467,7 +1567,7 @@ sub start_sub {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\raisebox{-\smallskipamount}{\scriptsize{';
- }
+ }
return $currentstring;
}
@@ -1490,7 +1590,7 @@ sub start_sup {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\raisebox{\smallskipamount}{\scriptsize{';
- }
+ }
return $currentstring;
}
@@ -1514,7 +1614,7 @@ sub start_hr {
} elsif ($target eq 'tex') {
#
can't be inside of thank you LaTeX.
- #
+ #
my $restart_sub = 0;
my $restart_sup = 0;
@@ -1524,7 +1624,7 @@ sub start_hr {
if (&is_inside_of($tagstack, "sub")) {
$restart_sub = 1;
- $currentstring .= &end_sub($target, $token, $tagstack,
+ $currentstring .= &end_sub($target, $token, $tagstack,
$parstack, $parser, $safeeval);
}
if (&is_inside_of($tagstack, "sup")) {
@@ -1563,7 +1663,7 @@ sub start_hr {
$currentstring .= &start_sup($target, $token, $tagstack,
$parstack, $parser, $safeeval);
}
- }
+ }
return $currentstring;
}
@@ -1590,12 +1690,12 @@ sub start_div {
my $currentstring = &end_p(); # Close enclosing para.
if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
- }
+ }
if ($target eq 'tex') {
# 4 possible alignments: left, right, center, and -missing-.
# If inside a table row, we must let the table logic
# do the alignment, however.
- #
+ #
my $endstring = '';
@@ -1606,7 +1706,7 @@ sub start_div {
$endstring = '\end{center}';
if (&is_inside_of($tagstack, "table")) {
$currentstring = ¢er_correction().$currentstring;
- $endstring .= ¢er_end_correction();
+ $endstring .= ¢er_end_correction();
}
}
elsif ($align eq 'right') {
@@ -1662,6 +1762,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);
+ }
+ }
}
}
}
@@ -1707,11 +1816,11 @@ sub start_li {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
my $value=&Apache::lonxml::get_param('value',$parstack,$safeeval,undef,0);
- #FIXME need to support types i and I
+ #FIXME need to support types i and I
if ($type=~/disc/) {
$currentstring .= ' \item[$\bullet$] ';
} elsif ($type=~/circle/) {
@@ -1728,7 +1837,7 @@ sub start_li {
$currentstring .= ' \item['.$value.'] ';
} else {
$currentstring .= ' \item ';
- }
+ }
$Apache::londefdef::list_index++;
}
return $currentstring;
@@ -1738,8 +1847,8 @@ sub end_li {
my ($target,$token) = @_;
my $currentstring = &end_p(); # In case there's a in the
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[2];
- }
+ $currentstring .= $token->[2];
+ }
return $currentstring;
}
@@ -1751,7 +1860,7 @@ sub start_u {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
@@ -1774,28 +1883,28 @@ sub start_ul {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = &end_p(); # Close off enclosing list.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
$Apache::londefdef::list_index=0;
if ($TeXtype eq 'disc') {
$currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'.
- '\renewcommand{\labelitemii}{$\bullet$}'.
+ '\renewcommand{\labelitemii}{$\bullet$}'.
'\renewcommand{\labelitemiii}{$\bullet$}'.
'\renewcommand{\labelitemiv}{$\bullet$}';
} elsif ($TeXtype eq 'circle') {
$currentstring .= '\renewcommand{\labelitemi}{$\circ$}'.
- '\renewcommand{\labelitemii}{$\circ$}'.
+ '\renewcommand{\labelitemii}{$\circ$}'.
'\renewcommand{\labelitemiii}{$\circ$}'.
'\renewcommand{\labelitemiv}{$\circ$}';
} elsif ($TeXtype eq 'square') {
$currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'.
- '\renewcommand{\labelitemii}{$\diamond$}'.
+ '\renewcommand{\labelitemii}{$\diamond$}'.
'\renewcommand{\labelitemiii}{$\diamond$}'.
'\renewcommand{\labelitemiv}{$\diamond$}';
}
- $currentstring .= '\strut \begin{itemize}';
- }
+ $currentstring .= '\strut \begin{itemize}';
+ }
return $currentstring;
}
@@ -1803,13 +1912,13 @@ sub end_ul {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
$currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'.
- '\renewcommand{\labelitemii}{$\bullet$}'.
+ '\renewcommand{\labelitemii}{$\bullet$}'.
'\renewcommand{\labelitemiii}{$\bullet$}'.
- '\renewcommand{\labelitemiv}{$\bullet$}\strut ';
- }
+ '\renewcommand{\labelitemiv}{$\bullet$}\strut ';
+ }
return $currentstring;
}
@@ -1818,10 +1927,10 @@ sub start_menu {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
- $currentstring = " \\begin{itemize} ";
- }
+ $currentstring = " \\begin{itemize} ";
+ }
return $currentstring;
}
@@ -1829,10 +1938,10 @@ sub end_menu {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = " \\end{itemize}";
- }
+ $currentstring = " \\end{itemize}";
+ }
return $currentstring;
}
@@ -1841,10 +1950,10 @@ sub start_dir {
my ($target,$token) = @_;
my $currentstring = &end_p(); # In case there's a prior to the list.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} elsif ($target eq 'tex') {
- $currentstring .= " \\begin{itemize} ";
- }
+ $currentstring .= " \\begin{itemize} ";
+ }
return $currentstring;
}
@@ -1852,10 +1961,10 @@ sub end_dir {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = " \\end{itemize}";
- }
+ $currentstring = " \\end{itemize}";
+ }
return $currentstring;
}
@@ -1864,18 +1973,18 @@ sub start_ol {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = &end_p(); # In case there's a
prior to the list.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$Apache::londefdef::list_index=0;
my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
if ($type eq '1') {
$currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'.
- '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
+ '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
'\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
'\renewcommand{\labelenumiv}{\arabic{enumiv}.}';
} elsif ($type eq 'A') {
$currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'.
- '\renewcommand{\labelenumii}{\Alph{enumii}.}'.
+ '\renewcommand{\labelenumii}{\Alph{enumii}.}'.
'\renewcommand{\labelenumiii}{\Alph{enumiii}.}'.
'\renewcommand{\labelenumiv}{\Alph{enumiv}.}';
} elsif ($type eq 'a') {
@@ -1894,8 +2003,8 @@ sub start_ol {
'\renewcommand{\labelenumiii}{\Roman{enumiii}.}'.
'\renewcommand{\labelenumiv}{\Roman{enumiv}.}';
}
- $currentstring .= '\strut \begin{enumerate}';
- }
+ $currentstring .= '\strut \begin{enumerate}';
+ }
return $currentstring;
}
@@ -1903,13 +2012,13 @@ sub end_ol {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
$currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'.
'\renewcommand{\labelenumii}{\arabic{enumii}.}'.
'\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
- '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';
- }
+ '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';
+ }
return $currentstring;
}
@@ -1918,7 +2027,7 @@ sub start_dl {
my ($target,$token) = @_;
my $currentstring = &end_p(); # In case there's a
unclosed prior to the list.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\begin{description}';
$Apache::londefdef::DL++;
@@ -1926,7 +2035,7 @@ sub start_dl {
$Apache::londefdef::DD[$Apache::londefdef::DL]=0;
$Apache::londefdef::DT[$Apache::londefdef::DL]=0;
$Apache::londefdef::seenDT[$Apache::londefdef::DL]=0;
- }
+ }
return $currentstring;
}
@@ -1934,7 +2043,7 @@ sub end_dl {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
@@ -1942,12 +2051,12 @@ sub end_dl {
$currentstring.=' '.$element.' ';
}
pop(@Apache::londefdef::description);
- $currentstring.='\end{description}';
+ $currentstring.='\end{description}';
delete($Apache::londefdef::DD[$Apache::londefdef::DL]);
delete($Apache::londefdef::DT[$Apache::londefdef::DL]);
delete($Apache::londefdef::seenDT[$Apache::londefdef::DL]);
$Apache::londefdef::DL--;
- }
+ }
return $currentstring;
}
@@ -1956,14 +2065,14 @@ sub start_dt {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring='';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
&Apache::lonxml::startredirection();
$Apache::londefdef::DT[-1]++;
$Apache::londefdef::seenDT[-1]=1;
- }
+ }
return $currentstring;
}
@@ -1971,21 +2080,21 @@ sub end_dt {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
if ($Apache::londefdef::DT[-1]) {
my $data=&item_cleanup();
push(@{$Apache::londefdef::description[-1]},'\item['.$data.'] \strut \vskip 0mm');
$Apache::londefdef::DT[-1]--;
}
- }
+ }
return $currentstring;
}
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;
}
@@ -1994,7 +2103,7 @@ sub start_dd {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
if ($Apache::londefdef::DD[-1]) { &end_dd(@_);}
@@ -2005,7 +2114,7 @@ sub start_dd {
$Apache::londefdef::description[-1]->[-1].=' \strut ';
$Apache::londefdef::DD[-1]++;
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
@@ -2013,7 +2122,7 @@ sub end_dd {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
$Apache::londefdef::description[-1]->[-1].=
&Apache::lonxml::endredirection().' \vskip 0mm ';
@@ -2025,7 +2134,7 @@ sub end_dd {
#--
tag (end tag required)
# also ends any prior that is not closed.
# but, unless I allow
's to nest, that's the
-# only way I could think of to allow
in
+# only way I could think of to allow
in
#
bodies
#
#list of supported attributes: border,width,TeXwidth,TeXtheme
@@ -2035,13 +2144,10 @@ sub start_table {
my $textwidth = '';
my $currentstring = &end_p();
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[4];
+ $currentstring .= $token->[4];
} 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);
@@ -2058,15 +2164,23 @@ sub start_table {
if ((defined $border) && ($border > 0)) {
# &Apache::lonnet::logthis("Turning on table borders: $border");
$table->table_border(1);
- if ($cell_border ne 'none') {
- $table->cell_border(1); # html specs that border turns on both...unless rules='none'.
+ if (!defined $cell_border) {
+ $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) && ($cell_border ne 'none')) {
- # &Apache::lonnet::logthis("Turning on cell borders: $cell_border");
- $table->cell_border(1);
+ if ((defined $cell_border)) {
+ if ($cell_border eq 'all') {
+ $table->cell_border(1);
+ } elsif ($cell_border eq 'rows') {
+ $table->cell_border(2);
+ } elsif ($cell_border eq 'cols') {
+ $table->cell_border(3);
+ } elsif($cell_border eq 'groups') {
+ $table->cell_border(4);
+ } else {
+ $table->cell_border(0);
+ }
}
if (defined $theme) {
$table->theme($theme);
@@ -2095,529 +2209,25 @@ sub start_table {
push(@Apache::londefdef::table, $table);
$currentstring.=' \keephidden{NEW TABLE ENTRY}';
- #--------------------------------------------------------
- # Old table code here.
- #--------------------------------------------------------
-
-
- if (0) {
- push(@Apache::londefdef::table, {});
- $Apache::londefdef::table[-1]{'row_number'} = -1;
- #maximum table's width (default coincides with text line length)
- if ($#Apache::londefdef::table==0) {
- $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm
- $textwidth=~/(\d+\.?\d*)/;
- $textwidth=0.85*$1; #accounts "internal" LaTeX space for table frame
- } else {
- if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) {
- #the maximum width of nested table is determined by LATeX width of parent cell
- $textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}];
- } else {
- #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly
- $textwidth=$Apache::londefdef::table[-2]{'width'};
- for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {
- $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];
- }
- }
- }
-
- # width either comes forced from the TeXwidth or the width parameters.
- # in either case it can be a percentage or absolute width.
- # in the width case we ignore absolute width
- my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
- if (!defined($TeXwidth)) {
- my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,
- $safeeval,undef,1);
- if ($htmlwidth =~ /%/) {
- $TeXwidth = $htmlwidth;
- } else {
- $TeXwidth = $textwidth;
- }
- }
- # if the width is specified as a % it is converted to an absolute width.
- # otherwise.. just plugged right in the hash
-
- if ($TeXwidth=~/%/) {
- $TeXwidth=~/(\d+)/;
- $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
- } else {
- $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
- }
- # In the end, however the table width cannot be wider than $textwidth...
-
- if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {
- $Apache::londefdef::table[-1]{'width'} = $textwidth;
- }
- #table's border
- my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
- my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
- unless (defined $border) { $border = 0; }
- if ($border) {
- $Apache::londefdef::table[-1]{'hinc'} = '\hline ';
- $Apache::londefdef::table[-1]{'vinc'} = '&';
- $Apache::londefdef::table[-1]{'vvinc'} = '|';
- } else {
- $Apache::londefdef::table[-1]{'hinc'} = '';
- $Apache::londefdef::table[-1]{'vinc'} = '&';
- $Apache::londefdef::table[-1]{'vvinc'} = '';
- }
- if ($#Apache::londefdef::table==0) {
- # Note that \newline seems to destroy the alignment envs.
- # $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}';
- $Apache::londefdef::table[-1]{'output'}='\strut'.'\\\\'."\n".'\strut\setlength{\tabcolsep}{1 mm}';
- }
- $Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} ';
- $Apache::londefdef::table[-1]{'TeXlen'}=[];
- $Apache::londefdef::table[-1]{'objectlen'}=[];
- $Apache::londefdef::table[-1]{'objectsignal'}=[];
- $Apache::londefdef::table[-1]{'maxlen'}=[];
- $Apache::londefdef::table[-1]{'minlen'}=[];
- $Apache::londefdef::table[-1]{'content'}=[];
- $Apache::londefdef::table[-1]{'align'}=[];
- $currentstring.=' \keephidden{NEW TABLE ENTRY}';
- }
-
}
return $currentstring;
}
-
+
sub end_table {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
-
-
- # New table code:
-
+
+
my $table = pop(@Apache::londefdef::table);
my $t = $table->generate();
- &Apache::lonnet::logthis("Generating string");
+ # &Apache::lonnet::logthis("Generating string");
$currentstring = $t->generate_string();
- &Apache::lonnet::logthis("Generated: $currentstring");
+ # &Apache::lonnet::logthis("Generated: $currentstring");
&enable_para();
- #--------------------------------------------------------------
- # Old table code:
- #--------------------------------------------------------------
-
- if (0) {
-
- my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
- my $inmemory = '';
- my $output = '';
- my $WARNING='';
- #width of columns from TeXwidth attributes
-
- # Protect against unbalanced |
tag.
-
- if (scalar(@Apache::londefdef::table) > 0) {
-
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
- if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) {
- $Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]=$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn];
- }
- }
- }
- #free space and number of empty columns
- my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);
- if ($#Apache::londefdef::table ne 0) {$available_space=0.9*$available_space;}
- for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
- if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {
- $empty_columns++;
- } else {
- $available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn];
- }
- }
-
- #boundaries for contents columns
- my @min_len=();#columns can not be narrower
- my @max_len=();#maximum length of column
- my $avg_max;
- my $avg_min;
- my $counter_cols = $Apache::londefdef::table[-1]{'counter_columns'};
- for (my $jn=0;$jn<=$counter_cols; $jn++) {
- my ($localmin,$localmax)=(0,0);
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) {
- $localmin=$Apache::londefdef::table[-1]{'minlen'}[$in][$jn];
- }
- if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) {
- $localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn];
- }
- }
- push @min_len, $localmin;
- push @max_len, $localmax;
- $avg_max = $localmax + $avg_max;
- $avg_min = $localmin + $avg_min;
- }
- # Does not really matter what the average max/min are if there are no cols.
- # and this prevents div 0 in that case.
-
- if ($counter_cols != 0) {
- $avg_max = $avg_max/$counter_cols;
- $avg_min = $avg_min/$counter_cols;
- }
-
-
- # I don't think the below is needed.. but just in case:
-
- if ($avg_min > $avg_max) {
- my $temp = $avg_min;
- $avg_min = $avg_max;
- $avg_max = $temp;
- }
-
-
- for (my $jn=0;$jn<=$counter_cols;$jn++) {
- my $localmin=0,;
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {
- $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];
- }
- }
- if ($max_len[$jn]<$localmin) {
- $max_len[$jn]=$localmin;
- $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;
- }#object size is bigger
- if ($min_len[$jn]<$localmin) {
- $min_len[$jn]=$localmin;
- $Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;
- }#object size is bigger
- if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) {
- $min_len[$jn]=0;
- $max_len[$jn]=0;
- }
- # Spans seem to be really bothered by max/min = 0. So if we have one
- # make it an average joe max/min.
-
- if ($max_len[$jn] == 0) {
- $max_len[$jn] = $avg_max;
- }
- if ($min_len[$jn] == 0) {
- $min_len[$jn] = $avg_min;
- }
-
- }
- #final adjustment of column width
- my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array
- my @adjust=();
- #step 1. adjustment by maximum value
- my $space_needed=0;
- for (my $jn=0;$jn<=$#max_len;$jn++) {
- $space_needed=$space_needed+$max_len[$jn];
- }
- if ($space_needed<=$available_space) {
-
- for (my $jn=0;$jn<=$#max_len;$jn++) {
- if ($fwidth[$jn]==0) {
- $fwidth[$jn]=$max_len[$jn];
- }
- }
- } else {
- #step 2. adjustment by minimum value (estimation)
- $space_needed=0;
- for (my $jn=0;$jn<=$#min_len;$jn++) {
- $space_needed+=$min_len[$jn];
- }
- if ($space_needed>$available_space) {
- $WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';
- for (my $jn=0;$jn<=$#max_len;$jn++) {
- if ($fwidth[$jn]==0) {
- $fwidth[$jn]=$min_len[$jn];
- }
- }
- #check if we have objects which can be scaled
- my $how_many_to_scale=0;
- my @to_scale=();
- for (my $jn=0;$jn<=$#max_len;$jn++) {
- if ($Apache::londefdef::table[-1]{'objectsignal'}[$jn] eq '1') {
- $how_many_to_scale++;
- push @to_scale, $jn;
- }
- }
- if ($how_many_to_scale>0) {
- my $space_to_adjust=($space_needed-$available_space)/$how_many_to_scale;
- foreach my $jn (@to_scale) {
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/;
- if ($1 ne '') {
- my $current_length=&recalc($1);
- $current_length=~/(\d+\.?\d*)/;
- $current_length=$current_length-$space_to_adjust;
- $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/width=$current_length mm/;
- }
- $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/\[(\d+\.?\d*)\s*mm\]/;
- if ($1 ne '') {
- my $current_length=$1;
- $current_length=$current_length-$space_to_adjust;
- $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/\[(\d+\.?\d*)\s*mm\]/\[$current_length mm\]/;
- }
- }
- $fwidth[$jn]=$fwidth[$jn]-$space_to_adjust;
- }
- }
- } else {
- #step 3. adjustment over minimal + corrections
- my $enlarge_coef=$available_space/$space_needed;
- my $acsessive=0;
- for (my $jn=0;$jn<=$#min_len;$jn++) {
- $adjust[$jn]=$min_len[$jn]*$enlarge_coef;
- if ($adjust[$jn]>$max_len[$jn]) {
- $fwidth[$jn]=$max_len[$jn];
- $acsessive=$acsessive+$adjust[$jn]-$max_len[$jn];
- $adjust[$jn]=0;
-
- }
- }
- if ($acsessive>0) {
- #we have an excess of space and can redistribute it
- my $notempty_columns=0;
- for (my $jn=0;$jn<=$#min_len;$jn++) {
- if ($adjust[$jn]!=0) {
- $notempty_columns++;
- }
- }
- my $per_column=$acsessive/$notempty_columns;
- for (my $jn=0;$jn<=$#min_len;$jn++) {
- if ($adjust[$jn]!=0) {
- $adjust[$jn]+=$per_column;
- $fwidth[$jn]=$adjust[$jn];
- }
- }
- } else {
- for (my $jn=0;$jn<=$#min_len;$jn++) {
- $fwidth[$jn]=$adjust[$jn];
- }
- }
- }
- }
- # use all available width or specified width as if not specified,
- # the specified width gets defaulted to the available width.
-
- my $current=0;
- for (my $i=0;$i<=$#fwidth;$i++) {
- $current+=$fwidth[$i];
- }
- if ($current == 0) {
- $current = $Apache::londefdef::table[-1]{'width'};
- }
- my $coef=$Apache::londefdef::table[-1]{'width'}/$current;
- for (my $i=0;$i<=$#fwidth;$i++) {
- $fwidth[$i]*=$coef;
- }
- #removing of empty columns if allowed
- my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
- if ($permission eq 'yes') {
- my @cleaned_table=();
- my @cleaned_header=();
- my $colind=0;
- for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
- if ($fwidth[$jn]!=0) {
- #we need to copy column
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- $cleaned_table[$in][$colind]=$Apache::londefdef::table[-1]{'content'}[$in][$jn];
- $cleaned_header[$colind]=$fwidth[$jn];
- }
- $colind++;
- }
- }
- $Apache::londefdef::table[-1]{'content'}=\@cleaned_table;
- @fwidth=@cleaned_header;
- }
-
-
- #construct header of the table
- my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};
- for (my $in=0;$in<=$#fwidth;$in++) {
- $header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'};
- }
- $header_of_table .= '}';
-
- #fill the table
- for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
- my $have_rowspan = 0;
- for (my $jn=0;$jn<=$#fwidth;$jn++) {
-
- #-----------------------------------------------------------
- # I think this order of doing things will ensure that
- # single rowspan, columspan and combined row/colspans will
- # work correctly. LaTeX is delicate here.
- # RF.
-
- # Start a rowspan if necessary:
-
- my $primary_col_width = $fwidth[$jn]; # Width of primary column.
- my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
- my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn];
- #
- # Do the appropriate magic if this has a colspan
- #
-
- my $border_char = "";
- if ($border) {
- $border_char = "|";
- }
- my $spanwidth = 0;
- if ($colspan > 1) {
- for (my $spancol = $jn; $spancol < $jn + $colspan; $spancol++) {
- $spanwidth += $fwidth[$spancol];
- }
- $output .= '\multicolumn{'.
- $colspan
- ."}";
- if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- $output .= '{'.$border_char.'c'.$border_char.'}{';
- } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
- $output .= '{'.$border_char.'r'.$border_char.'}{';
- }
- else {
- $output .= '{'.$border_char."p{$spanwidth mm}".$border_char.'}{';
- }
-
- } else {
- $spanwidth = $primary_col_width; # If no span width will be just colwidth
- }
-
- # Rowspan... if colspan is 1, and there's an alignment we'll need
- # to kick in a multicolumn in order to get the alignment spec.
- # this must precede the multirow or LaTex gets quite upset.
- # Naturally if colspan > 1 we've already done that above ^
- #
- my $multirow_aligned = 0;
- if ($rowspan > 1) {
- if ($colspan == 1) {
- if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';
- $multirow_aligned = 1;
- } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
- $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';
- $multirow_aligned = 1;
- }
- }
- $have_rowspan++;
- if ($multirow_aligned) {
- $output .= '\multirow{'.$rowspan.'}[0]{*}{';
- } else {
- $output .= '\multirow{'.$rowspan."}[0]{$spanwidth mm}{";
- }
-
- $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~
- s{^\s*\\par\s*}{};
- $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~
- s{\s*\\vskip\s*0pt\s*$}{};
-
- #
- # If we did not throw in a multicolumn to align, then add
- # an extra {
- # so we close correctly without having to keep additional state
- # around
- #
- if (!$multirow_aligned) {
- $output .= '{';
- }
- }
- if (($rowspan eq '^') || ($rowspan eq '_')) {
- $have_rowspan++;
- }
- #--------------------------------------------------------------
-
-
- # For right and center alignment of single cells.
- # we are going to use a multicolumn with a span of 1 to specify alignment.
- #
- if ($colspan == 1 && $rowspan == 1) {
- if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';
- } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
- $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';
- }
- }
-
- $output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn];
-
- if (($colspan == 1 && $rowspan == 1) &&
- (($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') ||
- ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r'))) {
- $output .= '}';
- }
-
- # Close off any open multirow:
-
- if ($rowspan > 1) {
- $output .= '}}';
- }
- # Close off the colspan...
- #
- if ($colspan > 1) {
- $output .= '}';
- $jn += $colspan-1; # Adjust for number of rows really left.
- }
- if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};}
- }
- # If have_rowspan > 0, and borders are on, then
- # we need to do more than put an \hline at the bottom of row.
- # we need to do the appropriate \cline to ensure that
- # the spanned rows don't have \hlines through them.
-
- if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) {
- $output .= ' \\\\ ';
- for (my $jn=0; $jn<=$#fwidth;$jn++) {
- my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
- if ($rowspan ne "^") {
- if (($rowspan <= 1) || ($rowspan eq '_')) {
- my $column = $jn+1;
- $output .= '\cline{'.$column.'-'.$column.'} ';
- }
- }
- }
-
- } else {
- $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
- }
- }
- # Note that \newline destroys alignment env's produced by e.g.
- # $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';
- $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut ';
- if ($#Apache::londefdef::table > 0) {
- my $inmemory = $Apache::londefdef::table[-1]{'output'};
- # Figure out max/and min width by summing us and then
- # apply that to the current column of the table we nest in
- # if it's larger than the current width or the current width
- # is undefined.
- #
- my $min_nested_width = 0;
- my $max_nested_width = 0;
- for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {
- $min_nested_width += $min_len[$col];
- $max_nested_width += $max_len[$col];
-
- }
- # Fudge in an extra 5 mm for borders etc:
-
- $min_nested_width += 5;
- $max_nested_width += 5;
-
- my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};
- my $outer_row = $Apache::londefdef::table[-2]{'row_number'};
- if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) {
- $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width;
- }
- if ($max_nested_width > $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column]) {
- $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column] = $max_nested_width;
- }
-
- pop @Apache::londefdef::table;
- push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory;
- } else {
- $currentstring .= $Apache::londefdef::table[-1]{'output'};
- pop @Apache::londefdef::table;
- undef @Apache::londefdef::table;
- }
- }
- &enable_para();
- }
+
}
return $currentstring;
}
@@ -2627,7 +2237,7 @@ sub start_tr {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
@@ -2661,21 +2271,21 @@ sub start_tr {
push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'content'}}, [];
}
- }
+ }
return $currentstring;
}
-
+
sub end_tr {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = &end_p(); # Close any pending
in the row.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[2];
+ $currentstring .= $token->[2];
} elsif ($target eq 'tex') {
# In case the user is missing a or tag:
if ($Apache::londefdef::TD_redirection) {
- &end_td_tex($parstack,$parser,$safeeval);
+ &end_td_tex($parstack,$parser,$safeeval);
}
$Apache::londefdef::table[-1]->end_row();
@@ -2685,7 +2295,7 @@ sub end_tr {
if (0) {
if ($Apache::londefdef::TD_redirection) {
- &end_td_tex($parstack,$parser,$safeeval);
+ &end_td_tex($parstack,$parser,$safeeval);
}
# Counter columns must be the maximum number of columns seen
# in the table so far so:
@@ -2704,17 +2314,17 @@ sub start_td {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
$Apache::londefdef::TD_redirection = 1;
&tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
- }
+ }
return $currentstring;
-}
-
+}
+
sub tag_check {
my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
- my @ar=@$parstack;
+ my @ar=@$parstack;
for (my $i=$#ar-1;$i>=0;$i--) {
if (lc($$tagstack[$i]) eq $good_tag) {
&start_td_tex($parstack,$parser,$safeeval);
@@ -2734,20 +2344,29 @@ sub tag_check {
#
sub cell_config_hash {
- my ($align, $rowspan, $colspan) = @_;
+ my ($align, $rowspan, $colspan, $width) = @_;
+ if ($rowspan ne '') {
+ $rowspan =~ s/^\s+|\s+$//g;
+ }
+ if ($colspan ne '') {
+ $colspan =~ s/^\s+|\s+$//g;
+ }
my %config;
if ($align ne '') {
$config{'halign'} = $align;
}
- if ($colspan ne "") {
+ if (($colspan =~ /^\d+$/) && ($colspan > 0)) {
$config{'colspan'} = $colspan;
}
- if ($rowspan ne '') {
+ if (($rowspan =~ /^\d+$/) && ($rowspan > 0)) {
$config{'rowspan'} = $rowspan;
}
+ if ($width ne '') {
+ $config{'width'} = $width;
+ }
return \%config;
}
-
+
sub start_td_tex {
my ($parstack,$parser,$safeeval) = @_;
@@ -2756,15 +2375,15 @@ sub start_td_tex {
# attributes, but empty of text. end_td_tex will
# fetch the contents from the recursive parse and
# fill the cell with them:
- my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
- my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 1);
- my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 1);
-
- my $config = &cell_config_hash($align, $rowspan, $colspan);
+ my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval);
+ my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval);
+ my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval);
+ my $width = &Apache::lonxml::get_param('TeXwidth', $parstack, $safeeval);
+ my $config = &cell_config_hash($align, $rowspan, $colspan, $width);
my $table = $Apache::londefdef::table[-1];
$table->add_cell('', $config);
-
+
#------------------------------------------------
# Old table code.
@@ -2802,7 +2421,7 @@ sub end_td_tex {
if (0) {
my ($parstack,$parser,$safeeval) = @_;
my $current_row = $Apache::londefdef::table[-1]{'row_number'};
- my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
+ my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
my $data = &Apache::lonxml::endredirection();
# The rowspan array of the table indicates which cells are part of a span.
@@ -2812,14 +2431,14 @@ sub end_td_tex {
# If this and subsequent cells are part of a rowspan, we must
# push along the row until we find one that is not.
- while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])
+ while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])
&& ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) {
# Part of a span.
push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
$current_column++;
}
$Apache::londefdef::table[-1]{'counter_columns'} = $current_column;
-
+
# Get the column and row spans.
# Colspan can be done via \multicolumn if I can figure out the data structs.
@@ -2895,9 +2514,9 @@ sub end_td_tex {
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
}
- $data=~s/\\\\\s*$//;
- } else {
- $data=~s/^\s+(\S.*)/$1/;
+ $data=~s/\\\\\s*$//;
+ } else {
+ $data=~s/^\s+(\S.*)/$1/;
$data=~s/(.*\S)\s+$/$1/;
$data=~s/(\s)+/$1/;
my ($current_length,$min_length)=(0,0);
@@ -2928,13 +2547,13 @@ sub end_td_tex {
push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
}
- }
+ }
}
# Substitute all of the tables nested in this cell in their appropriate places.
my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant...
- for (my $in=0; $in<=$nested_count; $in++) {
+ for (my $in=0; $in<=$nested_count; $in++) {
my $nested = shift @{$Apache::londefdef::table[-1]{'include'}};
$nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;
# $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
@@ -2973,7 +2592,7 @@ sub end_td {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[2];
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
$Apache::londefdef::TD_redirection =0;
&end_td_tex($parstack,$parser,$safeeval);
@@ -2986,17 +2605,17 @@ sub start_th {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
$Apache::londefdef::TD_redirection = 1;
&tagg_check('tr','th',$tagstack,$parstack,$parser,$safeeval);
- }
+ }
return $currentstring;
-}
-
+}
+
sub tagg_check {
my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
- my @ar=@$parstack;
+ my @ar=@$parstack;
for (my $i=$#ar-1;$i>=0;$i--) {
if (lc($$tagstack[$i]) eq $good_tag) {
&start_th_tex($parstack,$parser,$safeeval);
@@ -3010,7 +2629,7 @@ sub tagg_check {
}
return '';
}
-
+
sub start_th_tex {
my ($parstack,$parser,$safeeval) = @_;
@@ -3089,8 +2708,8 @@ sub end_th_tex {
push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- } else {
- $data=~s/^\s+(\S.*)/$1/;
+ } else {
+ $data=~s/^\s+(\S.*)/$1/;
$data=~s/(.*\S)\s+$/$1/;
$data=~s/(\s)+/$1/;
my ($current_length,$min_length)=(0,0);
@@ -3119,9 +2738,9 @@ sub end_th_tex {
push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
- }
+ }
}
- for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {
+ for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {
$data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
}
#make data bold
@@ -3135,47 +2754,51 @@ sub end_th {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = &end_p(); # Close any open
in the row.
if ($target eq 'web' || $target eq 'webgrade') {
- $currentstring .= $token->[2];
+ $currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$Apache::londefdef::TD_redirection =0;
&end_th_tex($parstack,$parser,$safeeval);
}
return $currentstring;
}
-
+
#-- tag (end tag forbidden)
#
# Render the tag.
-# has the following attributes (in addition to the
+# has the following attributes (in addition to the
# standard HTML ones:
# TeXwrap - Governs how the tex target will try to wrap text around
# horizontally aligned images.
# TeXwidth - The width of the image when rendered for print (mm).
# TeXheight - The height of the image when rendered for print (mm)
# (Note there seems to also be support for this as a % of page size)
-#
+#
sub start_img {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
undef,1);
- if (! $src &&
+ if (! $src &&
($target eq 'web' || $target eq 'webgrade' || $target eq 'tex')
- ) {
+ ) {
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;
# Render unto browsers that which are the browser's...
if ($target eq 'web' || $target eq 'webgrade') {
- my $enc = ('yes' eq
+ 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') {
@@ -3185,7 +2808,7 @@ sub start_img {
# simulate the alignments offered by html.
#
#
- my $align = lc(&Apache::lonxml::get_param('align',
+ my $align = lc(&Apache::lonxml::get_param('align',
$parstack,
$safeeval,
undef,1));
@@ -3195,7 +2818,7 @@ sub start_img {
#
&Apache::lonxml::debug("Alignemnt = $align");
# LaTeX's image/text wrapping is really bad since it wants to
- # make figures float.
+ # make figures float.
# The user has the optional parameter (applicable only to l/r
# alignment to use the picins/parpic directive to get wrapped text
# this is also imperfect.. that's why we give them a choice...
@@ -3218,7 +2841,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");
@@ -3232,25 +2855,25 @@ sub start_img {
if ($width_param) { $size.='width='.$width_param.' mm,'; }
if ($height_param) { $size.='height='.$height_param.' mm]'; }
# Default size if not able to extract that (e.g. eps image).
-
+
# &Apache::lonnet::logthis("Size = $size");
-
+
$size='['.$size;
- $size=~s/,$/]/;
+ $size=~s/,$/]/;
$currentstring .= '\graphicspath{{'.$path.'}}'
.'\includegraphics'.$size.'{'.$file.'} ';
my $closure;
- ($currentstring, $closure) = &align_latex_image($align,
- $latex_rendering,
- $currentstring,
- $width_param,
+ ($currentstring, $closure) = &align_latex_image($align,
+ $latex_rendering,
+ $currentstring,
+ $width_param,
$height_param);
$currentstring .= $closure;
-
+
} else {
&Apache::lonxml::debug("$src does not exist");
#original image file doesn't exist so check the alt attribute
- my $alt =
+ my $alt =
&Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);
unless ($alt) {
$alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
@@ -3265,8 +2888,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).'
';
@@ -3278,7 +2901,7 @@ sub start_img {
['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);
my $alt= &Apache::lonxml::get_param('alt',$parstack,$safeeval);
my $enc= &Apache::lonxml::get_param('encrypturl',$parstack,$safeeval);
-
+
$currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',
['no','yes'], $token, 2);
if (($alt=~/\S/) && (lc($enc) eq 'yes')) {
@@ -3288,17 +2911,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 .= '';
} 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'});
@@ -3319,7 +2944,7 @@ sub start_img {
}
if ($osrc ne $nsrc || (!$nwidth && !$nheight)) {
# changed image or no size specified,
- # if they didn't explicitly change the
+ # if they didn't explicitly change the
# width or height use the ones from the image
if ($iwidth && $iheight) {
if ($owidth == $nwidth || (!$nwidth && !$nheight)) {
@@ -3358,7 +2983,7 @@ sub end_img {
#--