-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Use named groups in mathtext parser. #21448
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
3855e16
to
b970df6
Compare
I'll milestone this as RC for mpl3.5, although for that release most likely we could (should) just extract the minimal patch (above, in the Edit: ...) to specifically fix compat with pyparsing 3. |
- Code suggestion taken from matplotlib#21448 - Removed all pyparsing pinning. If this runs through CI, the fix is proven to be working.
We should only backport the minimal fix as suggested. I've created #21454 for this. So we can remilestone to 3.6 and remove the "release critical" tag here. |
- Code suggestion taken from matplotlib#21448 - Removed all pyparsing pinning. If this runs through CI, the fix is proven to be working.
I know, I was just letting someone else do the work :-) |
- Code suggestion taken from matplotlib#21448 - Removed all pyparsing pinning. If this runs through CI, the fix is proven to be working.
I suggest you remove the pyparsing pinning in this PR as well to make sure it solves the issue. |
This is already done in the second commit. |
fb6fe24
to
bd30b7b
Compare
Seems also a bit faster, see #20821 (comment). Edit: self-contained perf test: MPLBACKEND=agg python -c 'import time; from pylab import *; from matplotlib.tests.test_mathtext import math_tests; fig = figure(figsize=(3, 10)); fig.text(0, 0, "\n".join(filter(None, math_tests)), size=6); start = time.perf_counter(); [fig.canvas.draw() for _ in range(10)]; print((time.perf_counter() - start) / 10)' before: ~1.02s; after: ~0.81s. |
This makes the definitions much easier to read, by removing the need to use Group() and Suppress(): previously, these would be used to nest the parsed tokens and remove the unnecessary ones (e.g, braces), but such tokens can also easily be ignored by giving names to the tokens we use (instead of accessing them by position). (See e.g. the implementation of subsuper, which is also somewhat simplified.) Also remove a few other pyparsing combinators that are not needed: Combine (just concatenate the strings ourselves), FollowedBy (use lookahead regexes), Literal (use plain strings, in particular braces which are very common). Also remove right_delim_safe, as self._right_delim already includes the backslash-escaped closing brace rather than the unescaped one (right_delim_safe dates back to when it didn't). The error message for `a^2_2^2` now changed to "double superscript" as we now simply check for subscripts and superscripts one at a time, and fail when we see either two subscript or two superscripts, emitting the corresponding error.
This makes the definitions much easier to read, by removing the need to
use Group() and Suppress(): previously, these would be used to nest the
parsed tokens and remove the unnecessary ones (e.g, braces), but such
tokens can also easily be ignored by giving names to the tokens we use
(instead of accessing them by position). (See e.g. the implementation
of subsuper, which is also somewhat simplified.)
Also remove a few other pyparsing combinators that are not
needed: Combine (just concatenate the strings ourselves), FollowedBy
(use lookahead regexes), Literal (use plain strings, in particular
braces which are very common).
Also remove right_delim_safe, as self._right_delim already includes the
backslash-escaped closing brace rather than the unescaped one
(right_delim_safe dates back to when it didn't).
The error message for
a^2_2^2
now changed to "double superscript" aswe now simply check for subscripts and superscripts one at a time, and
fail when we see either two subscript or two superscripts, emitting the
corresponding error.
(I played a bit with the parser to try and see what's wrong with pyparsing 3and got there; unfortunately this patch doesn't fix the incompatibility :-()
Edit: This seems to fix support with pyparsing 3. It's not totally clear why, though...
A much more minimal fix would be
I still don't know whether that's a bug or an intended API change on pyparsing's side.
PR Summary
PR Checklist
pytest
passes).flake8
on changed files to check).flake8-docstrings
and runflake8 --docstring-convention=all
).doc/users/next_whats_new/
(follow instructions in README.rst there).doc/api/next_api_changes/
(follow instructions in README.rst there).