Skip to content

PG 2.21 Release Candidate#1393

Open
drgrice1 wants to merge 184 commits intomainfrom
PG-2.21
Open

PG 2.21 Release Candidate#1393
drgrice1 wants to merge 184 commits intomainfrom
PG-2.21

Conversation

@drgrice1
Copy link
Copy Markdown
Member

This is the release candidate for WeBWorK 2.21. Please re-target any pull requests that you want to get into the release for this branch.

drgrice1 and others added 30 commits July 11, 2025 06:36
`maketext` is not defined in the Translator package, and so it cannot be
called directly in the default graders defined in the translator.
Instead an eval is needed to access the `maketext` in the safe
compartment.

This fixes issue #1261.
Also fixes spelling of SYNOPSIS
…oblems.

This extends @sfiedle1's work in #1258, and implements the structural
rework that I suggested in the conversation for that pull request
(albeit slightly modified).

There are two new options for the `draggableSubsets.pl` macro.  They are
`ShowUniversalSet` and `UniversalSetLabel`.

If `ShowUniversalSet` is 1, then the set of all elements that are passed
as the first argument for the `DraggableSubsets` method will be shown as
a separate drag and drop bucket.  This bucket is always above the other
usual drag and drop buckets (both in HTML and TeX).  The elements of the
universal set can be dragged multiple times to the other buckets.
Really this is a copy of the element, so all elements always remain in
the universal set.

The `UniversalSetLabel` option is a string that will be shown as the
label of the universal set bucket.

Note that this approach doesn't require any special handling for grading
the answer regardless of if `$showPartialCorrectAnswers` is true or not,
because the universal set bucket is not part of the answer in any case.
It is not listed in any of the answer previews, and is not part of the
grading in any way. It is purely a source of elements.

I also added some validation of the answers and default subsets that are
passed to the DraggableSubsets method.  Previously invalid inputs would
have caused rather unexpected things.  Now they will be errors
(specifically `Value::Error`s).

In my original comment to #1258 I suggested a `ShowUniversalSet` option
and a related `AllowReusableElements` option.  The latter option was
dropped because I realized it doesn't really make sense in the context
of a universal set. I initially implemented it, but basically it made
the "universal set" bucket really just a regular bucket just like all of
the others, and it really wasn't a "universal set" anymore since it
didn't always have all elements. I thought of a way that it could make
sense in which it always has all elements, but only one copy was allowed
to be dragged to the other buckets.  So only one duplicate, no reuse
after that.  That would take some effort to implement (mostly in the
javascript code), but could be done. I don't know that this would really
be that useful though, so I didn't implement it for now.

A MWE for testing this is as follows:

```perl
DOCUMENT();

loadMacros(qw{PGstandard.pl PGML.pl draggableSubsets.pl PGcourse.pl});

$draggable = DraggableSubsets(
    [ 'orange', 'blue', 'apple' ],
    [ [ 0, 1 ], [ 0, 2 ] ],
    DefaultSubsets => [
        { label => 'Color', indices => [] },
        { label => 'Fruit', indices => [] },
    ],
    ShowUniversalSet  => 1,
    UniversalSetLabel =>
        'Classify each item below as a color, fruit, or both.',
    AllowNewBuckets => 0
);

BEGIN_PGML
[_]{$draggable}
END_PGML

ENDDOCUMENT();
```

To test this you should also test modifications of the above problem
with other options.  For example, change to `AllowNewBuckets => 1`, and
test addition and removal of buckets particularly removal after elements
have been added to the bucket.  Add indices to the `DefaultSubsets` so
elements are initially shown in those and behavior when elements are
dragged in an out.
`draggableSubsets.pl` macro consistent with what is documented.

Add `options.sort = false` for the universal set so that it can not be
rearranged from what it is set to.  This is for transparency since this
doesn't matter anyway.
There are some new strings that have not been added to the pot file.
66% of minimum 1% translated source file: 'pg.pot'
on 'el'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
84% of minimum 1% translated source file: 'pg.pot'
on 'he_IL'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
41% of minimum 1% translated source file: 'pg.pot'
on 'cs_CZ'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
11% of minimum 1% translated source file: 'pg.pot'
on 'es'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
14% of minimum 1% translated source file: 'pg.pot'
on 'ko'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
4% of minimum 1% translated source file: 'pg.pot'
on 'ru_RU'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
22% of minimum 1% translated source file: 'pg.pot'
on 'de'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
7% of minimum 1% translated source file: 'pg.pot'
on 'fr'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
4% of minimum 1% translated source file: 'pg.pot'
on 'zh_HK'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
9% of minimum 1% translated source file: 'pg.pot'
on 'hu'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
6% of minimum 1% translated source file: 'pg.pot'
on 'tr'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
6% of minimum 1% translated source file: 'pg.pot'
on 'zh_CN'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
don't let a negative score be reported
Rewrite the PG uniq function to return the array in a consistent order
This fixes two issues with a check in BeginList; first, it accessed a parameter without checking it if existed first, resulting in undefined value warnings; and second it tested the validity of the uppercase version of the parameter but then used the literal parameter in the assignment.
pstaabp and others added 30 commits February 23, 2026 11:02
Fix a possible infinite loop in the MathView initializion code.
PG::Critic add policy for weightedGrader.pl functions.
This is the result of running `npm audit fix`.
Update the license to match what is in the webwork2 repo.
This includes clarifying we use artistic license 1.0,
remove the fsf physical address and provide links to both
the artistic license 1.0 and gpl 2.0.

The old license and new license mention copies of the license
should be provided in the "package", but they were not in the pg
repo. This adds them to the doc directory to match what is done
in webwork2.

Remove the old README which was just a copyright statement.
This is the result of executing the `bin/update-localization-files`
script.
Currently if the y axis location is 'center', 'left' (or 'box'), or
'right', then the determination that zero is drawn is made by checking
that the y axis min or max value.  That is incorrect.  It should be
checking the x axis min or max value.  The point is that if the y axis
is passing through x = 0, then zero should not be drawn, and otherwise
it should be.

Similarly, the y axis `drawZero` determination is fixed.

You can test this with the following problem code:

```
DOCUMENT();

loadMacros('PGstandard.pl', 'PGML.pl', 'plots.pl', 'PGcourse.pl');

$graph = Plot(
    xmin           => -2,
    xmax           => 10,
    xtick_distance => 1,
    xminor         => 0,
    xlocation      => 'bottom',
    ymin           => 0,
    ymax           => 10,
    ytick_distance => 1,
    yminor         => 0,
    ylocation      => 'left'
);

BEGIN_PGML
[!graph!]{$graph}{500}
END_PGML

ENDDOCUMENT();
```

With that example and the develop branch the zero on the x-axis is
incorrectly not drawn in JSXGraph output.  With this branch it is drawn
as it should be. Note that in TikZ output the zero is drawn with this
example. So this makes the two output formats consistent.
The only place this is used is for error messages in
`lib/PGresponsegroup.pm`. That is now reworked to use the
`PGcore::warning_message` method instead. The `internal_debug_messages`
is just not needed anymore in addition to the `warning_message` and
`debug_message` methods. Furthermore, it is inappropriately named. It
has "debug" in the name, but is used for error messages, not debugging
messages.
Yes, this is the same one the dependabot pointed out for the main
branch.
Fix an npm dependency security vulnerability.
Remove the internal debug messages.
Fix `drawZero` for JSXGraph output of the plots macro.
Use plots.pl to create the graphs instead of the old graphmacros.

Remove use of tables for formatting. Use bordered divs instead.
Cleanup some of the HTML use with this as well. Space the graphs
vertically, to work better on smaller screens or in the problem
editor.

When finding test points, remove adaptive parameters from
the list of variable names, as these can make it so the
test points shown on the graphs are incorrect.

Only use of a table is for the table of test points, which now
uses row headers, padding, and no longer uses blank cells for
spacing. Multivariable functions have the test points for each
variable in their own row instead of showing them as a point.
Only variables used in correct or student answers are shown.
Update Value/AnswerChecker diagnostics output.
Testing things with the screen reader revealed this.  The zoom out
button has the same aria label as the zoom in button.  This was probably
a cut and paste error.

Also remove the `zoom-in` class on both that is not needed or used for
either.
This does the things that I asked @drdrew42 to address in #1392. Since
@drdrew42 seems to not have time to deal with that (due to the lack of
response to my comments) I am opening this pull request.

This also addresses the fourth security vulnerability that @drdrew42
mentioned in the Slack securityresponseteam channel. Basically, it only
allows symlinks to be created to a file that is in the
`$WeBWorK::PG::IO::pg_envir->{directories}{permitted_read_dir}`.

That does allow following symlinks, so for webwork2 that includes
anything in or linked to in the course directory. That means OPL static
image files will work, or files in the
`webwork2/assets/pg/Student_Orientation` directory (for example). One
case that was allowed before that this doesn't allow is a file in the
`webwork2/htdocs/images` directory. I don't really see a need to allow
those files though.

For the standalone renderer that is the root directory of the standalone
renderer app (by default).

This could be considered for a hotfix as @drdrew42 mentioned in #1392.
This is the same one that the dependabot made a pull request to main
for except updates to the latest version of `postcss`.
Fix the aria label for the zoom out button of the imageview dialog.
Update the version to 2.21 and the copyright years to include 2026.
This is a result of a workaround for a bug in the JSXGraph library and
failure to properly convert all of the code in the `keyDownListener`
function to work outside of the library.  The `Const` object is not
defined.  To access those constants instead the `JXG` global object must
be used.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants