|
1 | 1 | package WeBWorK::PreTeXt; |
2 | 2 | use Mojo::Base 'Mojolicious::Controller', -async_await; |
3 | 3 |
|
| 4 | +use Mojo::DOM; |
| 5 | +use Mojo::IOLoop; |
4 | 6 | use Data::Structure::Util qw(unbless); |
5 | 7 |
|
6 | | -use warnings; |
7 | | -use strict; |
8 | | - |
9 | 8 | use lib "$ENV{PG_ROOT}/lib"; |
10 | 9 | use WeBWorK::PG; |
11 | 10 |
|
12 | 11 | sub render_ptx { |
13 | 12 | my $p = shift; |
14 | 13 | my $source = $p->{rawProblemSource}; |
15 | | - my $pg = WeBWorK::PG->new( |
16 | | - showSolutions => 1, |
17 | | - showHints => 1, |
18 | | - processAnswers => 1, |
19 | | - displayMode => 'PTX', |
20 | | - language_subroutine => WeBWorK::PG::Localize::getLoc('en'), |
21 | | - problemSeed => $p->{problemSeed} // 1234, |
22 | | - $p->{problemUUID} ? (problemUUID => $p->{problemUUID}) : (), |
23 | | - $p->{templateDirectory} ? (templateDirectory => $p->{templateDirectory}) : (), |
24 | | - $p->{tempDirectory} ? (tempDirectory => $p->{tempDirectory}) : (), |
25 | | - $p->{sourceFilePath} ? (sourceFilePath => $p->{sourceFilePath}) : (), |
26 | | - $source ? (r_source => \$source) : () |
27 | | - ); |
28 | 14 |
|
29 | | - my $ret = { |
30 | | - body => $pg->{body_text}, |
31 | | - answers => unbless($pg->{answers}) |
32 | | - }; |
| 15 | + return Mojo::IOLoop->subprocess->run_p(sub { |
| 16 | + my $pg = WeBWorK::PG->new( |
| 17 | + showSolutions => 1, |
| 18 | + showHints => 1, |
| 19 | + processAnswers => 1, |
| 20 | + displayMode => 'PTX', |
| 21 | + language_subroutine => WeBWorK::PG::Localize::getLoc('en'), |
| 22 | + problemSeed => $p->{problemSeed} // 1234, |
| 23 | + $p->{problemUUID} ? (problemUUID => $p->{problemUUID}) : (), |
| 24 | + $p->{sourceFilePath} ? (sourceFilePath => $p->{sourceFilePath}) : (), |
| 25 | + $source ? (r_source => \$source) : () |
| 26 | + ); |
| 27 | + |
| 28 | + my $dom = Mojo::DOM->new->xml(1); |
| 29 | + for my $answer (sort keys %{ $pg->{answers} }) { |
| 30 | + $dom->append_content($dom->new_tag( |
| 31 | + $answer, map { $_ => ($pg->{answers}{$answer}{$_} // '') } keys %{ $pg->{answers}{$answer} } |
| 32 | + )); |
| 33 | + } |
| 34 | + $dom->wrap_content('<answerhashes></answerhashes>'); |
| 35 | + |
| 36 | + my $ret = { problemText => $pg->{body_text}, answerhashXML => $dom->to_string }; |
33 | 37 |
|
34 | | - $pg->free; |
35 | | - return $ret; |
| 38 | + $pg->free; |
| 39 | + return $ret; |
| 40 | + })->catch(sub { |
| 41 | + my $err = shift; |
| 42 | + return "error: $err"; |
| 43 | + }); |
36 | 44 | } |
37 | 45 | 1; |
0 commit comments