version 1.40, 2002/11/11 21:04:49
|
version 1.46, 2003/07/25 04:14:32
|
Line 32
|
Line 32
|
|
|
package Apache::lonratedt; |
package Apache::lonratedt; |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonratedt: advanced resource assembly tool |
|
|
|
=head1 SYNOPSIS |
|
|
|
lonratedt provides the routines and the handler for the Advanced |
|
Resource Assembly Tool (RAT), and ties the various pieces together |
|
with Javascript. |
|
|
|
=head1 OVERVIEW |
|
|
|
=head2 Map Representation |
|
|
|
=begin latex |
|
|
|
% |
|
\begin{figure} |
|
\begin{center}\includegraphics[% |
|
width=0.55\paperwidth,bb = 0 0 200 100, draft, type=eps]{Map_Example}\end{center} |
|
|
|
|
|
\caption{\label{Map_In_Advanced_Editor}Example of a Map in the Advanced Editor} |
|
\end{figure} |
|
% |
|
\begin{figure} |
|
\begin{lyxcode} |
|
<map> |
|
|
|
~~<resource~id=\char`\"{}1\char`\"{} |
|
|
|
~~~~src=\char`\"{}/res/msu/korte/phy231welcome.html\char`\"{} |
|
|
|
~~~~type=\char`\"{}start\char`\"{} |
|
|
|
~~~~title=\char`\"{}Start\char`\"{}> |
|
|
|
~~~~</resource> |
|
|
|
~~<resource~id=\char`\"{}2\char`\"{} |
|
|
|
~~~~src=\char`\"{}\char`\"{}~type=\char`\"{}finish\char`\"{} |
|
|
|
~~~~title=\char`\"{}Finish\char`\"{}> |
|
|
|
~~~~</resource> |
|
|
|
~~<resource~id=\char`\"{}6\char`\"{} |
|
|
|
~~~~src=\char`\"{}/res/msu/korte/tests/units.problem\char`\"{} |
|
|
|
~~~~type=\char`\"{}mandatory\char`\"{} |
|
|
|
~~~~title=\char`\"{}Physical~Units~Test\char`\"{}> |
|
|
|
~~~~</resource> |
|
|
|
~~<resource~id=\char`\"{}9\char`\"{} |
|
|
|
~~~~src=\char`\"{}/res/msu/korte/chapters/onedim.sequence\char`\"{} |
|
|
|
~~~~title=\char`\"{}Motion~in~One~Dimension\char`\"{}> |
|
|
|
~~~~</resource> |
|
|
|
~~<resource~id=\char`\"{}11\char`\"{} |
|
|
|
~~~~src=\char`\"{}/res/msu/bauer/bridges/units.sequence\char`\"{} |
|
|
|
~~~~title=\char`\"{}Physical~Units~Refresher\char`\"{}> |
|
|
|
~~~~</resource> |
|
|
|
~~<condition~id=\char`\"{}19\char`\"{} |
|
|
|
~~~~type=\char`\"{}stop\char`\"{} |
|
|
|
~~~~value=\char`\"{}user.assessments{[}this./res/msu/korte/tests/units.problem{]}.status=solved\char`\"{}> |
|
|
|
~~~~</condition> |
|
|
|
~~<link~from=\char`\"{}1\char`\"{}~to=\char`\"{}6\char`\"{}></link> |
|
|
|
~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}9\char`\"{}~condition=\char`\"{}19\char`\"{}></link> |
|
|
|
~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}11\char`\"{}></link> |
|
|
|
~~<link~from=\char`\"{}11\char`\"{}~to=\char`\"{}6\char`\"{}></link> |
|
|
|
~~</map> |
|
\end{lyxcode} |
|
|
|
\caption{\label{XML}XML for Map in Figure \ref{Map_In_Advanced_Editor}} |
|
\end{figure} |
|
|
|
=end latex |
|
|
|
Fig. "XML for Map in Figure" shows the XML representation of the |
|
resource map shown in Fig. "Example of a Map in the Advanced Editor", |
|
which is the format in which maps are stored. In the figure, however, |
|
additional graphical map layout information generated by the Advanced |
|
Resource Assembly Tool is not displayed. This graphical information is |
|
optional to re-generate the same graphical layout when the map is |
|
brought up again in the Resource Assembly Tool, and is not needed for |
|
any other system functionality. |
|
|
|
Maps can be generated by tools other than the Resource Assembly |
|
Tool. In particular, an author might have some other representation of |
|
a course sequence, which can be converted into a map using scripts. If |
|
this map then were to be brought up in the Resource Assembly Tool, the |
|
Tool would automatically generate a graphical layout for it. Each |
|
entry of the map (resources, conditions and links) is stored in a |
|
separate tag. |
|
|
|
Resources and conditionsX<conditions> have to have unique ID |
|
numbers. These numbers are automatically generated by the Resource |
|
Assembly Tool when the entry is first created, or added to the entries |
|
when a map generated outside the Resource Assembly Tool is first |
|
retrieved. They can also be assigned by custom scripts or added in by |
|
hand. |
|
|
|
In the XML example, entry 1 is the start resource of the map. When |
|
this map is accessed, the source (src) URL of this tag will be the |
|
first resource rendered. Entry 2 is the finish resource of this |
|
map. This resource will be the last resource in the sequence of |
|
resources. Entry 6 is a problem resource with the given URL and title, |
|
as well as the priority "mandatory". Entry 19 is a condition, which is |
|
used by the link between entries 6, the problem, and 9, a |
|
sequence. I<The final syntax for conditions has not yet been |
|
determined.> |
|
|
|
=cut |
|
|
use strict; |
use strict; |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use Apache::lonnet; |
use Apache::lonnet; |
Line 318 sub pastetarget {
|
Line 453 sub pastetarget {
|
# modifies @resources |
# modifies @resources |
|
|
sub startfinish { |
sub startfinish { |
|
# Remove all start and finish |
foreach (@order) { |
foreach (@order) { |
my ($name,$url,$ext)=split(/\:/,$resources[$_]); |
my ($name,$url,$ext)=split(/\:/,$resources[$_]); |
if ($url=~/http\&colon\:\/\//) { $ext='true'; } |
if ($url=~/http\&colon\:\/\//) { $ext='true'; } |
$resources[$_]=$name.':'.$url.':'.$ext.':normal:res'; |
$resources[$_]=$name.':'.$url.':'.$ext.':normal:res'; |
} |
} |
|
# Garbage collection |
|
my $stillchange=1; |
|
while (($#order>1) && ($stillchange)) { |
|
$stillchange=0; |
|
for (my $i=0;$i<=$#order;$i++) { |
|
my ($name,$url,$ext)=split(/\:/,$resources[$order[$i]]); |
|
unless ($url) { |
|
# Take out empty resource |
|
for (my $j=$i+1;$j<=$#order;$j++) { |
|
$order[$j-1]=$order[$j]; |
|
} |
|
$#order--; |
|
$stillchange=1; |
|
last; |
|
} |
|
} |
|
} |
|
# Put in a start resource |
my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]); |
my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]); |
$resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res'; |
$resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res'; |
|
# Make sure this has at least start and finish |
if ($#order==0) { |
if ($#order==0) { |
$resources[$#resources+1]='::false'; |
$resources[$#resources+1]='::false'; |
$order[1]=$#resources; |
$order[1]=$#resources; |
} |
} |
my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]); |
# Make the last one a finish resource |
|
($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]); |
$resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res'; |
$resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res'; |
} |
} |
|
|
Line 712 sub smpedt {
|
Line 868 sub smpedt {
|
my ($name,@resrest)=split(/\:/,$Apache::lonratedt::resources[$residx]); |
my ($name,@resrest)=split(/\:/,$Apache::lonratedt::resources[$residx]); |
$name=$ENV{'form.renametitle'}; |
$name=$ENV{'form.renametitle'}; |
$name=~s/\:/\&colon\;/g; |
$name=~s/\:/\&colon\;/g; |
$Apache::lonratedt::resources[$residx]=$name.':'.join(':'.@resrest); |
$Apache::lonratedt::resources[$residx]=$name.':'.join(':',@resrest); |
&storemap(&Apache::lonnet::filelocation('',$url)); |
&storemap(&Apache::lonnet::filelocation('',$url)); |
} |
} |
# ------------------------------------------------------------ Assemble windows |
# ------------------------------------------------------------ Assemble windows |
Line 780 sub smpedt {
|
Line 936 sub smpedt {
|
var selidx=document.forms.simpleedit.target.selectedIndex; |
var selidx=document.forms.simpleedit.target.selectedIndex; |
var entry=(document.forms.simpleedit.targetdetail.value.split('&')) |
var entry=(document.forms.simpleedit.targetdetail.value.split('&')) |
[selidx]; |
[selidx]; |
var newtitle=prompt('New Title',unescape((entry.split('='))[0])); |
var oldname=unescape((entry.split('='))[0]); |
|
var nameparts=oldname.split(':'); |
|
oldname=unescape(nameparts.join(':')); |
|
nameparts=oldname.split('"'); |
|
oldname=unescape(nameparts.join('"')); |
|
nameparts=oldname.split('''); |
|
oldname=unescape(nameparts.join("'")); |
|
newtitle=prompt('New Title',oldname); |
if (newtitle) { |
if (newtitle) { |
document.forms.simpleedit.renameres.value=1; |
document.forms.simpleedit.renameres.value=1; |
document.forms.simpleedit.renameidx.value=selidx; |
document.forms.simpleedit.renameidx.value=selidx; |
Line 811 after selected
|
Line 974 after selected
|
<input type=text size=20 name=importmap> |
<input type=text size=20 name=importmap> |
<input type=button |
<input type=button |
onClick="javascript:openbrowser('simpleedit','importmap','sequence,page','')" |
onClick="javascript:openbrowser('simpleedit','importmap','sequence,page','')" |
value="Browse"><input type=submit name=loadmap value="Load Map"><hr> |
value="Select Map"><input type=submit name=loadmap value="Load Map"><hr> |
<input type=submit name="discard" value="Discard Selected"> |
<input type=submit name="discard" value="Discard Selected"> |
<input type=submit name="clear" value="Clear All"> |
<input type=submit name="clear" value="Clear All"> |
<input type=button onClick="javascript:viewimport()" value="View"> |
<input type=button onClick="javascript:viewimport()" value="View"> |
Line 885 sub viewmap {
|
Line 1048 sub viewmap {
|
} |
} |
my $idx=0; |
my $idx=0; |
$r->print('<h1>'.$url.'</h1>'); |
$r->print('<h1>'.$url.'</h1>'); |
|
if ($adv) { |
|
$r->print('<p><b><font color="red">Map contents are not shown in order.</font></b></p><br />'); |
|
} |
foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { |
foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { |
if (defined($_)) { |
if (defined($_)) { |
$idx++; |
$idx++; |