version 1.344.2.4, 2016/08/08 12:07:20
|
version 1.344.2.8.4.1, 2017/06/21 19:55:00
|
Line 861 sub analyze_header {
|
Line 861 sub analyze_header {
|
.&Apache::loncommon::head_subbox( |
.&Apache::loncommon::head_subbox( |
&Apache::loncommon::CSTR_pageheader()); |
&Apache::loncommon::CSTR_pageheader()); |
$result .= |
$result .= |
&Apache::lonxml::message_location().' |
'<form name="lonhomework" method="post" action="'. |
<form name="lonhomework" method="post" action="'. |
|
&HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. |
&HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. |
'<input type="hidden" name="problemmode" value="'. |
'<input type="hidden" name="problemmode" value="'. |
$env{'form.problemmode'}.'" />'. |
$env{'form.problemmode'}.'" />'. |
Line 876 sub analyze_header {
|
Line 875 sub analyze_header {
|
<input type="button" name="submitmode" value="'.&mt("View").'" '. |
<input type="button" name="submitmode" value="'.&mt("View").'" '. |
'onclick="javascript:setmode(this.form,'."'view'".')" /> |
'onclick="javascript:setmode(this.form,'."'view'".')" /> |
<hr /> |
<hr /> |
</div> |
</div>' |
|
.&Apache::lonxml::message_location().' |
</form>'; |
</form>'; |
&Apache::lonxml::add_messages(\$result); |
&Apache::lonxml::add_messages(\$result); |
$request->print($result); |
$request->print($result); |
Line 1104 sub editxmlmode {
|
Line 1104 sub editxmlmode {
|
'<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'. |
'<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'. |
&HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. |
&HTML::Entities::encode($env{'request.uri'},'<>&"').'">'. |
&Apache::structuretags::remember_problem_state().' |
&Apache::structuretags::remember_problem_state().' |
<div class="LC_edit_problem_editxml_header"> |
<div class="LC_edit_problem_header"> |
<table class="LC_edit_problem_header_title"><tr><td> |
<div class="LC_edit_problem_header_title">'. |
<h2>'.&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').'</h2> |
&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index'). |
</td><td align="right"> |
'</div><div class="LC_edit_actionbar" id="actionbar">'; |
'.&Apache::loncommon::helpLatexCheatsheet('Problem_LON-CAPA_Functions','Script Functions').' |
|
</td></tr> |
|
</table>'; |
|
|
|
$result.='<input type="hidden" name="problemmode" value="saveedit" />'. |
$result.='<input type="hidden" name="problemmode" value="saveedit" />'. |
&Apache::structuretags::problem_edit_buttons('editxml'); |
&Apache::structuretags::problem_edit_buttons('editxml'); |
|
$result.='<div>'; |
$result.='<hr style="clear:both;" />'.&Apache::lonxml::message_location().'</div>'. |
|
'<textarea '.&Apache::edit::element_change_detection(). |
$result .= '<ol class="LC_primary_menu" style="display:inline-block;font-size:90%;vertical-align:middle;">'; |
' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" '. |
|
' name="editxmltext" id="LC_editxmltext">'. |
unless ($env{'environment.nocodemirror'}) { |
&HTML::Entities::encode($problem,'<>&"').'</textarea> |
# dropdown menus |
<div id="LC_aftertextarea"> |
$result .= Apache::lonmenu::create_submenu("#", "", |
</div> |
&mt("Problem Templates"), template_dropdown_datastructure()); |
</form>'.&Apache::loncommon::end_page(); |
|
&Apache::lonxml::add_messages(\$result); |
$result .= Apache::lonmenu::create_submenu("#", "", |
$request->print($result); |
&mt("Response Types"), responseblock_dropdown_datastructure()); |
|
|
|
$result .= Apache::lonmenu::create_submenu("#", "", |
|
&mt("Conditional Blocks"), conditional_scripting_datastructure()); |
|
|
|
$result .= Apache::lonmenu::create_submenu("#", "", |
|
&mt("Miscellaneous"), misc_datastructure()); |
|
} |
|
|
|
$result .= Apache::lonmenu::create_submenu("#", "", |
|
&mt("Help") . ' <img src="/adm/help/help.png" alt="' . &mt("Help") . |
|
'" style="vertical-align:text-bottom; height: auto; margin:0; "/>', |
|
helpmenu_datastructure(),""); |
|
|
|
$result.="</ol></div>"; |
|
|
|
$result .= '</div></div>' . |
|
&Apache::lonxml::message_location() . |
|
&Apache::loncommon::xmleditor_js() . |
|
'<textarea ' . &Apache::edit::element_change_detection() . |
|
' rows="'.$rows.'" cols="'.$cols.'" style="width:100%" ' . |
|
' name="editxmltext" id="LC_editxmltext">' . |
|
&HTML::Entities::encode($problem,'<>&"') . |
|
'</textarea> <div id="LC_aftertextarea"> </div> </form>'; |
|
|
|
my $resource = $env{'request.ambiguous'}; |
|
unless($env{'environment.nocodemirror'}){ |
|
$result .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined-xml.css"> |
|
<script src="/adm/codemirror/codemirror-compressed-xml.js"></script> |
|
<script> |
|
CodeMirror.defineMode("mixedmode", function(config) { |
|
return CodeMirror.multiplexingMode( |
|
CodeMirror.getMode(config, "xml"), |
|
{ |
|
open: "\<script type=\"loncapa/perl\"\>", close: "\</script\>", |
|
mode: CodeMirror.getMode(config, "perl"), |
|
delimStyle: "tag", |
|
} |
|
); |
|
}); |
|
var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"), |
|
{ |
|
mode: "mixedmode", |
|
lineWrapping: true, |
|
lineNumbers: true, |
|
tabSize: 4, |
|
indentUnit: 4, |
|
|
|
autoCloseTags: true, |
|
autoCloseBrackets: true, |
|
height: "auto", |
|
styleActiveLine: true, |
|
|
|
extraKeys: { |
|
"Tab": "indentMore", |
|
"Shift-Tab": "indentLess", |
|
} |
|
}); |
|
restoreScrollPosition("'.$resource.'"); |
|
</script>'; |
|
} |
|
|
|
$result .= &Apache::loncommon::end_page(); |
|
&Apache::lonxml::add_messages(\$result); |
|
$request->print($result); |
} |
} |
return ''; |
return ''; |
} |
} |
Line 1211 sub finished_parsing {
|
Line 1272 sub finished_parsing {
|
undef($Apache::lonhomework::parsing_a_task); |
undef($Apache::lonhomework::parsing_a_task); |
} |
} |
|
|
|
|
|
# function extracted from get_template_html |
|
# returns "key" -> list |
|
# key: path of template |
|
# value 1: title |
|
# value 2: category |
|
# value 3: name of help topic ??? |
sub get_template_list { |
sub get_template_list { |
my ($extension) = @_; |
my ($extension) = @_; |
|
|
|
my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}. |
|
'/templates/*.'.$extension); |
|
@files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')), |
|
(&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')), |
|
&mt(&Apache::lonnet::metadata($_, 'help'))]} (@files); |
|
@files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files); |
|
return @files; |
|
} |
|
|
|
sub get_template_html { |
|
my ($extension) = @_; |
my $result; |
my $result; |
my @allnames; |
my @allnames; |
&Apache::lonxml::debug("Looking for :$extension:"); |
&Apache::lonxml::debug("Looking for :$extension:"); |
my $glob_extension = $extension; |
my $glob_extension = $extension; |
if ($extension eq 'survey' || $extension eq 'exam') { |
if ($extension eq 'survey' || $extension eq 'exam') { |
$glob_extension = 'problem'; |
$glob_extension = 'problem'; |
} |
} |
my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}. |
my @files = &get_template_list($extension); |
'/templates/*.'.$glob_extension); |
|
@files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')), |
|
(&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')), |
|
&Apache::lonnet::metadata($_, 'help')]} (@files); |
|
@files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files); |
|
my ($midpoint,$seconddiv,$numfiles); |
my ($midpoint,$seconddiv,$numfiles); |
my @noexamplelink = ('blank.problem','blank.library','script.library'); |
my @noexamplelink = ('blank.problem','blank.library','script.library'); |
$numfiles = 0; |
$numfiles = 0; |
Line 1287 sub get_template_list {
|
Line 1362 sub get_template_list {
|
sub newproblem { |
sub newproblem { |
my ($request) = @_; |
my ($request) = @_; |
|
|
|
if ($env{'form.mode'} eq 'blank'){ |
|
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
|
my $templatefilename = |
|
$request->dir_config('lonIncludes').'/templates/blank.problem'; |
|
&File::Copy::copy($templatefilename,$dest); |
|
&renderpage($request,$dest); |
|
return; |
|
} |
|
my $errormsg; |
if ($env{'form.template'}) { |
if ($env{'form.template'}) { |
my $file = $env{'form.template'}; |
my $file; |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my ($extension) = ($env{'form.template'} =~ /\.(\w+)$/); |
&File::Copy::copy($file,$dest); |
if ($extension) { |
&renderpage($request,$dest); |
my @files = &get_template_list($extension); |
return; |
foreach my $poss (@files) { |
|
if (ref($poss) eq 'ARRAY') { |
|
if ($env{'form.template'} eq $poss->[0]) { |
|
$file = $env{'form.template'}; |
|
last; |
|
} |
|
} |
|
} |
|
if ($file) { |
|
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
|
&File::Copy::copy($file,$dest); |
|
&renderpage($request,$dest); |
|
return; |
|
} else { |
|
$errormsg = '<p class="LC_error">'.&mt('Invalid template file.').'</p>'; |
|
} |
|
} else { |
|
$errormsg = '<p class="LC_error">'.&mt('Invalid template file; template needs to be a .problem, .library, or .task file.').'</p>'; |
|
} |
} |
} |
|
|
my ($extension) = ($request->uri =~ m/\.(\w+)$/); |
my ($extension) = ($request->uri =~ m/\.(\w+)$/); |
&Apache::lonxml::debug("Looking for :$extension:"); |
&Apache::lonxml::debug("Looking for :$extension:"); |
my $templatelist=&get_template_list($extension); |
my $templatelist=&get_template_html($extension); |
if ($env{'form.newfile'} && !$templatelist) { |
if ($env{'form.newfile'} && !$templatelist) { |
# no templates found |
# no templates found |
my $templatefilename = |
my $templatefilename = |
Line 1309 sub newproblem {
|
Line 1411 sub newproblem {
|
} else { |
} else { |
my $url=&HTML::Entities::encode($request->uri,'<>&"'); |
my $url=&HTML::Entities::encode($request->uri,'<>&"'); |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my $errormsg; |
|
my $instructions; |
my $instructions; |
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), |
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), |
'text' => 'Authoring Space'}, |
'text' => 'Authoring Space'}, |
Line 1359 sub update_construct_style {
|
Line 1460 sub update_construct_style {
|
} |
} |
} |
} |
|
|
|
# |
|
# Sets interval for current user so time left will be zero, either for the entire folder |
|
# containing the current resource, or just the resource, depending on value of first item |
|
# in interval array retrieved from EXT("resource.0.interval"); |
|
# |
|
sub zero_timer { |
|
my ($symb) = @_; |
|
my ($hastimeleft,$first_access,$now); |
|
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
|
if (@interval > 1) { |
|
if ($interval[1] eq 'course') { |
|
return; |
|
} else { |
|
my $now = time; |
|
my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb); |
|
if ($first_access > 0) { |
|
if ($first_access+$interval[0] > $now) { |
|
my $done_time = $now - $first_access; |
|
my $snum = 1; |
|
if ($interval[1] eq 'map') { |
|
$snum = 2; |
|
} |
|
my $result = |
|
&Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval', |
|
$snum,$done_time, |
|
'date_interval', |
|
$env{'user.name'}, |
|
$env{'user.domain'}); |
|
return $result; |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
sub handler { |
sub handler { |
#my $t0 = [&gettimeofday()]; |
#my $t0 = [&gettimeofday()]; |
Line 1409 sub handler {
|
Line 1545 sub handler {
|
&renderpage($request,$file); |
&renderpage($request,$file); |
} |
} |
} else { |
} else { |
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
|
['mode']); |
# requested file doesn't exist in contruction space |
# requested file doesn't exist in contruction space |
&newproblem($request); |
&newproblem($request); |
} |
} |
} else { |
} else { |
|
# Set the event timer to zero if the "done button" was clicked. The button is |
|
# part of the LCdoneButton form created in lonmenu.pm |
|
if ($symb && $env{'form.LC_interval_done'} eq 'true') { |
|
&zero_timer($symb); |
|
undef($env{'form.LC_interval_done'}); |
|
} |
# just render the page normally outside of construction space |
# just render the page normally outside of construction space |
&Apache::lonxml::debug("not construct"); |
&Apache::lonxml::debug("not construct"); |
&renderpage($request,$file); |
&renderpage($request,$file); |
Line 1426 sub handler {
|
Line 1570 sub handler {
|
|
|
} |
} |
|
|
|
sub template_dropdown_datastructure { |
|
# gathering the all templates and their path, title, category and help topic |
|
my @templates = get_template_list('problem'); |
|
# template category => title |
|
my %tmplthash = (); |
|
# template title => path |
|
my %tmpltcontent = (); |
|
|
|
foreach my $template (@templates){ |
|
# put in hash if the template is not empty |
|
unless ($template->[1] eq ''){ |
|
push(@{$tmplthash{$template->[2]}}, $template->[1]); |
|
push(@{$tmpltcontent{$template->[1]}},$template->[0]); |
|
} |
|
} |
|
|
|
my $catList = []; |
|
foreach my $cat (sort keys %tmplthash) { |
|
my $catItems = []; |
|
foreach my $title (sort @{$tmplthash{$cat}}) { |
|
my $path = $tmpltcontent{$title}->[0]; |
|
my $code; |
|
open(FH, "<$path"); |
|
while(<FH>){ |
|
$code.= $_ unless $_ =~ /(<problem>)|(<\/problem>)/; |
|
} |
|
close(FH); |
|
|
|
if ($code ne '') { |
|
my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code,'<>&"')) . '\')'; |
|
my $currItem = [$href, $title, undef]; |
|
push @{$catItems}, $currItem; |
|
} |
|
} |
|
push @{$catList}, [$catItems, $cat, undef]; |
|
} |
|
|
|
return $catList; |
|
} |
|
|
|
sub responseblock_dropdown_datastructure { |
|
|
|
my $mathCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] |
|
], |
|
&mt("Math"), |
|
undef |
|
]; |
|
|
|
my $miscCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Two Lists"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N statements"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Select from Options"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef] |
|
], |
|
&mt("Miscellaneous"), |
|
undef |
|
]; |
|
|
|
my $chemCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Chemical Structure"), undef] |
|
], |
|
&mt("Chemistry"), |
|
undef |
|
]; |
|
|
|
my $textCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] |
|
], |
|
&mt("Text"), |
|
undef |
|
]; |
|
|
|
return [$mathCat, $miscCat, $chemCat, $textCat]; |
|
} |
|
|
|
|
|
sub conditional_scripting_datastructure { |
|
# TODO: corresponding routines should be used for the javascript:insertText parts |
|
# instead of the placeholder routine default_xml_tag with the tags |
|
# e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which |
|
# returns the corresponding content for this case |
|
|
|
#TODO translated is currently temporarily here, another solution should be found where the |
|
# needed string can be retrieved |
|
|
|
my $translatedTag = ' |
|
<translated> |
|
<lang which="en"></lang> |
|
<lang which="default"></lang> |
|
</translated>'; |
|
return [ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Date Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] |
|
]; |
|
} |
|
|
|
sub misc_datastructure { |
|
return [ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("part"))) . "\')", &mt("Problem Part"), undef] |
|
]; |
|
} |
|
|
|
# helper routine for the datastructure building subroutines |
|
sub default_xml_tag { |
|
my ($tag) = @_; |
|
return "\n<$tag></$tag>"; |
|
} |
|
|
|
sub helpmenu_datastructure { |
|
|
|
# filename, title, width, height |
|
my $helpers = [ |
|
['Problem_LON-CAPA_Function.hlp', &mt('Script Functions'), 800, 600], |
|
['Greek_Symbols.hlp', &mt('Greek Symbols'), 500, 600], |
|
['Other_Symbols.hlp', &mt('Other Symbols'), 500, 600], |
|
['Authoring_Output_Tags.hlp', &mt('Output Tags'), 800, 600], |
|
['Authoring_Multilingual_Problems.hlp', &mt('Languages'), 800, 600], |
|
]; |
|
|
|
my $help_structure = []; |
|
|
|
foreach my $count (0..(scalar(@{$helpers})-1)) { |
|
my $filename = $helpers->[$count]->[0]; |
|
my $title = $helpers->[$count]->[1]; |
|
my $width = $helpers->[$count]->[2]; |
|
my $height = $helpers->[$count]->[3]; |
|
if ($width eq '') { |
|
$width = 500; |
|
} |
|
if ($height eq '') { |
|
$height = 600; |
|
} |
|
my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename',$width,$height,'yes');"); |
|
push @{$help_structure}, [$href, $title, undef]; |
|
} |
|
|
|
return $help_structure; |
|
} |
|
|
|
# we need substitution to not break javascript code |
|
sub convert_for_js { |
|
my $return = shift; |
|
$return =~ s|script|ESCAPEDSCRIPT|g; |
|
$return =~ s|\\|\\\\|g; |
|
$return =~ s|\n|\\r\\n|g; |
|
$return =~ s|'|\\'|g; |
|
$return =~ s|'|\\'|g; |
|
return $return; |
|
} |
|
|
1; |
1; |
__END__ |
__END__ |