From 9b001a56f1ad36ebfb269d188b5f231b39d8baea Mon Sep 17 00:00:00 2001 From: mehedi8603651 Date: Sun, 8 Mar 2026 22:40:13 +0800 Subject: [PATCH] Support Flutter 3.38 and refresh package release --- .gitignore | 4 + .pubignore | 8 + CHANGELOG.md | 13 + README.md | 183 ++++--- doc/img/delta.png | Bin 10428 -> 10042 bytes doc/img/fourier.png | Bin 16942 -> 16201 bytes doc/img/leftright.png | Bin 2670 -> 2576 bytes doc/img/matrix.png | Bin 937 -> 974 bytes doc/img/nary.png | Bin 2614 -> 2413 bytes doc/img/schrodinger.png | Bin 25153 -> 26153 bytes doc/img/stretchyop.png | Bin 557 -> 575 bytes doc/img/underover.png | Bin 1707 -> 1852 bytes example/README.md | 23 +- example/pubspec.lock | 451 +++++++++++------- example/pubspec.yaml | 5 +- lib/flutter_math.dart | 3 +- lib/src/ast/nodes/accent.dart | 2 +- lib/src/ast/nodes/accent_under.dart | 2 +- lib/src/ast/nodes/enclosure.dart | 2 +- lib/src/ast/nodes/frac.dart | 2 +- lib/src/ast/nodes/matrix.dart | 30 +- lib/src/ast/nodes/over.dart | 4 +- lib/src/ast/nodes/phantom.dart | 2 +- lib/src/ast/nodes/sqrt.dart | 4 +- lib/src/ast/nodes/symbol.dart | 2 +- lib/src/ast/syntax_tree.dart | 3 +- lib/src/encoder/tex/encoder.dart | 2 +- lib/src/encoder/tex/functions/frac.dart | 1 - lib/src/encoder/tex/functions/style.dart | 4 +- lib/src/font/metrics/font_metrics.dart | 4 +- lib/src/font/metrics/unicode_scripts.dart | 2 +- .../tex/functions/katex_base/delimsizing.dart | 2 +- .../parser/tex/functions/katex_base/font.dart | 1 - lib/src/parser/tex/macros.dart | 46 +- lib/src/parser/tex/parser.dart | 6 +- lib/src/parser/tex/settings.dart | 6 +- lib/src/render/layout/eqn_array.dart | 2 +- lib/src/render/layout/line_editable.dart | 7 +- lib/src/render/layout/reset_dimension.dart | 1 - lib/src/render/layout/vlist.dart | 3 +- lib/src/render/svg/svg_string.dart | 5 +- lib/src/utils/canvas_kit/canvas_kit_web.dart | 8 +- lib/src/widgets/math.dart | 17 +- lib/src/widgets/selectable.dart | 313 +++++++++--- .../selection/gesture_detector_builder.dart | 5 + lib/src/widgets/selection/overlay.dart | 94 ++-- .../widgets/selection/overlay_manager.dart | 5 + .../selection/web_selection_manager.dart | 28 ++ pubspec.yaml | 17 +- test/golden/29221604.png | Bin 1395 -> 1418 bytes test/golden/355369240.png | Bin 549 -> 582 bytes test/golden/750111939.png | Bin 571 -> 620 bytes test/golden/860616833.png | Bin 619 -> 649 bytes test/golden/928722428.png | Bin 692 -> 676 bytes test/golden/Overrightarrow76505663.png | Bin 923 -> 1512 bytes test/golden/acute267057593.png | Bin 569 -> 922 bytes test/golden/bar574947087.png | Bin 445 -> 823 bytes test/golden/breve107975770.png | Bin 567 -> 942 bytes test/golden/check842862033.png | Bin 572 -> 917 bytes test/golden/ddot349178810.png | Bin 568 -> 929 bytes test/golden/dot270815021.png | Bin 528 -> 893 bytes test/golden/enclosure.png | Bin 1829 -> 1942 bytes test/golden/eqnarray.png | Bin 1130 -> 1140 bytes test/golden/grave165690505.png | Bin 568 -> 922 bytes test/golden/hat823583055.png | Bin 583 -> 952 bytes test/golden/mathring740120027.png | Bin 589 -> 956 bytes test/golden/overleftarrow567687850.png | Bin 920 -> 1418 bytes test/golden/overleftharpoon580184352.png | Bin 771 -> 1173 bytes test/golden/overleftrightarrow424866188.png | Bin 1002 -> 1763 bytes test/golden/overline53006047.png | Bin 428 -> 844 bytes test/golden/overrightarrow138596512.png | Bin 883 -> 1423 bytes test/golden/overrightharpoon301951104.png | Bin 795 -> 1211 bytes test/golden/text-accents-1.png | Bin 1162 -> 1905 bytes test/golden/text-accents-2.png | Bin 992 -> 1565 bytes test/golden/tilde150386117.png | Bin 559 -> 904 bytes test/golden/undergroup274196240.png | Bin 848 -> 1420 bytes test/golden/underleftarrow1031964323.png | Bin 918 -> 1378 bytes test/golden/underleftrightarrow128845106.png | Bin 980 -> 1710 bytes test/golden/underline160699299.png | Bin 440 -> 881 bytes test/golden/underrightarrow963759956.png | Bin 858 -> 1368 bytes test/golden/unicode-accents.png | Bin 1458 -> 1845 bytes test/golden/utilde829741846.png | Bin 1175 -> 1833 bytes test/golden/vec928772845.png | Bin 608 -> 1398 bytes test/golden/widecheck478155530.png | Bin 1060 -> 1642 bytes test/golden/widehat812256357.png | Bin 1044 -> 1614 bytes test/golden/widetilde326421305.png | Bin 1133 -> 1856 bytes test/helper.dart | 83 +++- test/katex_spec_test.dart | 40 +- test/widgets/selectable_test.dart | 2 +- 89 files changed, 951 insertions(+), 496 deletions(-) create mode 100644 .pubignore diff --git a/.gitignore b/.gitignore index e38ed2a3..adce420a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,9 @@ coverage .pub/ build/ pubspec.lock +!example/pubspec.lock +/test/failures/ +/test/golden/temp/ # Android related **/android/**/gradle-wrapper.jar @@ -72,6 +75,7 @@ pubspec.lock **/ios/Flutter/app.zip **/ios/Flutter/flutter_assets/ **/ios/Flutter/flutter_export_environment.sh +**/ios/Flutter/ephemeral/ **/ios/ServiceDefinitions.json **/ios/Runner/GeneratedPluginRegistrant.* diff --git a/.pubignore b/.pubignore new file mode 100644 index 00000000..9075a29e --- /dev/null +++ b/.pubignore @@ -0,0 +1,8 @@ +# Generated local build and test artifacts. +/build/ +/test/failures/ +/test/golden/temp/ + +# Local example artifacts that should not ship with the package. +/example/pubspec.lock +/example/ios/Flutter/ephemeral/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 916cefb0..8e531526 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## 0.8.0 + +* Add compatibility updates for Flutter `3.38.x` and Dart `3.10.x`. +* Raise the minimum Flutter version to `3.38.0`. +* Update package constraints for `flutter_svg`, `provider`, `collection`, and `tuple`. +* Remove the direct `meta` dependency because the current Flutter SDK pins `meta` through `flutter_test`. +* Clean up deprecated Flutter API usage across rendering, selection, web, and tests. +* **Breaking:** replace direct `ToolbarOptions` usage with `SelectableMathToolbarOptions` in `SelectableMath`. +* Fix selection toolbar behavior and focus handling on current Flutter releases. +* Fix matrix child updates, font metric fallback lookup, and other null-safety/code-structure issues. +* Update the example app SDK constraints and package resolution for the current Flutter toolchain. +* Refresh golden files and documentation for the current renderer output. + ## 0.7.4 * Add support for flutter 3.32.0 diff --git a/README.md b/README.md index 4422cfb3..b6e28a00 100644 --- a/README.md +++ b/README.md @@ -1,121 +1,158 @@ -# Flutter Math +# Flutter Math Fork -[![Build Status](https://travis-ci.com/znjameswu/flutter_math.svg?branch=master)](https://travis-ci.com/znjameswu/flutter_math) [![codecov](https://codecov.io/gh/znjameswu/flutter_math/branch/master/graph/badge.svg)](https://codecov.io/gh/znjameswu/flutter_math) [![Pub Version](https://img.shields.io/pub/v/flutter_math_fork)](https://pub.dev/packages/flutter_math_fork) +[![Pub Version](https://img.shields.io/pub/v/flutter_math_fork)](https://pub.dev/packages/flutter_math_fork) +Math equation rendering in pure Dart and Flutter, with a parser derived from +[KaTeX](https://github.com/KaTeX/KaTeX). -## ⚠ fork +## Fork status -This is a fork of [flutter_math](https://github.com/znjameswu/flutter_math) addressing compatibility -problems while `flutter_math` is not being maintained. +`flutter_math_fork` is a maintained fork of +[flutter_math](https://github.com/znjameswu/flutter_math), with active updates +in [simpleclub/flutter_math](https://github.com/simpleclub/flutter_math) to keep +the package working on current Flutter stable releases. ---- +This release is tested with Flutter `3.38.9` on the stable channel. +## Features +* TeX math parsing and rendering in pure Flutter. +* Selectable math with copy and select-all support. +* Manual parser and AST APIs for advanced integrations. +* TeX-style line breaking support. -Math equation rendering in pure Dart & Flutter. +Unsupported or partially supported KaTeX features are documented in +[doc/unsupported.md](doc/unsupported.md). +## Installation -This project aims to achieve maximum compatibility and fidelity with regard to the [KaTeX](https://github.com/KaTeX/KaTeX) project, while maintaining the performance advantage of Dart and Flutter. A further [UnicodeMath](https://www.unicode.org/notes/tn28/UTN28-PlainTextMath-v3.1.pdf)-style equation editing support will be experimented in the future. +Add the package to your `pubspec.yaml`: +```yaml +dependencies: + flutter_math_fork: ^0.8.0 +``` -The TeX parser is a Dart port of the KaTeX parser. There are only a few unsupported features and parsing differences compared to the original KaTeX parser. List of some unsupported features can be found [here](doc/unsupported.md). - -## [Online Demo](https://znjameswu.github.io/flutter_math_demo/) - -## Rendering Samples - -`x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}` - -![Example1](https://raw.githubusercontent.com/znjameswu/flutter_math/master/doc/img/delta.png) - -`i\hbar\frac{\partial}{\partial t}\Psi(\vec x,t) = -\frac{\hbar}{2m}\nabla^2\Psi(\vec x,t)+ V(\vec x)\Psi(\vec x,t)` - -![Example2](https://raw.githubusercontent.com/znjameswu/flutter_math/master/doc/img/schrodinger.png) - -`\hat f(\xi) = \int_{-\infty}^\infty f(x)e^{- 2\pi i \xi x}\mathrm{d}x` - -![Example3](https://raw.githubusercontent.com/znjameswu/flutter_math/master/doc/img/fourier.png) - +The current release targets Flutter `3.38.0` or newer. -## How to use +## Quick start -Add `flutter_math` to your `pubspec.yaml` dependencies +Render a display equation: -### Mobile -Currently only Android platform has been tested. If you encounter any issues with iOS, please file them. +```dart +import 'package:flutter/material.dart'; +import 'package:flutter_math_fork/flutter_math.dart'; -### Web -Web support is added in v0.1.6. It is tested for DomCanvas backend. In general it should behave largely the same with mobile. It is expected to break with CanvasKit backend. Check out the [Online Demo](https://znjameswu.github.io/flutter_math_demo/) +Math.tex( + r'x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}', + mathStyle: MathStyle.display, + textStyle: const TextStyle(fontSize: 24), +) +``` -## API usage (v0.2.0) -The usage is straightforward. Just `Math.tex(r'\frac a b')`. There is also optional arguments of `TexParserSettings settings`, which corresponds to Settings in KaTeX and support a subset of its features. +Render inline math: -Display-style equations: ```dart -Math.tex(r'\frac a b', mathStyle: MathStyle.display) // Default +Math.tex( + r'\frac a b', + mathStyle: MathStyle.text, +) ``` -In-line equations +Control sizing explicitly with `MathOptions`: + ```dart -Math.tex(r'\frac a b', mathStyle: MathStyle.text) +Math.tex( + r'\int_0^\infty e^{-x^2}\,\mathrm{d}x', + options: MathOptions( + style: MathStyle.display, + fontSize: 22, + ), +) ``` -The default size of the equation is obtained from the build context. If you wish to specify the size, you can use `textStyle`. Note: this parameter will also change how big 1cm/1pt/1inch is rendered on the screen. If you wish to specify the size of those absolute units, use `logicalPpi` +## Selectable math + +Use `SelectableMath` when the user should be able to select or copy the TeX: ```dart -Math.tex( +SelectableMath.tex( r'\frac a b', - textStyle: TextStyle(fontSize: 42), - // logicalPpi: MathOptions.defaultLogicalPpiFor(42), + textStyle: const TextStyle(fontSize: 24), + toolbarOptions: const SelectableMathToolbarOptions( + copy: true, + selectAll: true, + ), ) ``` -There is also a selectable variant `SelectableMath` that creates selectable and copy-able equations on both mobile and web. (EXPERIMENTAL) Users can select part of the equation and obtain the encoded TeX strings. The usage is similar to Flutter's `SelectableText`. +Starting with `0.8.0`, `SelectableMath.toolbarOptions` uses the package-owned +`SelectableMathToolbarOptions` type instead of Flutter's deprecated +`ToolbarOptions`. -```dart -SelectableMath.tex(r'\frac a b', textStyle: TextStyle(fontSize: 42)) -``` +## Error handling + +Provide `onErrorFallback` to render your own widget when parsing or building +fails: -If you would like to display custom styled error message, you should use `onErrorFallback` parameter. You can also process the errors in this function. But beware this function is called in build function. ```dart Math.tex( - r'\garbled $tring', - textStyle: TextStyle(color: Colors.green), + r'\garbled $tring', onErrorFallback: (err) => Container( color: Colors.red, - child: Text(err.messageWithType, style: TextStyle(color: Colors.yellow)), + padding: const EdgeInsets.all(8), + child: Text( + err.messageWithType, + style: const TextStyle(color: Colors.white), + ), ), ) ``` -If you wish to have more granularity dealing with equations, you can manually invoke the parser and supply AST into the widget. +## Advanced usage + +For manual parsing and AST handling: + ```dart -SyntaxTree ast; -try { - ast = SyntaxTree(greenRoot: TexParser(r'\frac a b', TexParserSettings()).parse()); -} on ParseException catch (e) { - // Handle my error here -} - -SelectableMath( +import 'package:flutter_math_fork/flutter_math.dart'; +import 'package:flutter_math_fork/tex.dart'; + +final ast = SyntaxTree( + greenRoot: TexParser( + r'\frac a b', + const TexParserSettings(), + ).parse(), +); + +final widget = SelectableMath( ast: ast, mathStyle: MathStyle.text, - textStyle: TextStyle(fontSize: 42), -) + textStyle: const TextStyle(fontSize: 24), +); ``` -## [Line Breaking](doc/line_breaking.md) +See also: + +* [doc/line_breaking.md](doc/line_breaking.md) +* [doc/design.md](doc/design.md) + +## Rendering samples + +`x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}` + +![Quadratic equation](doc/img/delta.png) + +`i\hbar\frac{\partial}{\partial t}\Psi(\vec x,t) = -\frac{\hbar}{2m}\nabla^2\Psi(\vec x,t)+ V(\vec x)\Psi(\vec x,t)` + +![Schrodinger equation](doc/img/schrodinger.png) + +`\hat f(\xi) = \int_{-\infty}^\infty f(x)e^{- 2\pi i \xi x}\mathrm{d}x` + +![Fourier transform](doc/img/fourier.png) ## Credits -This project is possible thanks to the inspirations and resources from [the KaTeX Project](https://katex.org/), [MathJax](www.mathjax.org), [Zefyr](https://github.com/memspace/zefyr), and [CaTeX](https://github.com/simpleclub/CaTeX). - -## Goals -- [x] : TeX math parsing (See [design doc](doc/design.md)) -- [x] : AST rendering in flutter -- [x] : Selectable widget -- [x] : TeX output (WIP) -- [ ] : UnicodeMath parsing and encoding -- [ ] : [UnicodeMath](https://www.unicode.org/notes/tn28/UTN28-PlainTextMath-v3.1.pdf)-style editing -- [ ] : Breakable equations -- [ ] : MathML parsing and encoding +This project draws heavily from the work of +[KaTeX](https://katex.org/), [MathJax](https://www.mathjax.org/), +[Zefyr](https://github.com/memspace/zefyr), and +[CaTeX](https://github.com/simpleclub/CaTeX). diff --git a/doc/img/delta.png b/doc/img/delta.png index 9ea880f71b0309440b8ffcc5e210ff2a882a1099..8d93671b2c9af0dbd73e013f3b0eec2f126f7d5c 100644 GIT binary patch literal 10042 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 DfN6i1 literal 10428 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 literal 16942 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 delta 2668 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 a8UF*UidM#|m57Z10000^=#e|Skm zK~#90?VCM_6HyR=KSc{!yCZ^?0XvC`D5kJbNFxe|t)vhvJkCN9Vj~>lb%G!fxx@0V zu@yZhNW-b>v1nwK}(yqQdPXJ_9`Kv5J$Q4~c{ z6jz)8o`p6-SOhMl9kknzE%jqhe`o_Hkl8E;)#Z%s0DWKu*Z~@@71qVEo4^`y5qJsw zDzR3k7+aT6Fo?bW>_cH)91Czv#`TixXpFTuCF3_A%If4;6Bh?5$E6WG#zu149F_SS zU_WpKxam;uFdD!~U>TSZ8x8|6fG3`9DMeFaSuZA=msF=;V7;Yp2Qr59O(cQ7+OBLMAywQ~}F`Xc96U@mt%3?TBQg6oz!W0OLViM#U!*ByzgbZgU^o6G-$jMEZ} zePHx_wd7}IeCI-G)sFouf8&}ZKQH4K8Lt7`73)r7n4ShOC*ff==Xyb6>_CjY9Fui{ zbMksyF2Sc2>m9|0Y`mP2c?3L=oc4}KJ4zEt+**;C+7+4Ew(A!N17)*#g)x*r=7b!>h##)d>=Y<@JxhD05ke;?a02tj;qp4UC-E6;EKF{??ORc9ZPKU-QGJ+Lt|_T$7QrD3zbmkJho_YGgBVx z!?A7PIxq!n0pEf99!oRGUH>X@NbGnB+!#{1ofvv@*ER9XbjZx)T&GM{(6O2|BC(-p z^GK!`>yqA(2918fe=k(jv8MFhv*a@(Zzp_i6hR%^O6b#S4(X7|LQ%(>T-AO6Fh8)b z5`1OMC-h1crHEsjj+#d@;VRvllhI3)Zvv*={nnD(%_Dgki#)c>pD3#0hc!3(t7#r_ zQVMtF*yR!LwLI1J|Hx=R0GMWy4YB25&UI&jS7`^ia_oYPfAJU_i9>ID>JeB4KE>Lb zBC7#zTi$!^LisKiiwbRtwOca(4LmQ4o1ftOu~o7cI1t(hVG7t6+6YBa g6h%=KMRCDD6tlFahh$hxGXMYp07*qoM6N<$g4F@J2><{9 delta 920 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℘Xo}4csb3x&)-f$ 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 literal 25153 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 delta 1696 zcmV;R24DHS4yz3ziBL{Q4GJ0x0000DNk~Le0002w000122nGNE02B%7R*@kfe^p6D zK~#90?cGg?++-Zb@vpYG5gCL%s0RlT3bN83ihJzBKoNv>g`(5}TRphwK`Sf>1@R3; z@zAb^f(o`3iWkARA|jM-5qpq|mG&wwNTE<AR!u1XQ308~`2xJ^*$DcL5IrM}f`y zk|xqVOKv^{mSf>VV7B_?h_qWDD_DZA|fIp zA|fIM?Wj8eHCP1h2Cmhe5RtY!32b1OJr38L7LnHKVwrIW%mc^W>sRVblt>#r0sMhw zz$3BnRTp+1*i%EgL|UN->;sMwWyB#?D#mq*GUX8X6)Q3Kx%Wi2m3gchc%JA_9pbcs zoyZyI_?XXyGOfF9d<;FEea+p8Nw(5%o?A=Hkf-w~V>VWv9s|1AQ95~c z@nJmZf2xO-l!LkxA|fIp zA|g_umAVr!B~4l{-ziwr1hrmm=;TUd+farS3CPZz@jJka*uXUaKM)OEQ{>sgCO%!! zNsp3Q4|tyF_PGHJPTn+Tt!_>Kl;$Z`B2LCcBofeTL#gOE3V9?Fp8`GP6g3x4jxDr*~Z5gQNV<3#vw zH~%fqk4`}kJ6J5G#Pfsfr0swO_kI18c+>W(n}3lAf7H#deN>dO**2{7dLZGsiDRU>@7 zEJrtA9n3qW9Xxz#m#mdACT)4+k1{jCdiW_V^FXv+)Ap(V&a^c9cxeaNX|9(q9g_!{ zGHN9w`D*F7e;u7A!=x!%Wu3t`OqM_S3h77azKd66V-~Hl`W>3Ae)|29T-UtuCrMAy zs-52^S+{>$$+v{<_aXx(6u$AFiKs;qOsv+niHSa_yk53}AFa1?kAYe)WtU0{A1co%pN_}#^k@@xVJ zfVYUMe?BLGPu=UYz_&zaPV>f>a-6|#jyZ|tjVstq7#Fd#-urQ2BE+ywrt@b~VY^7mgSYNs|yRqHkF{Ud=HV*Succ#hD_TA zcM|ti-3gIub+JoO>fJmHJ>W}he_W=SPc%u2e|V-GVrTvip+7@ay4YxIz8~Wu)+=D< zgJYhd1Y~>YV%4L4Bi{2vErehV>v;QXEM0jVBFy0)k{Ry;_FzWd^^*ol4m%L)w2rlV z(@OEKi?<#?n$xB=ChSpOC1mq0VkOCZTEq&C8a!wXc#_d2_#Ui1mMnq(9uvPVt4u!7 zf0Ib<{P6O=BwuH1$>Psa`jY23VI5pV8tDkp075>)%@ds%(V#*i6^job)N^xPG7zaz z{L+mwqeuXDVkKnWZc0T&L_|bHL_|bHq}6mUtAwJDJ)!as@FVaLunV{bd{kq)L|SQy zsPk>#uc=>djZiwdl6IQ`egYoEIy^h)cEUSYU$d>D3@IVFf%O-=m#DXIu*a^xt0hGu zvSkQ5zdTE^0d+(qCqJB?AFwIjeoT(&)mS^~PJoEB3-}NC#w~AR0|MWN4M3}YX+%Us qL_|bHL_|bHL_|bHL_|bHn&*Fn?~o|y2SWe=0000=3.7.0-0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 62ad6730..a128a620 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -7,7 +7,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.12.0 <3.0.0" + sdk: ">=3.0.0 <4.0.0" + flutter: ">=3.38.0" dependencies: flutter: @@ -16,7 +17,7 @@ dependencies: flutter_math_fork: path: ../ - provider: any + provider: ^6.1.5+1 flutter_tex: ^4.0.3+4 google_fonts: ^4.0.4 diff --git a/lib/flutter_math.dart b/lib/flutter_math.dart index cc757a85..ccb11c57 100644 --- a/lib/flutter_math.dart +++ b/lib/flutter_math.dart @@ -11,4 +11,5 @@ export 'src/parser/tex/parse_error.dart'; export 'src/parser/tex/settings.dart'; export 'src/widgets/exception.dart'; export 'src/widgets/math.dart'; -export 'src/widgets/selectable.dart' show SelectableMath; +export 'src/widgets/selectable.dart' + show SelectableMath, SelectableMathToolbarOptions; diff --git a/lib/src/ast/nodes/accent.dart b/lib/src/ast/nodes/accent.dart index 1f4cfcda..278cd7a3 100644 --- a/lib/src/ast/nodes/accent.dart +++ b/lib/src/ast/nodes/accent.dart @@ -105,7 +105,7 @@ class AccentNode extends SlotableNode { padding: EdgeInsets.only(bottom: 3 * defaultRuleThickness), child: Container( width: constraints.minWidth, - height: defaultRuleThickness, // TODO minRuleThickness + height: defaultRuleThickness, // minRuleThickness color: options.color, ), ); diff --git a/lib/src/ast/nodes/accent_under.dart b/lib/src/ast/nodes/accent_under.dart index 9f287760..5745305e 100644 --- a/lib/src/ast/nodes/accent_under.dart +++ b/lib/src/ast/nodes/accent_under.dart @@ -52,7 +52,7 @@ class AccentUnderNode extends SlotableNode { padding: EdgeInsets.only(top: 3 * defaultRuleThickness), child: Container( width: constraints.minWidth, - height: defaultRuleThickness, // TODO minRuleThickness + height: defaultRuleThickness, // minRuleThickness color: options.color, ), ); diff --git a/lib/src/ast/nodes/enclosure.dart b/lib/src/ast/nodes/enclosure.dart index 51bdb8a9..c0c1fae5 100644 --- a/lib/src/ast/nodes/enclosure.dart +++ b/lib/src/ast/nodes/enclosure.dart @@ -60,7 +60,7 @@ class EnclosureNode extends SlotableNode { ? BoxDecoration( color: backgroundcolor, border: Border.all( - // TODO minRuleThickness + // minRuleThickness width: options.fontMetrics.fboxrule.cssEm.toLpUnder(options), color: bordercolor ?? options.color, diff --git a/lib/src/ast/nodes/frac.dart b/lib/src/ast/nodes/frac.dart index 324d2849..15973783 100644 --- a/lib/src/ast/nodes/frac.dart +++ b/lib/src/ast/nodes/frac.dart @@ -23,7 +23,7 @@ class FracNode extends SlotableNode { final Measurement? barSize; /// Whether it is a continued frac `\cfrac`. - final bool continued; // TODO continued + final bool continued; // continued FracNode({ // this.options, diff --git a/lib/src/ast/nodes/matrix.dart b/lib/src/ast/nodes/matrix.dart index b545e570..8006e27b 100644 --- a/lib/src/ast/nodes/matrix.dart +++ b/lib/src/ast/nodes/matrix.dart @@ -178,7 +178,7 @@ class MatrixNode extends SlotableNode { .mapIndexed((index, result) => result == null ? null : CustomLayoutId(id: index, child: result.widget)) - .whereNotNull() + .nonNulls .toList(growable: false), ), ), @@ -206,12 +206,12 @@ class MatrixNode extends SlotableNode { @override MatrixNode updateChildren(List newChildren) { assert(newChildren.length >= rows * cols); - var body = List>.generate( + final updatedBody = List>.generate( rows, - (i) => newChildren.sublist(i * cols + (i + 1) * cols), + (i) => newChildren.sublist(i * cols, (i + 1) * cols), growable: false, ); - return copyWith(body: body); + return copyWith(body: updatedBody); } MatrixNode copyWith({ @@ -340,15 +340,13 @@ class MatrixLayoutDelegate extends IntrinsicLayoutDelegate { // Determine position of children final childPos = List.generate(rows * cols, (index) { final col = index % cols; - switch (columnAligns[col]) { - case MatrixColumnAlign.left: - return colPos[col]; - case MatrixColumnAlign.right: - return colPos[col] + colWidths[col] - childWidths[index]; - case MatrixColumnAlign.center: - default: - return colPos[col] + (colWidths[col] - childWidths[index]) / 2; - } + return switch (columnAligns[col]) { + MatrixColumnAlign.left => colPos[col], + MatrixColumnAlign.right => + colPos[col] + colWidths[col] - childWidths[index], + MatrixColumnAlign.center => + colPos[col] + (colWidths[col] - childWidths[index]) / 2, + }; }, growable: false); if (!isComputingIntrinsics) { @@ -461,7 +459,8 @@ class MatrixLayoutDelegate extends IntrinsicLayoutDelegate { paint); } break; - default: + case MatrixSeparatorStyle.none: + break; } } @@ -493,7 +492,8 @@ class MatrixLayoutDelegate extends IntrinsicLayoutDelegate { paint); } break; - default: + case MatrixSeparatorStyle.none: + break; } } } diff --git a/lib/src/ast/nodes/over.dart b/lib/src/ast/nodes/over.dart index 76ec74cb..1f6ea7af 100644 --- a/lib/src/ast/nodes/over.dart +++ b/lib/src/ast/nodes/over.dart @@ -65,12 +65,12 @@ class OverNode extends SlotableNode { @override AtomType get leftType => stackRel ? AtomType.rel - : AtomType.ord; // TODO: they should align with binrelclass with base + : AtomType.ord; // they should align with binrelclass with base @override AtomType get rightType => stackRel ? AtomType.rel - : AtomType.ord; // TODO: they should align with binrelclass with base + : AtomType.ord; // they should align with binrelclass with base @override bool shouldRebuildWidget(MathOptions oldOptions, MathOptions newOptions) => diff --git a/lib/src/ast/nodes/phantom.dart b/lib/src/ast/nodes/phantom.dart index f9d0555b..624f785c 100644 --- a/lib/src/ast/nodes/phantom.dart +++ b/lib/src/ast/nodes/phantom.dart @@ -12,7 +12,7 @@ class PhantomNode extends LeafNode { Mode get mode => Mode.math; /// The phantomed child. - // TODO: suppress editbox in edit mode + // suppress editbox in edit mode // If we use arbitrary GreenNode here, then we will face the danger of // transparent node final EquationRowNode phantomChild; diff --git a/lib/src/ast/nodes/sqrt.dart b/lib/src/ast/nodes/sqrt.dart index f0b6d941..f5de8ac9 100644 --- a/lib/src/ast/nodes/sqrt.dart +++ b/lib/src/ast/nodes/sqrt.dart @@ -316,8 +316,8 @@ Widget sqrtSvg({ final extraViniculum = 0.0; //math.max(0.0, options) // final ruleWidth = - // options.fontMetrics.sqrtRuleThickness.cssEm.toLpUnder(options); - // TODO: support Settings.minRuleThickness. + // options.fontMetrics.sqrtRuleThickness.cssEm.toLpUnder(options); + // support Settings.minRuleThickness. // These are the known height + depth for \u221A if (delimConf != null) { diff --git a/lib/src/ast/nodes/symbol.dart b/lib/src/ast/nodes/symbol.dart index 3ec674b9..cbbb8280 100644 --- a/lib/src/ast/nodes/symbol.dart +++ b/lib/src/ast/nodes/symbol.dart @@ -86,7 +86,7 @@ class SymbolNode extends LeafNode { } return SyntaxNode(parent: null, value: res, pos: 0).buildWidget(options); } else { - // TODO: log a warning here. + //log a warning here. return BuildResult( widget: Container( height: 0, diff --git a/lib/src/ast/syntax_tree.dart b/lib/src/ast/syntax_tree.dart index 3491b637..11dfda11 100644 --- a/lib/src/ast/syntax_tree.dart +++ b/lib/src/ast/syntax_tree.dart @@ -550,7 +550,7 @@ class EquationRowNode extends ParentableNode flattenedBuildResults.length, (index) => LineElement( child: flattenedBuildResults[index].widget, - canBreakBefore: false, // TODO + canBreakBefore: false, alignerOrSpacer: flattenedChildList[index] is SpaceNode && (flattenedChildList[index] as SpaceNode).alignerOrSpacer, trailingMargin: childSpacingConfs[index].spacingAfter, @@ -813,7 +813,6 @@ enum AtomType { inner, spacing, // symbols - } /// Only for improvisional use during parsing. Do not use. diff --git a/lib/src/encoder/tex/encoder.dart b/lib/src/encoder/tex/encoder.dart index 219f2d63..0d424403 100644 --- a/lib/src/encoder/tex/encoder.dart +++ b/lib/src/encoder/tex/encoder.dart @@ -194,7 +194,7 @@ class TexCommandEncodeResult extends EncodeResult { if (index < numOptionalArgs) { return string.isEmpty ? '' : '[$string]'; } else { - return '{$string}'; // TODO optimize + return '{$string}'; // optimize } }, ).join(); diff --git a/lib/src/encoder/tex/functions/frac.dart b/lib/src/encoder/tex/functions/frac.dart index a68a2b63..b5425ff2 100644 --- a/lib/src/encoder/tex/functions/frac.dart +++ b/lib/src/encoder/tex/functions/frac.dart @@ -98,7 +98,6 @@ final _fracOptimizationEntries = [ final res = TexCommandEncodeResult( command: '\\genfrac', args: [ - // TODO leftRight.leftDelim == null ? null : SymbolNode(symbol: leftRight.leftDelim!), diff --git a/lib/src/encoder/tex/functions/style.dart b/lib/src/encoder/tex/functions/style.dart index 18738a21..86f77559 100644 --- a/lib/src/encoder/tex/functions/style.dart +++ b/lib/src/encoder/tex/functions/style.dart @@ -78,10 +78,12 @@ EncodeResult _optionsDiffEncode(OptionsDiff diff, List children) { } } if (diff.color != null) { + final rgbHex = + (diff.color!.toARGB32() & 0x00ffffff).toRadixString(16).padLeft(6, '0'); res = TexCommandEncodeResult( command: '\\textcolor', args: [ - '#${diff.color!.value.toRadixString(16).padLeft(6, '0')}', + '#$rgbHex', res, ], ); diff --git a/lib/src/font/metrics/font_metrics.dart b/lib/src/font/metrics/font_metrics.dart index 79ca00d3..53865a0d 100644 --- a/lib/src/font/metrics/font_metrics.dart +++ b/lib/src/font/metrics/font_metrics.dart @@ -209,7 +209,7 @@ CharacterMetrics? getCharacterMetrics( final extraCh = extraCharacterMap[character[0]]?.codeUnitAt(0); if (extraCh != null) { - return metricsMapFont[ch]; + return metricsMapFont[extraCh]; } if (mode == Mode.text && supportedCodepoint(ch)) { // We don't typically have font metrics for Asian scripts. @@ -241,7 +241,5 @@ FontMetrics getGlobalMetrics(MathSize size) { case MathSize.huge: case MathSize.HUGE: return textFontMetrics; - default: - throw ArgumentError(size); } } diff --git a/lib/src/font/metrics/unicode_scripts.dart b/lib/src/font/metrics/unicode_scripts.dart index b186551d..f1a58acd 100644 --- a/lib/src/font/metrics/unicode_scripts.dart +++ b/lib/src/font/metrics/unicode_scripts.dart @@ -51,7 +51,7 @@ const Map>> scriptData = { [0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana [0x4E00, 0x9FAF], // CJK ideograms [0xFF00, 0xFF60], // Fullwidth punctuation - // TODO: add halfwidth Katakana and Romanji glyphs + // add halfwidth Katakana and Romanji glyphs ], // Korean diff --git a/lib/src/parser/tex/functions/katex_base/delimsizing.dart b/lib/src/parser/tex/functions/katex_base/delimsizing.dart index f603cd10..1b087e4f 100644 --- a/lib/src/parser/tex/functions/katex_base/delimsizing.dart +++ b/lib/src/parser/tex/functions/katex_base/delimsizing.dart @@ -168,7 +168,7 @@ String? _checkDelimiter(GreenNode delim, FunctionContext context) { return delim.symbol; } } else { - // TODO: this throw omitted the token location + //this throw omitted the token location throw ParseException( "Invalid delimiter '${delim.symbol}' after '${context.funcName}'"); } diff --git a/lib/src/parser/tex/functions/katex_base/font.dart b/lib/src/parser/tex/functions/katex_base/font.dart index cf02758a..b138108d 100644 --- a/lib/src/parser/tex/functions/katex_base/font.dart +++ b/lib/src/parser/tex/functions/katex_base/font.dart @@ -62,7 +62,6 @@ GreenNode _fontHandler(TexParser parser, FunctionContext context) { GreenNode _boldSymbolHandler(TexParser parser, FunctionContext context) { final body = parser.parseArgNode(mode: null, optional: false)!; - // TODO // amsbsy.sty's \boldsymbol uses \binrel spacing to inherit the // argument's bin|rel|ord status return StyleNode( diff --git a/lib/src/parser/tex/macros.dart b/lib/src/parser/tex/macros.dart index 67a70a1f..55eeb9ca 100644 --- a/lib/src/parser/tex/macros.dart +++ b/lib/src/parser/tex/macros.dart @@ -134,7 +134,7 @@ String newcommand(MacroContext context, bool existsOK, bool nonexistsOK) { var argText = ''; var token = context.expandNextToken(); while (token.text != "]" && token.text != "EOF") { - // TODO: Should properly expand arg, e.g., ignore {}s + // Should properly expand arg, e.g., ignore {}s argText += token.text; token = context.expandNextToken(); } @@ -352,7 +352,7 @@ final Map builtinMacros = { // \newcommand{\macro}[args]{definition} // \renewcommand{\macro}[args]{definition} -// TODO: Optional arguments: \newcommand{\macro}[args][default]{definition} +// Optional arguments: \newcommand{\macro}[args][default]{definition} '\\newcommand': MacroDefinition.fromCtxString( (context) => newcommand(context, false, true)), @@ -396,7 +396,7 @@ final Map builtinMacros = { // '\\aa': MacroDefinition.fromString("\\r a"), // '\\AA': MacroDefinition.fromString("\\r A"), -// TODO these should be migrated into renderconfigs +// these should be migrated into renderconfigs // Characters omitted from Unicode range 1D400–1D7FF '\u212C': MacroDefinition.fromString("\\mathscr{B}"), // script '\u2130': MacroDefinition.fromString("\\mathscr{E}"), @@ -429,7 +429,7 @@ final Map builtinMacros = { // It's thus treated like a \mathrel, but defined by a symbol that has zero // width but extends to the right. We use \rlap to get that spacing. // For MathML we write U+0338 here. buildMathML.js will then do the overlay. -// TODO fold 'not' with applicable operators +// fold 'not' with applicable operators // defineMacro( // "\\not", // MacroDefinition.fromString( @@ -460,7 +460,7 @@ final Map builtinMacros = { // The KaTeX fonts have corners at codepoints that don't match Unicode. // For MathML purposes, use the Unicode code point. -// TODO strip useless @ +// strip useless @ '\\ulcorner': MacroDefinition.fromString("\\@ulcorner"), '\\urcorner': MacroDefinition.fromString("\\@urcorner"), '\\llcorner': MacroDefinition.fromString("\\@llcorner"), @@ -473,7 +473,7 @@ final Map builtinMacros = { // \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} // We'll call \varvdots, which gets a glyph from symbols.js. // The zero-width rule gets us an equivalent to the vertical 6pt kern. -// TODO should we accept \vdots's kern ? +//should we accept \vdots's kern ? '\\vdots': MacroDefinition.fromString("\\mathord{\\varvdots\\rule{0pt}{15pt}}"), '\u22ee': MacroDefinition.fromString("\\vdots"), @@ -484,7 +484,7 @@ final Map builtinMacros = { // Italic Greek capital letters. AMS defines these with \DeclareMathSymbol, // but they are equivalent to \mathit{\Letter}. -// TODO make them as overrided fonts +// make them as overrided fonts '\\varGamma': MacroDefinition.fromString("\\mathit{\\Gamma}"), '\\varDelta': MacroDefinition.fromString("\\mathit{\\Delta}"), '\\varTheta': MacroDefinition.fromString("\\mathit{\\Theta}"), @@ -505,7 +505,7 @@ final Map builtinMacros = { // \mkern-\thinmuskip{:}\mskip6muplus1mu\relax} // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} -// TODO fbox +//fbox '\\boxed': MacroDefinition.fromString("\\fbox{\$\\displaystyle{#1}\$}"), // \def\iff{\DOTSB\;\Longleftrightarrow\;} @@ -518,7 +518,7 @@ final Map builtinMacros = { // AMSMath's automatic \dots, based on \mdots@@ macro. '\\dots': MacroDefinition.fromCtxString((context) { - // TODO: If used in text mode, should expand to \textellipsis. + // If used in text mode, should expand to \textellipsis. // However, in KaTeX, \textellipsis and \ldots behave the same // (in text mode), and it's unlikely we'd see any of the math commands // that affect the behavior of \dots when in text mode. So fine for now @@ -567,32 +567,32 @@ final Map builtinMacros = { '\\tmspace': MacroDefinition.fromString( "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"), // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip +// math mode should use \thinmuskip '\\,': MacroDefinition.fromString("\\tmspace+{3mu}{.1667em}"), // \let\thinspace\, '\\thinspace': MacroDefinition.fromString("\\,"), // \def\>{\mskip\medmuskip} // \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu +// \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu '\\>': MacroDefinition.fromString("\\mskip{4mu}"), '\\:': MacroDefinition.fromString("\\tmspace+{4mu}{.2222em}"), // \let\medspace\: '\\medspace': MacroDefinition.fromString("\\:"), // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu +//math mode should use \thickmuskip = 5mu plus 5mu '\\;': MacroDefinition.fromString("\\tmspace+{5mu}{.2777em}"), // \let\thickspace\; '\\thickspace': MacroDefinition.fromString("\\;"), // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip +// math mode should use \thinmuskip '\\!': MacroDefinition.fromString("\\tmspace-{3mu}{.1667em}"), // \let\negthinspace\! '\\negthinspace': MacroDefinition.fromString("\\!"), // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip +// math mode should use \medmuskip '\\negmedspace': MacroDefinition.fromString("\\tmspace-{4mu}{.2222em}"), // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip +//math mode should use \thickmuskip '\\negthickspace': MacroDefinition.fromString("\\tmspace-{5mu}{.277em}"), // \def\enspace{\kern.5em } '\\enspace': MacroDefinition.fromString("\\kern.5em "), @@ -604,7 +604,7 @@ final Map builtinMacros = { '\\qquad': MacroDefinition.fromString("\\hskip2em\\relax"), // \tag@in@display form of \tag -// TODO tag +// tag '\\tag': MacroDefinition.fromString("\\@ifstar\\tag@literal\\tag@paren"), '\\tag@paren': MacroDefinition.fromString("\\tag@literal{({#1})}"), '\\tag@literal': MacroDefinition.fromCtxString((context) { @@ -622,11 +622,11 @@ final Map builtinMacros = { // \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} // \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu // \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu +//math mode should use \medmuskip = 4mu plus 2mu minus 4mu '\\bmod': MacroDefinition.fromString("\\mskip5mu" "\\mathbin{\\rm mod}" "\\mskip5mu"), -// TODO what should we do about \pod ? +// what should we do about \pod ? '\\pod': MacroDefinition.fromString("\\allowbreak" "\\mkern8mu(#1)"), '\\pmod': MacroDefinition.fromString("\\pod{{\\rm mod}\\mkern6mu#1}"), @@ -640,7 +640,7 @@ final Map builtinMacros = { '\\\\': MacroDefinition.fromString("\\newline"), // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. KaTeX doesn't +// Doesn't normally work in math mode because \@ fails. KaTeX doesn't // support \@ yet, so that's omitted, and we add \text so that the result // doesn't look funny in math mode. @@ -680,12 +680,12 @@ final Map builtinMacros = { ////////////////////////////////////////////////////////////////////// // mathtools.sty migrated to extra_symbols -// TODO: make as overrided type & font +// make as overrided type & font //\providecommand\ordinarycolon{:} '\\ordinarycolon': MacroDefinition.fromString(":"), //\def\vcentcolon{\mathrel{\mathop\ordinarycolon}} -//TODO(edemaine): Not yet centered. Fix via \raisebox or #726 +//(edemaine): Not yet centered. Fix via \raisebox or #726 '\\vcentcolon': MacroDefinition.fromString("\\mathrel{\\mathop\\ordinarycolon}"), @@ -727,7 +727,7 @@ final Map builtinMacros = { // https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax // We also omit texvc's \O, which conflicts with \text{\O} -// TODO: make as override font +//make as override font '\\darr': MacroDefinition.fromString("\\downarrow"), '\\dArr': MacroDefinition.fromString("\\Downarrow"), '\\Darr': MacroDefinition.fromString("\\Downarrow"), @@ -789,7 +789,7 @@ final Map builtinMacros = { '\\supe': MacroDefinition.fromString("\\supseteq"), '\\Tau': MacroDefinition.fromString("\\mathrm{T}"), '\\thetasym': MacroDefinition.fromString("\\vartheta"), -// TODO: '\\varcoppa': MacroDefinition.fromString("\\\mbox{\\coppa}"), +//'\\varcoppa': MacroDefinition.fromString("\\\mbox{\\coppa}"), '\\weierp': MacroDefinition.fromString("\\wp"), '\\Zeta': MacroDefinition.fromString("\\mathrm{Z}"), diff --git a/lib/src/parser/tex/parser.dart b/lib/src/parser/tex/parser.dart index d196127d..0d4100d6 100644 --- a/lib/src/parser/tex/parser.dart +++ b/lib/src/parser/tex/parser.dart @@ -24,8 +24,6 @@ import 'dart:collection'; import 'dart:ui'; -import 'package:collection/collection.dart'; - import '../../ast/nodes/multiscripts.dart'; import '../../ast/nodes/over.dart'; import '../../ast/nodes/style.dart'; @@ -616,7 +614,8 @@ class TexParser { } else { return StyleNode( optionsDiff: OptionsDiff(style: MathStyle.text), - children: res?.children.whereNotNull().toList(growable: false) ?? [], + children: res?.children.nonNulls.toList(growable: false) ?? + const [], ); } } @@ -812,7 +811,6 @@ class TexParser { } GreenNode _formatUnsuppotedCmd(String text) { - //TODO throw UnimplementedError(); } } diff --git a/lib/src/parser/tex/settings.dart b/lib/src/parser/tex/settings.dart index 075f036a..6016ecf3 100644 --- a/lib/src/parser/tex/settings.dart +++ b/lib/src/parser/tex/settings.dart @@ -45,8 +45,8 @@ enum Strict { /// Settings for [TexParser] class TexParserSettings { - final bool displayMode; // TODO - final bool throwOnError; // TODO + final bool displayMode; + final bool throwOnError; /// Extra macros final Map macros; @@ -61,7 +61,7 @@ class TexParserSettings { /// [TexParserSettings.strict] to [Strict.function] final Strict Function(String, String, Token?)? strictFun; - final bool globalGroup; // TODO + final bool globalGroup; /// Behavior of `\color` command /// diff --git a/lib/src/render/layout/eqn_array.dart b/lib/src/render/layout/eqn_array.dart index d987d14f..e9244865 100644 --- a/lib/src/render/layout/eqn_array.dart +++ b/lib/src/render/layout/eqn_array.dart @@ -238,7 +238,7 @@ class RenderEqnArray extends RenderBox Paint()..strokeWidth = ruleThickness, ); } - // TODO dashed line + // dashed line } } } diff --git a/lib/src/render/layout/line_editable.dart b/lib/src/render/layout/line_editable.dart index c9b1a3f4..d1316c74 100644 --- a/lib/src/render/layout/line_editable.dart +++ b/lib/src/render/layout/line_editable.dart @@ -297,6 +297,8 @@ class RenderEditableLine extends RenderLine { EquationRowNode node; /// {@template flutter.rendering.editable.paintCursorOnTop} + /// Whether to paint the cursor above the text. + /// {@endtemplate} bool get paintCursorAboveText => _paintCursorAboveText; bool _paintCursorAboveText; set paintCursorAboveText(bool value) { @@ -461,8 +463,9 @@ class RenderEditableLine extends RenderLine { void _paintCaret(Canvas canvas, Offset baselineOffset) { final paint = Paint() - ..color = - _cursorColor.withOpacity(_cursorBlinkOpacityController?.value ?? 0); + ..color = _cursorColor.withValues( + alpha: _cursorBlinkOpacityController?.value ?? 0, + ); Rect _caretPrototype; diff --git a/lib/src/render/layout/reset_dimension.dart b/lib/src/render/layout/reset_dimension.dart index 59988233..eb745c78 100644 --- a/lib/src/render/layout/reset_dimension.dart +++ b/lib/src/render/layout/reset_dimension.dart @@ -156,7 +156,6 @@ class RenderResetDimension extends RenderShiftedBox { dx = width - childWidth; break; case CrossAxisAlignment.center: - default: dx = (width - childWidth) / 2; break; } diff --git a/lib/src/render/layout/vlist.dart b/lib/src/render/layout/vlist.dart index 65c09dcc..22ad0dd6 100644 --- a/lib/src/render/layout/vlist.dart +++ b/lib/src/render/layout/vlist.dart @@ -334,8 +334,7 @@ class RenderRelativeWidthColumn extends RenderBox return 0; case CrossAxisAlignment.start: case CrossAxisAlignment.baseline: - case CrossAxisAlignment.stretch: // TODO - default: + case CrossAxisAlignment.stretch: return width; } } diff --git a/lib/src/render/svg/svg_string.dart b/lib/src/render/svg/svg_string.dart index 3a3b32fe..5c868938 100644 --- a/lib/src/render/svg/svg_string.dart +++ b/lib/src/render/svg/svg_string.dart @@ -1,6 +1,9 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart'; +int _colorChannelToInt(double value) => + (value * 255.0).round().clamp(0, 255).toInt(); + String svgStringFromPath( String path, Size viewPort, @@ -14,7 +17,7 @@ String svgStringFromPath( 'viewBox=' '"${viewBox.left} ${viewBox.top} ${viewBox.width} ${viewBox.height}" ' '>' - '' + '' ''; final _alignmentToString = { diff --git a/lib/src/utils/canvas_kit/canvas_kit_web.dart b/lib/src/utils/canvas_kit/canvas_kit_web.dart index 1f87e6a3..335a57ea 100644 --- a/lib/src/utils/canvas_kit/canvas_kit_web.dart +++ b/lib/src/utils/canvas_kit/canvas_kit_web.dart @@ -1,9 +1,11 @@ -// ignore: avoid_web_libraries_in_flutter -import 'dart:js'; +import 'dart:js_interop'; /// Whether the CanvasKit renderer is being used on web. /// /// Always returns `false` on non-web. /// /// See https://stackoverflow.com/a/66777112/6509751 for reference. -bool get isCanvasKit => context['flutterCanvasKit'] != null; +@JS('window.flutterCanvasKit') +external JSAny? get _windowFlutterCanvasKit; + +bool get isCanvasKit => _windowFlutterCanvasKit != null; diff --git a/lib/src/widgets/math.dart b/lib/src/widgets/math.dart index e9684f8f..f7371a09 100644 --- a/lib/src/widgets/math.dart +++ b/lib/src/widgets/math.dart @@ -181,17 +181,24 @@ class Math extends StatelessWidget { .merge(const TextStyle(fontWeight: FontWeight.bold)); } - final textScaleFactor = - this.textScaleFactor ?? MediaQuery.textScaleFactorOf(context); + final baseFontSize = + effectiveTextStyle.fontSize ?? MathOptions.defaultFontSize; + final scaledFontSize = this.textScaleFactor != null + ? baseFontSize * this.textScaleFactor! + : MediaQuery.textScalerOf(context).scale(baseFontSize); + final effectiveColor = effectiveTextStyle.color ?? + DefaultTextStyle.of(context).style.color ?? + Colors.black; options = MathOptions( style: mathStyle, - fontSize: effectiveTextStyle.fontSize! * textScaleFactor, - mathFontOptions: effectiveTextStyle.fontWeight != FontWeight.normal && effectiveTextStyle.fontWeight != null + fontSize: scaledFontSize, + mathFontOptions: effectiveTextStyle.fontWeight != FontWeight.normal && + effectiveTextStyle.fontWeight != null ? FontOptions(fontWeight: effectiveTextStyle.fontWeight!) : null, logicalPpi: logicalPpi, - color: effectiveTextStyle.color!, + color: effectiveColor, ); } diff --git a/lib/src/widgets/selectable.dart b/lib/src/widgets/selectable.dart index a23f5e94..6f222e8d 100644 --- a/lib/src/widgets/selectable.dart +++ b/lib/src/widgets/selectable.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; +import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; @@ -17,13 +18,54 @@ import 'exception.dart'; import 'math.dart'; import 'mode.dart'; import 'selection/cursor_timer_manager.dart'; -import 'selection/focus_manager.dart'; import 'selection/overlay_manager.dart'; import 'selection/selection_manager.dart'; import 'selection/web_selection_manager.dart'; const defaultSelection = TextSelection.collapsed(offset: -1); +@immutable +class SelectableMathToolbarOptions { + const SelectableMathToolbarOptions({ + this.copy = true, + this.cut = false, + this.paste = false, + this.selectAll = true, + }); + + final bool copy; + final bool cut; + final bool paste; + final bool selectAll; + + SelectableMathToolbarOptions copyWith({ + bool? copy, + bool? cut, + bool? paste, + bool? selectAll, + }) { + return SelectableMathToolbarOptions( + copy: copy ?? this.copy, + cut: cut ?? this.cut, + paste: paste ?? this.paste, + selectAll: selectAll ?? this.selectAll, + ); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + return other is SelectableMathToolbarOptions && + other.copy == copy && + other.cut == cut && + other.paste == paste && + other.selectAll == selectAll; + } + + @override + int get hashCode => Object.hash(copy, cut, paste, selectAll); +} + /// Selectable math widget. /// /// On top of non-selectable [Math], it adds selection functionality. Users can @@ -58,13 +100,9 @@ class SelectableMath extends StatelessWidget { this.textScaleFactor, this.textSelectionControls, this.textStyle, - ToolbarOptions? toolbarOptions, + SelectableMathToolbarOptions? toolbarOptions, }) : assert(ast != null || parseException != null), - toolbarOptions = toolbarOptions ?? - const ToolbarOptions( - selectAll: true, - copy: true, - ), + toolbarOptions = toolbarOptions ?? const SelectableMathToolbarOptions(), super(key: key); /// The equation to display. @@ -150,12 +188,12 @@ class SelectableMath extends StatelessWidget { /// {@macro fluttermath.widgets.math.textStyle} final TextStyle? textStyle; - /// Configuration of toolbar options. + /// Configuration of context menu options. /// /// Paste and cut will be disabled regardless. /// /// If not set, select all and copy will be enabled by default. - final ToolbarOptions toolbarOptions; + final SelectableMathToolbarOptions toolbarOptions; /// SelectableMath builder using a TeX string /// @@ -185,7 +223,7 @@ class SelectableMath extends StatelessWidget { double? textScaleFactor, TextSelectionControls? textSelectionControls, TextStyle? textStyle, - ToolbarOptions? toolbarOptions, + SelectableMathToolbarOptions? toolbarOptions, }) { SyntaxTree? ast; ParseException? parseError; @@ -235,18 +273,25 @@ class SelectableMath extends StatelessWidget { .merge(const TextStyle(fontWeight: FontWeight.bold)); } - final textScaleFactor = - this.textScaleFactor ?? MediaQuery.textScaleFactorOf(context); + final baseFontSize = + effectiveTextStyle.fontSize ?? MathOptions.defaultFontSize; + final scaledFontSize = this.textScaleFactor != null + ? baseFontSize * this.textScaleFactor! + : MediaQuery.textScalerOf(context).scale(baseFontSize); + final effectiveColor = effectiveTextStyle.color ?? + DefaultTextStyle.of(context).style.color ?? + Colors.black; final options = this.options ?? MathOptions( style: mathStyle, - fontSize: effectiveTextStyle.fontSize! * textScaleFactor, - mathFontOptions: effectiveTextStyle.fontWeight != FontWeight.normal && effectiveTextStyle.fontWeight != null + fontSize: scaledFontSize, + mathFontOptions: effectiveTextStyle.fontWeight != FontWeight.normal && + effectiveTextStyle.fontWeight != null ? FontOptions(fontWeight: effectiveTextStyle.fontWeight!) : null, logicalPpi: logicalPpi, - color: effectiveTextStyle.color!, + color: effectiveColor, ); // A trial build to catch any potential build errors @@ -395,7 +440,7 @@ class InternalSelectableMath extends StatefulWidget { final TextSelectionControls textSelectionControls; - final ToolbarOptions toolbarOptions; + final SelectableMathToolbarOptions toolbarOptions; @override InternalSelectableMathState createState() => InternalSelectableMathState(); @@ -404,12 +449,14 @@ class InternalSelectableMath extends StatefulWidget { class InternalSelectableMathState extends State with AutomaticKeepAliveClientMixin, - FocusManagerMixin, + TextSelectionDelegate, SelectionManagerMixin, SelectionOverlayManagerMixin, WebSelectionControlsManagerMixin, SingleTickerProviderStateMixin, CursorTimerManagerMixin { + static InternalSelectableMathState? _activeSelectableMath; + TextSelectionControls get textSelectionControls => widget.textSelectionControls; @@ -455,7 +502,7 @@ class InternalSelectableMathState extends State _didAutoFocus = true; SchedulerBinding.instance.addPostFrameCallback((_) { if (mounted) { - FocusScope.of(context).autofocus(widget.focusNode!); + FocusScope.of(context).autofocus(focusNode); } }); } @@ -464,8 +511,54 @@ class InternalSelectableMathState extends State @override void dispose() { _oldFocusNode.removeListener(updateKeepAlive); - super.dispose(); + if (_activeSelectableMath == this) { + _activeSelectableMath = null; + } controller.dispose(); + super.dispose(); + } + + @override + void requestFocusForInteraction() { + final activeSelectableMath = _activeSelectableMath; + if (activeSelectableMath != null && + activeSelectableMath != this && + activeSelectableMath.mounted) { + activeSelectableMath.handleSelectionChanged( + defaultSelection, + null, + ExtraSelectionChangedCause.unfocus, + ); + } + _activeSelectableMath = this; + focusNode.requestFocus(); + } + + @override + void handleSelectionChanged( + TextSelection selection, + SelectionChangedCause? cause, [ + ExtraSelectionChangedCause? extraCause, + ]) { + if (extraCause == ExtraSelectionChangedCause.unfocus) { + if (_activeSelectableMath == this) { + _activeSelectableMath = null; + } + } else if (extraCause != ExtraSelectionChangedCause.exterior) { + final activeSelectableMath = _activeSelectableMath; + if (activeSelectableMath != null && + activeSelectableMath != this && + activeSelectableMath.mounted) { + activeSelectableMath.handleSelectionChanged( + defaultSelection, + null, + ExtraSelectionChangedCause.unfocus, + ); + } + _activeSelectableMath = this; + } + + super.handleSelectionChanged(selection, cause, extraCause); } void onSelectionChanged( @@ -490,38 +583,57 @@ class InternalSelectableMathState extends State final child = controller.ast.buildWidget(widget.options); - return selectionGestureDetectorBuilder.buildGestureDetector( - child: MouseRegion( - cursor: SystemMouseCursors.text, - child: CompositedTransformTarget( - link: toolbarLayerLink, - child: MultiProvider( - providers: [ - Provider.value(value: FlutterMathMode.select), - ChangeNotifierProvider.value(value: controller), - ProxyProvider( - create: (context) => const TextSelection.collapsed(offset: -1), - update: (context, value, previous) => value.selection, - ), - Provider.value( - value: SelectionStyle( - cursorColor: widget.cursorColor, - cursorOffset: widget.cursorOffset, - cursorRadius: widget.cursorRadius, - cursorWidth: widget.cursorWidth, - cursorHeight: widget.cursorHeight, - selectionColor: widget.selectionColor, - paintCursorAboveText: widget.paintCursorAboveText, - ), - ), - Provider.value( - value: Tuple2(startHandleLayerLink, endHandleLayerLink), + return Focus.withExternalFocusNode( + focusNode: focusNode, + includeSemantics: false, + child: TapRegion( + groupId: toolbarLayerLink, + onTapOutside: (_) { + if (controller.selection == defaultSelection) { + return; + } + handleSelectionChanged( + defaultSelection, + null, + ExtraSelectionChangedCause.unfocus, + ); + }, + child: selectionGestureDetectorBuilder.buildGestureDetector( + behavior: HitTestBehavior.translucent, + child: MouseRegion( + cursor: SystemMouseCursors.text, + child: CompositedTransformTarget( + link: toolbarLayerLink, + child: MultiProvider( + providers: [ + Provider.value(value: FlutterMathMode.select), + ChangeNotifierProvider.value(value: controller), + ProxyProvider( + create: (context) => + const TextSelection.collapsed(offset: -1), + update: (context, value, previous) => value.selection, + ), + Provider.value( + value: SelectionStyle( + cursorColor: widget.cursorColor, + cursorOffset: widget.cursorOffset, + cursorRadius: widget.cursorRadius, + cursorWidth: widget.cursorWidth, + cursorHeight: widget.cursorHeight, + selectionColor: widget.selectionColor, + paintCursorAboveText: widget.paintCursorAboveText, + ), + ), + Provider.value( + value: Tuple2(startHandleLayerLink, endHandleLayerLink), + ), + // We can't just provide an AnimationController, otherwise + // Provider will throw + Provider.value(value: Wrapper(cursorBlinkOpacityController)), + ], + child: child, ), - // We can't just provide an AnimationController, otherwise - // Provider will throw - Provider.value(value: Wrapper(cursorBlinkOpacityController)), - ], - child: child, + ), ), ), ), @@ -553,10 +665,103 @@ class InternalSelectableMathState extends State double get preferredLineHeight => widget.options.fontSize; @override - dynamic noSuchMethod(Invocation invocation) { - // We override noSuchMethod since we do not have concrete implementations - // for all methods of the selection manager mixins. - throw NoSuchMethodError.withInvocation(this, invocation); + List get contextMenuButtonItems { + return [ + if (copyEnabled) + ContextMenuButtonItem( + type: ContextMenuButtonType.copy, + onPressed: () => copySelection(SelectionChangedCause.toolbar), + ), + if (selectAllEnabled && !_selectionCoversAllContent) + ContextMenuButtonItem( + type: ContextMenuButtonType.selectAll, + onPressed: () => selectAll(SelectionChangedCause.toolbar), + ), + ]; + } + + bool get _selectionCoversAllContent => + controller.selection.start == 0 && + controller.selection.end == controller.ast.greenRoot.capturedCursor - 1; + + @override + void bringIntoView(TextPosition position) { + final targetContext = controller.ast.greenRoot.key?.currentContext; + if (targetContext == null) { + return; + } + Scrollable.ensureVisible( + targetContext, + duration: Duration.zero, + alignmentPolicy: ScrollPositionAlignmentPolicy.keepVisibleAtEnd, + ); + } + + @override + void copySelection(SelectionChangedCause cause) { + if (controller.selection.isCollapsed) { + return; + } + + final selectedText = textEditingValue.selection.textInside( + textEditingValue.text, + ); + if (selectedText.isEmpty) { + return; + } + + Clipboard.setData(ClipboardData(text: selectedText)); + + if (cause != SelectionChangedCause.toolbar) { + return; + } + + switch (Theme.of(context).platform) { + case TargetPlatform.android: + case TargetPlatform.fuchsia: + controller.selection = defaultSelection; + break; + case TargetPlatform.iOS: + hideToolbar(false); + break; + case TargetPlatform.macOS: + case TargetPlatform.linux: + case TargetPlatform.windows: + hideToolbar(); + break; + } + } + + @override + void cutSelection(SelectionChangedCause cause) {} + + @override + Future pasteText(SelectionChangedCause cause) async {} + + @override + void selectAll(SelectionChangedCause cause) { + final fullSelection = TextSelection( + baseOffset: 0, + extentOffset: controller.ast.greenRoot.capturedCursor - 1, + ); + handleSelectionChanged( + fullSelection, + cause, + cause == SelectionChangedCause.toolbar + ? ExtraSelectionChangedCause.handle + : null, + ); + if (cause == SelectionChangedCause.toolbar) { + bringIntoView(fullSelection.extent); + } + } + + @override + void userUpdateTextEditingValue( + TextEditingValue value, + SelectionChangedCause cause, + ) { + textEditingValue = value; } } diff --git a/lib/src/widgets/selection/gesture_detector_builder.dart b/lib/src/widgets/selection/gesture_detector_builder.dart index f44d1c3a..a22daea8 100644 --- a/lib/src/widgets/selection/gesture_detector_builder.dart +++ b/lib/src/widgets/selection/gesture_detector_builder.dart @@ -7,6 +7,8 @@ abstract class MathSelectionGestureDetectorBuilderDelegate { bool get forcePressEnabled; bool get selectionEnabled; + + void requestFocusForInteraction(); } class MathSelectionGestureDetectorBuilder { @@ -30,6 +32,9 @@ class MathSelectionGestureDetectorBuilder { @protected void onTapDown(TapDragDownDetails details) { lastTapDownPosition = details.globalPosition; + if (delegate.selectionEnabled) { + delegate.requestFocusForInteraction(); + } // The selection overlay should only be shown when the user is interacting // through a touch screen (via either a finger or a stylus). A mouse // shouldn't trigger the selection overlay. diff --git a/lib/src/widgets/selection/overlay.dart b/lib/src/widgets/selection/overlay.dart index 12be5a42..cf013ef4 100644 --- a/lib/src/widgets/selection/overlay.dart +++ b/lib/src/widgets/selection/overlay.dart @@ -1,4 +1,5 @@ import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart' show AdaptiveTextSelectionToolbar; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; @@ -157,7 +158,9 @@ class MathSelectionOverlay { void hideHandles() { if (_handles != null) { _handles![0].remove(); + _handles![0].dispose(); _handles![1].remove(); + _handles![1].dispose(); _handles = null; } } @@ -207,7 +210,9 @@ class MathSelectionOverlay { void hide() { if (_handles != null) { _handles![0].remove(); + _handles![0].dispose(); _handles![1].remove(); + _handles![1].dispose(); _handles = null; } if (_toolbar != null) { @@ -219,9 +224,12 @@ class MathSelectionOverlay { /// /// To hide the whole overlay, see [hide]. void hideToolbar() { - assert(_toolbar != null); + if (_toolbar == null) { + return; + } _toolbarController.stop(); _toolbar!.remove(); + _toolbar!.dispose(); _toolbar = null; } @@ -236,71 +244,51 @@ class MathSelectionOverlay { if ((_selection.isCollapsed && position == MathSelectionHandlePosition.end) || selectionControls == null) { - return Container(); + return const SizedBox.shrink(); } // hide the second handle when collapsed - return Visibility( - visible: handlesVisible, - child: MathSelectionHandleOverlay( - manager: manager, - onSelectionHandleChanged: (TextSelection newSelection) { - _handleSelectionHandleChanged(newSelection, position); - }, - onSelectionHandleTapped: onSelectionHandleTapped, - startHandleLayerLink: startHandleLayerLink, - endHandleLayerLink: endHandleLayerLink, - selection: _selection, - selectionControls: selectionControls!, - position: position, - dragStartBehavior: dragStartBehavior, + return TapRegion( + groupId: toolbarLayerLink, + child: Visibility( + visible: handlesVisible, + child: MathSelectionHandleOverlay( + manager: manager, + onSelectionHandleChanged: (TextSelection newSelection) { + _handleSelectionHandleChanged(newSelection, position); + }, + onSelectionHandleTapped: onSelectionHandleTapped, + startHandleLayerLink: startHandleLayerLink, + endHandleLayerLink: endHandleLayerLink, + selection: _selection, + selectionControls: selectionControls!, + position: position, + dragStartBehavior: dragStartBehavior, + ), ), ); } Widget _buildToolbar(BuildContext context) { - if (selectionControls == null) return Container(); + if (manager.contextMenuButtonItems.isEmpty) return const SizedBox.shrink(); - // Find the horizontal midpoint, just above the selected text. final endpoint1 = manager.getLocalEndpointForPosition(_selection.start); - final endpoint2 = manager.getLocalEndpointForPosition(_selection.end); - - final editingRegion = manager.getLocalEditingRegion(); - - final isMultiline = false; // TODO - // endpoints.last.point.dy - endpoints.first.point.dy > - // manager.preferredLineHeight / 2; - - // If the selected text spans more than 1 line, horizontally center the - // toolbar. - // Derived from both iOS and Android. - final midX = isMultiline - ? editingRegion.width / 2 - : (endpoint1.dx + endpoint2.dx) / 2; - - final midpoint = Offset( - midX, - // The y-coordinate won't be made use of most likely. - endpoint1.dy - manager.preferredLineHeight, + final anchors = TextSelectionToolbarAnchors.fromSelection( + renderBox: manager.rootRenderBox, + startGlyphHeight: manager.preferredLineHeight, + endGlyphHeight: manager.preferredLineHeight, + selectionEndpoints: [ + TextSelectionPoint(endpoint1, TextDirection.ltr), + TextSelectionPoint(endpoint2, TextDirection.ltr), + ], ); return FadeTransition( opacity: _toolbarOpacity, - child: CompositedTransformFollower( - link: toolbarLayerLink, - showWhenUnlinked: false, - offset: -editingRegion.topLeft, - child: selectionControls!.buildToolbar( - context, - editingRegion, - manager.preferredLineHeight, - midpoint, - [ - TextSelectionPoint(endpoint1, TextDirection.ltr), - TextSelectionPoint(endpoint2, TextDirection.ltr), - ], - manager, - clipboardStatus!, - null, + child: TapRegion( + groupId: toolbarLayerLink, + child: AdaptiveTextSelectionToolbar.buttonItems( + anchors: anchors, + buttonItems: manager.contextMenuButtonItems, ), ), ); diff --git a/lib/src/widgets/selection/overlay_manager.dart b/lib/src/widgets/selection/overlay_manager.dart index e64083ee..3420afa9 100644 --- a/lib/src/widgets/selection/overlay_manager.dart +++ b/lib/src/widgets/selection/overlay_manager.dart @@ -16,6 +16,8 @@ mixin SelectionOverlayManagerMixin double get preferredLineHeight; + List get contextMenuButtonItems; + TextSelectionControls get textSelectionControls; DragStartBehavior get dragStartBehavior; @@ -75,6 +77,9 @@ mixin SelectionOverlayManagerMixin if (controller.selection.isCollapsed) { return false; } + if (contextMenuButtonItems.isEmpty) { + return false; + } _selectionOverlay!.showToolbar(); toolbarVisible = true; return true; diff --git a/lib/src/widgets/selection/web_selection_manager.dart b/lib/src/widgets/selection/web_selection_manager.dart index ecd5a8f2..6d09c3bf 100644 --- a/lib/src/widgets/selection/web_selection_manager.dart +++ b/lib/src/widgets/selection/web_selection_manager.dart @@ -127,6 +127,14 @@ mixin WebSelectionControlsManagerMixin _textInputConnection = null; } + @override + void didChangeInputControl( + TextInputControl? oldControl, + TextInputControl? newControl, + ) { + // no-op + } + @override AutofillScope? get currentAutofillScope => null; @@ -143,6 +151,26 @@ mixin WebSelectionControlsManagerMixin // no-op } + @override + void insertContent(KeyboardInsertedContent content) { + // no-op + } + + @override + void insertTextPlaceholder(Size size) { + // no-op + } + + @override + void removeTextPlaceholder() { + // no-op + } + + @override + void performSelector(String selectorName) { + // no-op + } + @override void showAutocorrectionPromptRect(int start, int end) { // no-op diff --git a/pubspec.yaml b/pubspec.yaml index 78ad10d3..a441bd77 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,21 +1,22 @@ name: flutter_math_fork -description: Fast and high-quality TeX math equation rendering with pure Dart & Flutter. -version: 0.7.4 +description: Fast TeX math equation rendering for Flutter, with selectable math support and maintained compatibility for current Flutter releases. +version: 0.8.0 homepage: https://github.com/simpleclub/flutter_math +repository: https://github.com/simpleclub/flutter_math +issue_tracker: https://github.com/simpleclub/flutter_math/issues environment: sdk: '>=3.0.0 <4.0.0' - flutter: '>=3.0.0' + flutter: '>=3.38.0' dependencies: flutter: sdk: flutter - flutter_svg: ">=2.0.0+1 <3.0.0" - provider: ^6.0.5 - meta: ^1.8.0 - collection: ^1.17.0 - tuple: ^2.0.1 + flutter_svg: ^2.2.2 + provider: ^6.1.5+1 + collection: ^1.19.1 + tuple: ^2.0.2 dev_dependencies: flutter_test: diff --git a/test/golden/29221604.png b/test/golden/29221604.png index 8559b8b9759469e453f7009df7127ea2c4f9f788..0b80fe8f48f02d76542d44f7a427195ab957cd19 100644 GIT binary patch delta 1405 zcmV-@1%mqX3W^IMiBL{Q4GJ0x0000DNk~Le0002t0000a2nGNE0DqQUeUTv`e>6!% zK~#90?VG=^+(Zz^zaTn4q%>AUg#(mFD1tCj3Xn{JKswP|ifF#IW=0xD>-C=PJ^S(IBc1ln_O55wGqXE8KEN;x!!QiP zFbu;m48t%C!!QiPFbrcF3IH{Le-^+FKsvWTXPlJA(^x(^fD*tew8GPo1bGPH4uE$7 zde+XZt@@~X? zoCjW`^8UOe~A!LZo(c0F7AE zHMG<#XjR1_j_zC8bH4C|M=2fOQ5$mUzYPef659XxZeXAHBB9{3p-)Mh2Rc4T#Q<)^ zPU+?lLI%QpIVJfTdQd~CeaxlLV{TkZ#Qj9PW3N8DxC4+pHyHaLXES8e)G(BUpb&O%= zQFa~&J(jL^TqL9)u9(tCdx*(}*UY-}tk4o(5_H9ha~dIgQaz)OWz0;-URuurt3X5X zv4okhb{J?){nm<}s&RA~br*7$)MMEd59<2ufcQJ<(Dz_Me^L}H09QKRe7OPOmO6Hk z$~)>f=M9g0?pFZ#DnKq5M*yC9&R?bS>w)dZfR~^@spFg<{Q1E0OwEf_Uh3H?&j9>N z-`@i8Se*M_UCV}YTO7MAzJIIQz0%PRQvmn`!26C=PzB(Tx|ie*fn&u#BGN*Z^+U5E&lsu?&7t-=5*mzFBiTXB#%b_%B=WXJMQ zxblFBn5Cv(g=JzV*Oj_6jB`gRma(~7mg-g7Q&@7*E*t+6!Ysp>6&Yf%F>WI)c_9p* z--%vQsAU-Ef>gZ1xuicN7=~dOhG7_nVHk#C7=~dOhG7_nafbL87GbO2gms*800000 LNkvXXu0mjf8{?a4 delta 1382 zcmV-s1)2Ja3-bygiBL{Q4GJ0x0000DNk~Le0002#0000a2nGNE0Bk`WiIE{7e;r9g zK~#90?VGWy>{JkkKgBLS6lD8_XSvuYE@HW*u>ZhXdu_bc!UMtPc4D>u2P+7c7E!AQ zHd@FPM6Dhuwqk9)uSkAm_Uy?f+2q`WxAQ^B-jJL#nVdN@XXadR9LI4S$8j9TaU92S z9LI4S$8j9TafVEcjmwkz$4%z;K{h+RNR-xwXmV^bSc|E^yp(ZpezsB_KUy{$f>^J zUE2p!c~U55j<L90_!0OP_z?KK?ZdAm5(?n0fAV}yo-{SL zz?WkS;dDl}@Qh+9_;r_uQ+m>O%Jbg|`uNS57Ggo^jT z4TXo=mDh6O3CfLm?vB%h&5HBk=YlE$ngdHCQ%;ctYU0iE{2;aaPPpHIalZD$<6r`BwiIfao)w+pJV zCF5FB4f%7FI~`4*-hdq~!%b@+~I5;>T^!*?7EDa)q+?@Z^GnGwti zw2#~yL$li@M;8Or?5u&Wcf9G)hGhsN&8P;g-bKlVzD71BBbBcAe-z^dD(^Hm_i11g zT$4U#RO9eqp4Av!a6BHZkT+m5xmNnlWe{EYY8OGmrC4ra$Ks5kUmMPjG#f3BUoaQw~N-w`89+FAkHXdHO z?|QVE0ETK??O0vUDc-wjFvq-K#`!U&P&Z6sS`XaxZRW(o@g_80+N@oBp}2h(T$j;> z)HWrV)N4|^o*9z9Mp`GACd0l-w<#EDmvI2q#HI0P*P~V+ z%Jhc1s|#tH)}um+(y(2HzDh6*GZSQ~I z{Qj+`?=A2J@NwDxYvuLFzz4vuz^CWM=N9;`;hx@T#tCC_tt&K>SWg?fKj$<>J{GEb z#aJ+2;z*?ii=qn6_AzhKmMM5rh`*;;bF4#^R#qIZe~ELdlFVIsPb?uBhPw-ny=z^B zqP|or5OUDT3M z2&RJne}*b1S5Y?$?%z_CZMICqgIZMJwi^ceCX$9I!Q2?Rq&F4i_w<|SredT}7^=pO zHj$)AuBPfi~<7qrah0`wRN*UUQtQAht38Ts?LOJk*cYwNqQ>InLFi1XJJqf#W!i<2a7v oIF92uj^j9v<2a7vIL_7b9KFubR#}TYF#rGn07*qoM6N<$g1+Ok@Bjb+ diff --git a/test/golden/355369240.png b/test/golden/355369240.png index c8639ea4b47b0a08377e734d42e18d7da1201f29..4b9bd7a539a2fb7d608d25350bef9a506809c4b1 100644 GIT binary patch delta 528 zcmV+r0`L8$1jYoAL4WW`L_t(oh3%HHOB_KIhd(rpp2R}VLJKbhG~gi!f?y}6(B>>` z5-kHB1PLfMHWrIrAmM~GsXUv2h1C@{`2&InN;-N`od z!E*Cv-<$c(y?HYWfj}S-2>9m-aMQsvoVRep9>S9kT>b(s-K=zOi&U`jvreU`F<{gyV4$_yT-)9Ct#$ zCyxG^(9pjYcSIfo<85LKDq>UYk+uH~CDnpAW;N**(0^<7&jW{d#8wqsmEDwW6UEd? z=A3HcS61IAVDgT*NEs~Y2sYU?McaBAdc%A^T*!V395}?4B)YCF6eQU6t$5abi?3S5 zbKnSg^gk!hf@Lk>htG@0HB)t(U$lWhAP@+2%s)PrWLoO& S$AJI<00{s|MNUMnLSTYT!}Ndv delta 494 zcmVL!L4VIlL_t(oh3%I=P69y`hdysDSvp5G3H2q1Nf1?rU5Kf zYlM@6>(5nN2hM=6*!M$V0;~(3W0W!SVtBE6PRCi=>bPJOh`J zxq75OApIS`0Pa+O4UB*`aD}Ae2zV{vTW%f@Ax~9b;{uNkV? z3$|Y*5C{F(oPX9(6S z2}kYskY$)g-dCste5)4VhGZvQ;2n8B^Uzl9M^5`vm>^M05@}ZS>xhV(YU~l_zs5nd zV2qABbj7BiyX;Oaka{T~tefU)9K~Z>C#5rE`xf5F&S!lO5v)U42nK|r?NdMx`_NSf zFCybS6{mwZ?IX8PM;z93*QI;9gC+7KTqOE`=HF9ZTtY3(D)!}I^et2t{o@k$I3>OA k`4`l(O)M6R#bPnT4Krf-85q%c%fN)iZ4J2Jdv%T&m@x1#G-ozKdiU8d;?DAsbRn~z5m1KOBSwC2q*R0=#jED@pW*st`$VJhzau?tl2AP0RuBfHS>Jo(1#Tz}Gx4 zp1k>?O)!i*_~yc(XZ*1K$UVz1iJ)~Kz{+{Nklgo4DbkmB1P>4=e)@4YJqDhDfy;WOBYz+Qivn#?i`ke(m9K;; z$MH)IctO2zmLYQhTsW>%9Rj-orvfd@>sjE<-0O=#OW?u4y#(zyj$s`h@2356jS1VBfSqfFsmQB2yZhXh~pGE+!)T#BBmA zW6y@D2Vz!8XR}f`LiejMxg^N4zKzh#*UJ;kqUcH70Y1$gUj8Vi-tF^j(QJ)pbfSALs&X6&Bn4@nn+ebRAKI=7^~ za6|sy@1p@50vo0+jDmIphj{o2U9<3OqF{5 zr@9d_iiO*M*5%j4UidfbPnR&q40Wyf3*uDKdORMF$K%2mF}iyL%|Gem00000NkvXX Hu0mjf!b$to diff --git a/test/golden/860616833.png b/test/golden/860616833.png index f9effb1b6792edb33012b7bbc9bfa862d7723a00..1b5e991bd347fe6c2d8dde835ccdb4c3243058c5 100644 GIT binary patch delta 595 zcmV-Z0<8V(1c?QZL4PwzL_t(oh3%I;h!a5+$A70+C@bOzYhhzVvGG8y(g_+1L5K)e zXDM=x*QKyEU|}N!!9uHmTG-g6u(7Z_T|v|n1P`yc=ESoR>)8AUhG9Q4*`4Hy`9T== zW!}91?3*_;3z0}95~;z$6h0}i3Y-9r0z1GHU@d^Y#z}w-Xn$L_J}`D{yOy@Zj&f{+ zc?jC$*?(K@P5>=avFO=)kTdMXW@YS;41)c-HYHDnhwoc*Hvi0=# zJ5JvX;Bd(}L;VKY0J?e}<&4!RcJPtzLT+8$1|Ajocbs#>9w*U+vVi(0;svb<8sjwZvt(%iECWvq{!4SRl{uHgrHX@bYJaW)TY5teOZt5VPE9ywOXF2t zMQU?dsXnKGe+n*U*MS!v<8})+fS`;N^iIxyAAqwZzKO(|U94}de?u$u$I&GP{qESW z0WmTe8VP~q2C2F<>2vT2I8JBxZiSBbH;Uta-UP2ks( z=%KQZNKCM?xmT2+tZNb%fj7X(Sq5){Wldl`%B{SN~FfX5B#nK_I4 h>WV}nkw|1N{0C}faJG6x5w`#U002ovPDHLkV1nHe8{q%| delta 565 zcmV-50?Pe~1?vQmL4OrVL_t(oh3%KUN&`U##VKRAvZW_M?2c4l|M;cz${YtXXj z;{(UQHn0UOfGgmsLc40i10tYj$j*UfOx9R>h_PXU?D8)R+J7ji|DpbistvJav!wo< z-+8mE{?8fx+Q4nexd2XqsYSoSbdj7G<>;NMuQ3deeZK^5kmOFIjYO_phaqKiKy#05 zr55lCJOZ5*-4oy%__Um>c6=lf5y_FL&HFZZ$i9!Gw^RHq2x!>ezeEf@jLFj$Fe80y zRYKVu&|Bflkbn8={{p-j@&L(=xt(eC&_hmP-;j+E?+;?SS>Ep<)$0a{Y6sX??J!}i zN--x7k-JblF9M|UBr)LUxnYjuAq$EswAYF>?|X>BCOWTtR`;s7PG#(77^mrz?tP!% z(TezaIqZ^sFj^C^sx}uHdJhz@JRLP&-c=-(qE)D`zJEQ{J|g*W>I3f-uRJ^IKPjkR z31h@-Ne9#evWPT1B#Ctu(~lvus&%OOanx6n&JyI~oW4WVcc|KtYMUfgwaS^Qi33BH z=Y0_4LRNJ@RO9HR-Diz_D1%OD9fcy^2QfTE%H$9+d}PStSCm?rBa1iy?#TCkjaNV;eYK zqb?^F6_IYn_!(fMW=&4CGt#T!88BUy^W6@%9Tl>LM8BO<_b0}tfxW=1e<3uEjIQ-h z+vG*y2{2owD3=KQ()C87|D>+BfiG77abN;?I;6&t5o!b1N%Upyg&rqtD`A(TeG9k* z%mZ(MabO2nO{|4uz{8xy+Xk+w{S#OLP5|dM=Sqp%QYmW^lSW57THCg#&0wIl7FQ{5 zv0yv|-ersh5^Q6VL(57Ce@UB>a7YEI4_wKyTLms=jI~lWedcgvm@KI31JMRP0QdC* zA2aMGfcFmbnlr{y3EQC<0}iYGT~5>T`*Mj-%w|q=Ri3SEZpvvgOB~FJj3JQNmhL0# z`!|G&cx8-Pm3PYOzok8Y9%kcbq7!L; z&bh7!*Ft6pfzN6mRo3|mJSg$p9pDG>0$A6n?yUNrs{q!5iNZbLWnE53$q{QUTy9#- rplkx)nieq(r|Qn(9*@W4@!0$Y)+=~$&gdPO00000NkvXXu0mjfoFyt? delta 673 zcmV;S0$%;31+)briBL{Q4GJ0x0000DNk~Le0000n0000h2nGNE0MXH4;gKOAe_lyM zK~!jg?by9*6hRor@sBUvH3#7utLt+`L?mE!aG;8Dw#%gqkq>Uond&_ENN4#%UbO zc;!wKot8$}m4$(pbMMiZw1j~y4zal(uOrKn{-L*<9XYCyWlbyzvp(NbfB!Rsme}o7&@^`cX>k3ZXbRvM8|~%k`f6bFqBXr%e-^(nYUBp&__at*35S?v%R< zWRJr&T*pOx#y7mevp%*>)MMF?MV!Zsux47gDkwXHyN-Z@?+jL9MNpBTU>h%lB(fUs zSJQrIoE^K2nB>4T;1WKK(YI902{YU_+}AgT{9Y6Cu7o6s zT#3&m``6t>xgu;@&*Mke2H4dFA5TkiPHBuXoCH z)gmawh$t385)>5$ZEeNcs(tYW5kVtDHKu)#XeA}K-X6R?_&a47c9Y%7&Yr#eznA2k zGjsmm%+8tJGc)IaVHk#C7=~dOe}-WghG7_nVHk#C7=~dOhG7^+Wn2urS%WxV11HxY zPNj?i*|a69Ko{_8+7c-;2DGIu(Ljs=Cx&L8UtJe|0Q!J~z(keL?Q#UT1=tobMhL$F z>w)cQi_DP&s^7`TpJTo97jQlBPTC?3!aQIt@NU{738w&`081jrc@4NWe{zfv-T6bU%74a41rYe-O?Djs@=mT3Tz>+x*h+}RSBGbYp>C^8>-6c`1T1Aol%e5L3GE&*-?zKawigq1+P z4!tU60q~f{_$~$h)c!^+O9*T9#dZU*U;A36>>;ex7u8Kpea%QYV?uiaMB0GUHAuCq z3g;_Dmu?U4j~F9_e=c3P4|x02_NtVHz^R&r{J=ZbXk`hZi~q-e9`W|KLfJ#;(zUoH zZ4uP*oD(_50C02U7$MwSr(PlKuEFP6uRNrgF{3;-*He8xt)H+l=>|q3#|WXPPQ60d z3S6DGL`qx{e?Tb2;&3f!%K>6PWp7-+fY5K3-nF3s` z0n>IZ2XF_&GQbASOtovO{5_4;w8{HE#Wk8C2Vxo+GKQmhi0L2PJEm+L(Vz!PM)03HLCpP)m&a7?bE#C zdR3K-BwdCik#!2~r}5Lf3*P#ar{EN5)JfCnRT562aT`zK@GlVaY7MWD_Gw=6y^d0i$2OMf?-zmjbHIfaE&#ho zf4{6C&sD%q;Ait{DX)(6oHushlXrfu6)SYc8#v24;|!Fj z*g}z?e~1O=|6&(NpLsQ%S4jIbulQai3F(B^>B;cbjsTv(dT;vAC9jud4QM+l^iNKj zg7><}Cl#~Psn~Jnct+3m{I2b+UM{vr$C3+V(#ez4>uAlZxx7N!r+LNonvsxBXt8>| zUHX>$(Fu(99oBnii?K)x8b?%s3%vZDYP@ebe|b8z5_?P)veS77aIz+1#Hpx^D&{tA zuTjhsw4K%3mO=AsIVh(r)m;yf5J61O6QHm)oit^t?=aSI_ZtkL~ zReIQU3iwJ(z}*5ARC!Y>+_<)rfU04mvR74I@+x~F7s{$M80{q=y_$$e{?p3C+oPb|t6yZ0>lBiGjh zN<070)%wu8p{h#axYE;GI(yC@ce33exguYf^;@KgOgWnc?-|DV?FD-Z`(fG^%H4SK zRrmTkrr&1-#WvN|nKkww2u(1ulY3I}Snhaq?yUZ*310V)z0*s)8pHC<64~6BtMhle z#rbKZ3C&2`Qh#F8v5g)(&A9VFZw%ni`St4dJSKJGR!xqc6H#nm3fiK>X^T;J>mN)POQQBz`uwi zMg?L&_|`C7=X|g5b}8GPo_>C&?~V5lysbE6eqi&QGx`bJ&iACs+; zjlAoe%bPA2?p_L1x8r=z6`QxBmsUCc=JAnCo$_Be9`@H=| zr!*cLUp~0W!S~|6c`O#}dzOBlvKDCAGo6QVVh1knh&}yhpOb}gu$yG+pY*CtIsyER z|Dfu=)T1 diff --git a/test/golden/acute267057593.png b/test/golden/acute267057593.png index 883d97b51e3a4e9dba2f5ade11816cec200b96ed..8f4f163e2bf978a2a7b72e85539866bda6106bfd 100644 GIT binary patch delta 906 zcmV;519kkl1eymSiBL{Q4GJ0x0000DNk~Le0003R0000W2nGNE0L>-0#gQQ&e*;8G zL_t(|ob8%FXcR#dhd*ssL6F13X2H@kg^CAO!h%J>Ly}5PENsq*O&~U+2obD=5D~>P zVz99gObUa7l_;DDY8$Xqkw6e)tIgZ+95!+9PL{dN?`!sEZ~lBUZ+6+8Sr9@9A%qY@ z2qAX*9oV^DT_|Ai1De_nR=kv9RR zfFr%cW&!<9*aY5RQ$xMlxewK|>y4}*3(z-jycwLPj&04MF-72u1! zdoux@i%qx8k$b9(%!U2bMc}rzxiPMvtxNO zC+)XLo54WfI)*)5;77^)DR9gdlge`3jvwVEuMzbcv*U*y>a|JP8%^r&WLpKb6Qo=2(WC0Tt-Ajc-~#YVUh<06>%8Tku=Kbc{l$4P*mACm*S3_o(InQ$ zB}-2N?}0t8g+&Ov4D<-dl zR__aYn)()awSk}JP&cn_Df_`*7dQi~0XHqsH{2a=uHa*$VB5imLuY|=R>vpcK_Hpg z0IgXERxO=(?mqBNUh<0AD+TUZ{x`s5yC6^5xfNhBXroSELI@#*5JCtcgb+dqA%qY@ g2qA!)IRF3v delta 550 zcmbQmzLQ0oG5%P{E*hhL0RRIzAnor7xHdC@Yk% zme49qYcD{uYUdw-SoXP>9PCN2q)zxUxD*A4dium;u#JUf{7 zG0HdYKM?-l-mzoH(p-!ub``|N#h0%Wes?7PSZZyYo!pj<8#n%3zf&!rX_cDYgP2~% z7rx93sNKBsU-i_2zu#-F^Z`ZBYM)&_OQxmjfaQngg781VG5@Mxc(1*At; z4_9;3RE;?tS<)MVCpriuRh#7>D!#Ehx>(43_W$PO{Iv9YHO9rpZ{F&0D7FYVVGv!H zn10ne+pV2r^;!AVmH(5krv-$q@7*BzIU;P8Nk3S9l1|wl*PARe82K2h8`Td874Y6* zUc(gLXd150n)dcL&;aLy<6Wy z7cl!UTozl*yl2&l>k%s7;%!S0)g~PLWVC?YB({F;l~*d$@}g(1d%9KE?bWN8Z4nF4 zUU0j7N|&Md)1>guy++yU7fK7A_sG=;iLT$6xsz?9bVIHBy{#pOr_N;03hdc;l=G5p z_%baBw62>neb2TP*IQ)mbAs2GcIBC@ynT|*H|x)*pu@3I zPfK+=^TMv)`Jc_k6F05cQeD4t>QU{^q$j%POmp<{>rKVD9U$a#z z&n%Tb5M6!dh4nYvNq62}+P=1Tm-L?0ay!OzjQgLcuAfvjck8F%Y4f%$j-T^^c@ z6}~VjIF?ky^v-?KOx_D!r3p7LEiC@tP!5ippa<)w)-&5|Vy!&%X}5}P{k##UMR%QAJDI`qqF(JqczTP zKAeW0vjwiy*=u~+`z-siy^V*|1QpLoaJ1x1`q5mm!(Gp%wrxJW^j3|1>`&hL(c%9d zeZM@_^_Q&2B$dDQ$==2}(u~IssBK`2VJtr&xq)jB^YR1jy}iA@j+Z@HdK!BT?kQS+ z+rwL2o4~}A0|Z>N;hhHzDf)oHrD0YC`A6e^m9f| z=$4HeH=Zh_HrH_lu%F;lesw;3opbNSD(?{fmGHfh%Hy{~NfZ}znP4yTSC zJGLxnuB!&yy2k2Bn;%6d{!`r^eA^5NSbbMobqBa?x+L5B(e4As8lSgUI1M%d&C$&8 zy1F;wqreT;dkx$PvKH*~4n0=hwEs28nV)*$;Q(YTVg1HhQTfoGBf4n@F!UKbUHx3v IIVCg!0N#?emH+?% diff --git a/test/golden/breve107975770.png b/test/golden/breve107975770.png index 6a6ba8233b95a0c8f078da92bb4df0fe2de9aa19..e37db3b24d09d6301e01edd78c38f42a55577b5f 100644 GIT binary patch delta 926 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 delta 549 zcmZ3;zJo=vGr-TCmrII^fq{Y7)59f*fq_vG$d>0|1ClGGs*5Hn%GWbK@^o<-$sDGrI6+)M-jRbvF?53vxAkn%`3_q+ zermRucnUXZzLSl)E;;k2?7L07pJ#vJt9~~BW@#CV=Oh&b+BKco_Q8hyTZwa~@f+^f zD_~!9^kbAvxqE%YakX3b=7k*Fdp~IAmB*7$t(n8lpCe%QiSGo5x|3m?d{UjQ+`BD% zE$rkfeP3r*R|iRcuk%g~>i5?QE|xoEUhy{kf&2$f3-*5u_6^<-IDXtNxEX#x|3UJf zpS&*w?!8?neJ)!fH{W0D@xA<&KCeD{riPtk_MEgt)9m_#t&$(O>MQtkgzVJjGvqg> zxAeE>`%^e)o8OMWZHdXr$-$RGUR|ja+`w7GnD=PMj$Lz) zW?CQ6`f&N!v17}YNZx!9zUb)nTLUunGD;FQ9Pq${)2;KYXu_-=8ZjEj_zyS0KOVFKhE-_;g7z&XV(6D2yAX8 zNWyK$rMJgEiWM;Gd|7)XJK;W5=5D*_?gQQr#47l87~gaJ-|rOj0BCWqud6a50|1Ckb;OnWCP%GWcid%8G=RLprh z%P>R4QKZd2c_&wsjF=hsw0W8#HXDS*beQBOg%l+v7Q5vz-Re+s*&uYNQzNWs(TxZW zwN^(*9hZkL0k<3GcCj=GNl(17hxh!$No&d<&dK@5-?#T>?dNB+=iW}tPj}={Y!Prm zCjzI`vt%$|c37G)SL6l5+7o-&9M{C{HRvepnQGMgxNQNK&dudf8~hGm?L3(+aOBlh z?q-SO5t^4R{)KN7>xpKmW7f|t`yaaC9Df4G4(>f~FBjYHMK)nE*v1##y8i`cGdwDB5Bx6pF`yD zCQaX?^lcSm`rF@32CO{H$dD|TD0yz05;&XyV5 z-eyPjUAbzRzw?vXXR}vg=Da?qyyFC`Q?L2?-F|xZbLo%Sn<~Eg9yaZ$mYUzaeQiu} zz2VvfPlNcqC+3tKKN`|3-1u7JUHj!JKzqNQnts?;w|nId&V{m1bh^Xur#S9>$0j=2 z_xcLsmsV{@f6IHBYAio^(tDSVAL{_fFK6uIZx+=75^fwCOkLzC6@ zD|1cOe|U5!C+;-Q*C0*_#Q6b|-Zy>v9T z_Q^1*D{cYnc1Ewxll5+D4;B6Xf0n3U+_k4=esQ0=j%srjmF%{-{2(%T=AN)6CtQLV z_)p>o#-k=A|j_zlAcbm2H q$hWgh{7q)3o~U9;tcooWt@di(XT6ne+Z%v6h{4m<&t;ucLK6V=a*!7Q delta 509 zcmey%Hi1R4Gr-TCmrII^fq{Y7)59f*fq_vG$d>0|1ClGGs*5Hn%GWdQ@^o9wkrm+^_NrZA3)8+4CKxL3ul3h1 zeU1g_N_l{)p6TuMMAV|NUhDvFTeLJHCl09eQM)={$pGw=MQKX zc>Z|(C8$U~u0j0)%MRV0Yn4{n%?tTedoM`x%InFeHr!zcTKoUP3Hf``%w~;|2|^Z3 z=Ne=anm$Y{nEm17&11)osokCur0i4Ud;BTup_Ch$G1pnvHKno~Z!txI%#WQl?~~n{9eg@W{RiX>Sl=+2 se|)ZM_b)abXxijlq`;k|!n@I2$@D>Mj^T|IV2m<&y85}Sb4q9e00;HsGXMYp diff --git a/test/golden/enclosure.png b/test/golden/enclosure.png index bdb915c8724eaf28cd779c9643d24d1ee3f56727..c0c84dca09957706efba5b0d97dcd76f2c272121 100644 GIT binary patch delta 1934 zcmV;92XXkN4wergiBL{Q4GJ0x0000DNk~Le0002j0000l2nGNE0C2ot!I2>!e+NKG zL_t(|ob8=|XjN4lz(32f*wfmImxzD#)S%FrAs6o8uxRVXVv*LUX3o#Tf`op6+wpUw97N3DgTINTJq0*W$PQR7mS zAwrEyQHF?uYc55(!MFz~9fte-2K<$;f*O}H+W1(a;C~O{J?;hG1X}V{e^TR8MkCJw zCx=k}1}~K&Uvr&235ym%Nr`iGbw#aFUJ^hnkd>n%YK1Ju0*^(lgfc+n#+67wYb!K1 zMy-h_P6CU7wNWeL;tt>o;H9V)Q3imPPsFhI$7%|4B z1maOKtoMP{;;Jem1Py51f4I~DTV(P6Wz@gs~6TjBWefwHAbA(iqk>%UGO8}K?%Cii&_@ViMn0lX}qf2RU(iHx;!pU;60 ze98n!0SiRN0U#{{%3LX16(S-SmzjPR@Fy@G_*6WA;oGEMUVi3$HcK|&kxV*AZ?E&c zv(t&D)z|00&OS03=bB`aYMp@a}yh%NwLk_chzCzroW*^Oxl50Ao za~Z0oJixGWl`5dYfBK%52<3Xe6JHZ zX(_9d`y>j;anm3=8QqPp)mFrI{UFyK@^HWPBGU}nago_!Jxe||$Y2_dAjXx=l5K2s zjKVe)FUHm0e*Mqt>z$w3@{4F($jkK82~w_?W78}@3-YTke=+Hpx#Ud+zLn2@XW5k1 zS+NEbW5nq^&y$a4*K?Y7sj`g1-PVPua1Ab4#)W0Db%R_V#JCWhvmOT+PsUZ0fX2at zuy-%SttK?lzl#_B$%^F|H)hXv&O3I5(ef(u#HBiIm6_<@IG?g|xe$ltToXXIQox;* zcm((w*exA(epR&;c9Y$^kiN z#I+6LY8u|i@w`29F50hG6=ls8i$Qxk9617=oz7ZmC^+VIb&;PwU=Hx0yrl5cdv2x$ zxaPF0BPM_(a6#5X?*-Ilzw7%$ay~l9eS^w<8rWmWf6BKenvf^yeSZ#J#{J7-2=VMW2|aV|+zFdD zImR?te{}HlX(%nt?eh7-xQ8KlMnFSC^Aqq&j`Fz3Y8TlZG7zk=>QqS^ z1Nwx7S*2ZP4BAO**GD%o% zNVi)<9q-d5DQCAM_78n4an${Oor**?NzG32j_vHrc*? zf1u3dy#RW8yazRsN!YyE+01KbYI4?a`}SQMFbRlh&?Q!x$$KF)g4dwN_cF8Ck*NlG z@$&f;_-f$1%oJXUNe4Ci4i}5=<~ie%r`qUK*9ju0McQDNOVW;xifNx^?RudEm(F?DQ7S_ZW(=wsIP2F^IUV#X9nYcx_U0#3ih2 zcFLzi?3AAb{0wwU=c$vI+#vGPA@XN+mW+hVI<4}|%>nXISnJocmFr4b_h|^&e@Uw> z8C6y;EiFf(bb*&pe1(;MNXt7+SYiJ41#}<2Jl9A$JQ~+XBq_7hs;Cti1$Z&8uy`^q z-CGzvHIlQb1B#Q$Q$_@8T+y-$cole3)-TE^LX9gL#sKdEPe|zf*QgazijNvsG~6V+ zvF8^03qs0`iyBun{EPF~gOpKBWI^M)bm_LSjg4!s439dBQWTa0XNOS!97&txrQm-# zf$ZucDKs2hfRc}*RziuC8lS)G7L>1K3zwoOilQirq9}@@D2k#eilQirqKqp32PpYc U(8QztP5=M^07*qoM6N<$f{7lo(EtDd delta 1820 zcmV+%2jlpb52X$viBL{Q4GJ0x0000DNk~Le0002p0000l2nGNE0B4@h2$3Nle+JJ< zL_t(|ob8)`XjNqx$3II8^eQMeHz&rGf~?ISG;{sJge(5ha6|=R3zZ;dQPYt^AjmL? zU<;d2ErjykCY2D(Ur;hj{}9xK)i(bKl8Jwan+BS56a=?Fp7-UR-QBx;&bjB_b8^oI z4)5K2-}AiBJ?DJiAJ20JilQirf1)Ugq9}@@D2k#eilQirqLiD8LJelj_%~fsbFCb{ z1jhC2)$HE=;o|o8_WzgT%Cul+p$0WI*SLE1p>p^V7V^6(y~HPb0YF%RfB z%R?pbF7O2KCr}G~3w#dT^=Y#i*Z?d5sspfRi34rs^TWUg#^x^5*RMb$a0Xdgx}^bl z+kCzS>;qN+FB`l2fKxvFEtOs8^*s$FftP@1Ox-&aH`p{8A3>gne@nn;!1*F)qR{tsP3Yx3||6_-T7hUk&E( zO5iwf5r}!bOxEw6j=DJ63lxfp$BoUTqpsQ1xgGB3BLiS@_z_(?O}e8)9>n2c@1pDO zp8Q=;&tx$MEIN>znnrG<7qV}br4E0BaMFbc*kT`q1euh@?^$gM5o5ByUB*@=a!vC6 zrZDW*G5H!=(Lv@qwB$M8ujn8%5WB&Z=mJ?@o;d^K<520if9;DFNjWy=-QJuzlj~Nl zlroiqL}K#yKG*|%$;9Qzh$-j#uy-p*o&6u94*V}Ok1{br`lu=21ePJo%3tsnMV)PY za`G&2!q~Y1ET_QhOl7nS6UAU(>9Ud89^fpQ>+OdtNcv|ytNt=_jRPYP(ZynL?i}>@ z%RVfX3c_k`e^M#Q=>^0bWORHSXbsG2ZkFQjp~&9*Y((~;)kwf3m)Hwo1z?E-^~fI4 z;>Xuw?am_q1HR1hd9^9$01vUDc!gQbK~x5!IQMcV zPr|T=ReY{};MucMHhB$kh?A* z0E!mfnl(}$KAfquc{_lS5%0m2W5?jUV;nqn3bt*7j*h^BD8HF<6B(gZlF2PC!h4v1 z0TV~lIPfWuLV_rMr~*cTM}XHHKH0Jk5nZoGyNeM4|A<6tuV>k90{+7L>|83lwaBVu ze+Uun2{K}cAv0cz;_{((8R;C>n@!&!&qsM)9(R*6IC6w^W22-EHgA@6!RV;u)#~eW zrvUP$3|d=BkB!MW)@Ea)^x-!3;4)=UheX6|n0PND6dQiFc_la4TwD_pVzy!C77sSE znFoB0%o5*_$<;L*`$;5>?#I5(Yb6~%f9`bD`F#zcRCW^%8woPG%cMCP@}CO0OBuw- z>Vqc&{78PBzh!b4GTZt$ty6Esp*bXS=a-pE; z?%bJ6XJ;`l$(Ns-Hy;e!1toesMsfe`;f7gm8Wj}X#*N3m9~f9ss9B`gu;C=J*x2o` z{ZJyqAHY{-=;t5cqcZfPD2k#eilQirq9}@@D2k#eilQirNB#plZF1sM?x~mn0000< KMNUMnLSTYW9DZs5 diff --git a/test/golden/eqnarray.png b/test/golden/eqnarray.png index 44ab3725adf67196c1f46afb0290724384249a77..d7e4fa11c269d84336acd579fea75fd3de1b7560 100644 GIT binary patch delta 1125 zcmV-r1e*Km2=oXciBL{Q4GJ0x0000DNk~Le0001b0000}2nGNE08si98j&F&e;!Fh zK~#90?c7a>97Pz$@&86|ox@({kb^K`gMy5N7|6t%Fd(9`UPO?|$wQU|5(z9Qxdavw z#Di>Z@t~|AcoZ2u2z!izEXI7^5IKR+01x_7$g?dj_3 zw|lz^L_|bHL_|bHL`39(*tFLee^}2Q%p7!Vd-rvy`B>(r0)FC@nu~*_xYDC8>uy`VIzxY!zv|~q3(Fobq2QFs!dnGmc4RYxA5{PM^K**Ie#B8QKQ;3kc|oSU)*{y3vCoDv_Jf@m8q{pVFtP#W zN?1pd;e;P6Df4Ss-44Txf3dDIR$i7~1@nhZ{E!JcQ?4M!sjW?H)_uv!KZ5xsWqv2D zycx_tGG&>8W$8Zxd*1v#;D=z|yuIPY=5q(t?gk|nc zSzjmOA0yi{ZqHK0Z{_Y``z=(*Yen~fxAs{_vdtiy9ePJ+&uUffn-qiKNO9BCYJ8{W zlF=DqI)5C z0CUv0Cql>8ueenftvBT)>(+PaFmSsCeWzQ=f5^@~YTLRUf1TQ!@*r}LCEo&0+xrrF zNXm0IYRL!)tyUG*tv8!lo9-U)q4%8ku03;HN|QLSE$9zH|7t>gx4 zs~ec6DsVJicXd!=?oc#01XXw$RcbQkhG>$6j_^(gxL`L*O6xQp8rzsAC5&h&&soiuCcew)+ r5fKp)5fKp)5fKp)5fKp)5h=|7sOKY!TG#8P>9=)v-OZqQ3Fffg@?P`p2H zUX%zThzG0DLLtX^D5=#%1i?sqYG^2Uu;=tJGrX70{+ZqEzqjxAfo0xK_Rs9h?(FPl zXFx8`o!9_)1=tP6nd(*Rq0@^>Qlgzx)V~7t_^?l zS-6b_{+SIE8!s(#(uOa57XC2f#slCo@Tr~u75E7F1o$rFw#xGH$nOC#e{FyN2>h9{ zt~>{~6#BChq}W7QM3$=DxT*66YF6UiXiRtYOl$g2^C&B~03b zxRp3~d~UgAyRD@4suGp|uCZ2l{s)+hTnoi_?GF2%+gY^B=b3ymebz1;PUnJ+@5QX= zGIKQJ+_9ydC@?(9vQA4Lf5(K~|0eOr<+~kkeWEkW#di;_Q4e=Qg-^hKOuXZ+l<;x% zXvU-663O|$Q1lKr?S^MV@lAXFb5(G-;9PuEfp>_m6`CY1{|mk4xT-BGL-v8yB6oH~ zaVMawa-*(RcaJMA7a*dld!#jgRS;B z7sz)^H&V6>#pb`a0SBv;KEt!Ri@9=rTk2(UHAoPeUrbqV)lQ=Y+qH3N>sFz#{GamN zVE}v&d=C7JdExQ^f4BzBVXB*}6nKUmK_B?q{(c7BB;N~{ZA^jhm6Oa&#wq_rL_|bH zL_|bHL_|bHL_|c&)y4q73~-lOBnebT!HoUy;tK5UdRw#HqOkp>nvt1lD*m81Xr;OW`l64H4 z*30^8b>oQpf2;Z)?#3|NJyNP$#J9lrfZr4T-otNTpRxx82s>`W@aPHRp~vBO(6cnV z(Y8vn1|6!M?|=YK4>PpH4yM!mU%)*|7zMB(`002ovPDHLkV1jMDD@_0Z diff --git a/test/golden/grave165690505.png b/test/golden/grave165690505.png index d1baf77b55607c17d902dc46b64b6a82a8aefad4..19cbedb2efd9fc88bfabcb9a0182ad39143c90cc 100644 GIT binary patch delta 906 zcmdnNGK*cYGr-TCmrII^fq{Y7)59f*fq_v9$X4KB1CnP|w;!FTC|}R);_2cTQZeW4 zEc*-*N0D~>+;GPUhYzJ4yky+k#U6I3$@PHqBriXmoO2z%3TBHq1lP0(2p;|9vT>t; z4_9;3RE;?tS<)MVCpriutv-AEgN)h7yv3*QJo|21z1jTpx7l;;x0`QPXc2JYP(&vr z+W0Q8*I!aRb%xniq4UgYuB5M8&Z2K6v`e#&PgG#8GLA>A z47Tp$iR|Q?UVcf(XuVd))zv(qTawpYSt;w@c12Egw)2#eYtH=tvGN?I{KBaZ>}=w-FhCHz$d}1 zrh820!=`0%(MlV2&((CVPwh_TF4Oz}{$5#XkoIKzyfR(?eO33jO4QvhIHqf+_D(AI z^mc|br@Z3?tLsw_E-E~K^z7rWKPT_1$ero8;r0cdu!q&t@^;#Mc2Mq^_&(~%rP}Gs zBR8y?AI@{VaM!0v;Y;E==YBpDJ+E!HK$YVekgfvn&9XVAW?XR@T&K_M>Pq}s>z>K> z(qu=a=fST1d!C3+4qvR`cAxj$9c9i-r5}GiZ|Sw-NId$_t>Sb26V>&BpSjqdmwk>( zPoL>@z+wYOjl4lUm(0eaOB^k;j`M$-biJdh_vXjHW?!SyFLbJv8sBv5y~TM+_j^WY z$VQcjHCa3UU(YG{ys7E9W#vh2vGpn)fhHE06V|Tui<34w;c}T_9)tdyMU{)|I92+0 zmT*@j-|pF$bf4+uUA@}V>*_C-nCIWDozL*RVLsSv>AL@0mL7lmg8li=gws3q;${Pl zn0&)kFQQ7Qg8faA==^QAKjzdi%Zu5SMrA(b}EG zK$Cppe(Sy~uAcQvs$y%S{IdY_^}do{TKDP|a78e#i*}ALHog;c@U%;Ud9!%CA9K3S zG4}^?3Nvr=Ms4KMiMCpQC-%WwV8Cq*=eo1;&-%u8GX?(}J5?V97W7(Ga$+Q9Q1Ui= aXr4IjNW_vE^JfFI7lWs(pUXO@geCw3$C~y4 delta 549 zcmbQmzJo=vGr-TCmrII^fq{Y7)59f*fq_vG$X4KB1Cp_3=eQ;+%GWbK@^o({(%Xi>T*vtWZu6LX51(<_P2tp-Y|P6{e|0);I;IzAnohF=(73TkZ( zm7Ne_HT~fEC-a3Z&po!Bw*UT>9Y5pVrl0PWZC3G|gh09}2V`crNaf2Md+jcjAHQ+C z`qX95b*FB7H$S9)SCPz`6Ah9D{5;A%<~+$~58YUK^xnLXS@X7s+}c$i^zu~UhJ_Xe zNpl;!J9A#`kA3sjbLq=U@1<*ht501g!@gAQz;ln}uP6C8ZT5J4Rj{}^$g&M6+Y6M{ zlVz7qs$;Qf>z{ml1K;ng$5z*`F3r6=y;#|^bncsv_joFpZ5ZY18RHw|4^%%;{J>tp ze&^J8Jn)w>`POR9RYDdiJEW)$F17SoW~&W88n}^`kds zlGFAwu^m|3+uQ5wS-j!va}&2UcKa_Tf7T8GDgXa0_{U;f5KHRp!Dmmd*P8)B>8$!y z_k^|b%tY<^Pptnxt-3ciCnsl{Npz?s=huey2mC+ne&m1n)9kHNtJ0E_lY=k433;kA zW#asoaqZWi9}q3rwIwLOaV6Ns&B0gOMfDrR59B{k{vh##A*TJle`HN;I#Ao@dmc!^ d@A+!Oe$~`#;x~-0#gQQ&e*rn|ZsNy_q=>LI@#* z5JCtcgb+dqA%qY@2q7vb*n2;2bn0jt1uV9k|Dfk}IP5V&ohU$Z)1 z01tz9TEHp${EdAdK5LV4L%>zwtGwhDu~!|qY_C^=8DIn$vpQyg*A?~J6xq^dwyasV zrM`K4uVIseO;;whGTHape{su`O{`_hg?_1Y%1yE*u8pSUn+K-lC9jCR8o|VQ+tus0 z2zaXEwP{+xEc>uEnu)h9U3YnAgH?%^+lP=z`<08~U?6ZE!<{(eL7noFS1exHij-&8 z^3>c7p&is&6|YSbF6A|Y%}ccoo4CR<)2?G!et)722kA5zyu|Xze@kAmdeu7AvE(k! z%p(cXRq^`ogh93#Eu_#sMk7qZ#1d9lWi2#R*NYudLB5sNVz0<1SqX-q|vv@7T{ka<5C@wKj&`;4Qn)6Z@UX zA9=|uQm^xt|E#4)?dUJgi@}m}RlK^A=SGuQBbO{a27CbaxQR3R&K)TTXXNpOI|T~9k6;|+SAmJe!!~<{5FTGd37c4hP`p% zG_V5PvOwQ-cet4jn~ClO8;8yS=d6y;z=J@tVFR>c9ay$>*10+0y}aZVu~%xpY+nK1 z0*~#2JZbMO0#AZAs^lev5JCtcgb+dqA%qY@2qARRSLlWp_kVs0yVPEvuPcN+x*Qfl@V9=jgp{_bn% zrk8KUmahM;ek$PD!TPO+2F!L7(i40d_a9I>oV`~0`!AQ9U&^{KUH>bbs`2>2Er}g0 z-!5J6$=m!v@aco9N&EbF?>i{^G;Y4e?0b2EzjoCx;z^YWIkV#2j>%tcSgD2B-|gBW zW4ZWw%zTaSiMw52KK|Efw4^ZLVu{6_rvf|gxyk1}N7h@PD&sLpTm2nz*@kR!??dO`9XhgZ?CWOWlzRE>4m9}ET5(x{CTyDvwO9K84!F;TiKpFkL3;X z^8??v*v!AXZ^`jE=G_PUrKP23w=LWJD|Nr^DszwC9ku`4fX1A)|E%}-;zSTj$~S%b zn!3v~Ke)v`WaewP;yLscr zjhPwmuA~WRX{7Hm&-|(SLA0Xev9BysI!F)i*}1pwt+8N@W7yvioFHAnUE{sqKDlt` pxnswUExQNwBP=phJf${hm$qDsnPl6U%fJmx3ZAZhF6*2UngBrB2?hWF diff --git a/test/golden/mathring740120027.png b/test/golden/mathring740120027.png index 6435ccd3547632318d2c050365fdde7bc0167070..275b8f5bbd291a67de64d508d118dc97fb6155ed 100644 GIT binary patch delta 941 zcmV;e15*6W1iS|!iBL{Q4GJ0x0000DNk~Le0003R0000W2nGNE0L>-0#gQQ&e*3S20YYMa$+IK8L#ULu{U!wZ@$@gyWGvqfe=Cn zA%qY@2qAjklTbwe-n7%OGSWAs#k7SIMR*qbabe+^*D9*qe7 zR+Cu0iqMNZ#!8v;D1;C~2qA&;E=uk!oCk52liXtdEm3W5x9xr-Z)Kp$tzN? z#Ogc~)~4ca2(2JyS-h4_EhyJrQZdEN(W?7s)oEf$uvk@b->+HVB16N+Y_XFMyEHMn*MeC1Ouh`YEKGk#n_K;aswLzJGY7N2{y<{>!Ao)S?MaYdh^}a%} z<8Q(wRP>+c7C>^In}4v0NG|8&zP3pf2f%g*~nrE>mSmkaI%Wj^}qnOZ;X9W%(0L3`)f zJV-ZAV2)s$$9TU{{y=yF;|{ic0`o52zH#Hmli6NI3H%ju)2&<1=g1r_)oy7|&Nc%A z=UEfG_PPG=`w;fv{f;~H@75hFeeEEk8znD=Y?~Avr+lX7?^oS->8{e!(z9!V zchB8%aawP0uW#qFO>z&v&aVftXFl`0nC|qq-S_YM+b!4Yo9%#B-ss72(=y`R+Q9r^ z#)ptUsWJc6w+FA!&B@7WGf5Vm*PwIp5p@YT?N|ru8fFsQ-cJ z2V6JQ{(OID{viC%KfUky*KdM6Aq|TSaI_e|vA5B9E4bCbxW)sR9vD1b{an^LB{Ts5 DG-U-m diff --git a/test/golden/overleftarrow567687850.png b/test/golden/overleftarrow567687850.png index bb17c14ebeadc0cb86f8f87d5533b81ac2b22132..e3ad825fe4b83f590d2733581fc5354d88a4c5ac 100644 GIT binary patch delta 1406 zcmV-^1%djQ2Z{?JiBL{Q4GJ0x0000DNk~Le0003Y0000c2nGNE0E=%e7m*uucjlbm z?{jX?J#*)ra|eVFLI@#*5JCtce}oW12qA;e`PoTpJzulcb>0&q3(UTld-oCb{PE~qtJ415P% z5-8p}U?)%t6fcVA_$5HREOy&uf8jphi-L0GVXAuNVY+=i{|xvwwoHrp2DsinOumXO(*|5v z@6BT;5#V7PIIaNJ1AjCrbkODx_5vH5j8%(q8(=RD^ z*fK5VOWuObL8RC4%u6BVwX?OK4Gi8qJ`|VeIX$@4|p+9ta|LS zIgF{s7;r*ti2z&#JRe&kBA)}t#g=GSj>%DHwki#g zamv807HbZ$7C2xlaXt1p$5URNep}-10k&DE@3T9q9^e+cAW{-w&{pH-0M7t#0e1p3 z&3m=w^}PU22kz}cuLbu0rUtxb*_MkU{~sIis^sXOdA-iDf9v7dDdsiR&R0;X-uK`U z;C0*olK{iOXr20HE0fsqfR!Jy*9L$?RxV|g<;BVzvYgATT$&%J%&-%q;?yZytWm2k zug>zy(?8`^tXEJHlXMw2iIUT3zl>kr-Kf}ab*fH-Mx8Rf8Iyl$qj5U>fETms9QRt8 zG|q?}SLD@Ee_na|r@V^y3QEZ&Tt*#%R5GD9RquG6(`alYbvt*jcU<;PY?9&R=UC=k zAZa_wN2nvO_VdcqKjl@tSE2XWRQ8T<=GUfto9r+><;c(21W`V@T@={}#l zt7T>TnT>4?)LCqQ8(CGl40r?hSzcY`m8XBot9Y-&f8-g25*zW-ku^)8?9CncRGizj ztVSo^#97IiXQ0N3t!CUJR-J!mT_FAP>Nu}F{Zn4Wd(|Y*Aat!gzR~9h;0dhsmj7HT zzz4R3i__?zoHAA0iJP*)a`rkWc8~LZ0$d0DZpS6yC99J-7sx)RPTBi$HhFc1SDyYU zuVTIGf0AbqI@LzKE%qt5-${(U_M7dj&SI|pz}R!vfQ4TDUhBNCICbU&k6Fx>mVc&G zZ_wf$a9&&FJe#)Ma;CeJOSZSg{XsQ(b%s}-{wc3wz3P%@vtk)|9GC#!x9$3a_PG9p zZHjuKPW{AwquSjxbro=p)!zX;={2BgCvUixECdYl&QNh}M&pu9*hV_lV_H&+L&(dzI(@9!)R%z?Uhzvfh0QNAB?bTV2 z#CBCJ__pfZaiwRsbb_S&Tc0gp;=S|e3g4AD>4;Bn`+_5p>|xoK+>sskK&@_a!S=Gt z`_`UycpG{bVdKFU=S2P%UKilK!~Tu2y}|Nd{ioLlR6g{6ytjP%RfICfqqh#UJLFz1 zjD8rfy(jd0vS4wp*vj7HPQ?KmBM38AxyW9s{A8h%5m$&QwvRsDk z4Ymgy?@a%=ztP(6zgUHx0&{^xg@x0yHFZI&eIH+xnKF^{mDz<)^Ro|#ZQwZb?WDIt^C>i!2h!y?U(;4ygDPFLH*^M10Z#8XTMB}T%h*i zjz7~J=6e_Sre+7$^jo(6*5iJ#!+zb9e{qN3o&l-*V$2*Vw&M7K>UfuJPV2sk6tMm< zRVZa*pp!`ny?T8^R@1r+C^0pV;Ie%R2ADK9>Dmw{27Pmt1XleZc#Uc;a6f zhJ8P>r4Dq)h}}7KebH~<7_g6g6i;{0(!JvyvA;$!`=3qpl6g$?xj&gcn7F@Acn5b3 tgWgZG{mkcI#618x!^Bt#3kYi6fB3(&&h9J*YhdnT@O1TaS?83{1ORhqs(Szc diff --git a/test/golden/overleftharpoon580184352.png b/test/golden/overleftharpoon580184352.png index 4bfab583110465adf26185e05b114e9474154122..ae53f995fc1c21865b226e87a33cec7b4547f5bc 100644 GIT binary patch delta 1159 zcmV;21bF*{29*gRiBL{Q4GJ0x0000DNk~Le0003Y0000c2nGNE0E=%e7m*O@w#VXXISQLC<#QIjSK5$`u6pD~86k0d`DSwWWG57RLPVUX`10k7v z&*OI{XHJGYGXW715fKp)5fKp)e-RN85fKp)k^i~_*p{%pgTRFe+pBXYa8Jv9#JJ18 zM!`EkCwGWUwgI>24zZkk3>1mlS_eFzsI4Z46J}27Fff)oL;_a>&*Tn~$(a2fWs%$m z+?%ky4}daZdv$g$(X)*Q?F?<$tpGj)F3ue!lShEta)($ht^y7uZ11r}e>jC*5A1Kb zj~LegujLMr$N^w;?hu(=3%r~=#BwnK{0OX0(AF5R2Y4|-TTQkAKL8iB+|Qu40N*dc zT!T6fcm;SicaTi(2EGGU<_;*;631Eg7)hC4BQHQ1N`1n zA2EKhvxcvMKXQjTL)Gu`e_h~I?l6n&C~!0I74T>7FhgKN)0+!fgw_LRr^~Y_PA<{R ze*@>{4k2gkAK;waA%@7I+yO*HL_|bHL_}n1S;z;|^Xa*p0FMJxz#3o^u*$aIZm3_n z$3HFs9s=fo9aeuo@N`gT9JtQjKLpGGH`zT*tL(DrPp*6cYy~d2fA?Ro$3*V8ORLB2 z2Fy9-8o69C^HaIn&6QLi*zUGxfY*WDwgaYt*@pV1m8l-3n6&aU_S&Rf_VssDZ?}H2 zGN-K1jaIJeA6I7Dwb65RN^5J@>MPf1<%*e~%GGYJqzVh^ODat(j3nE9z(?dNJ$7$8PC=>HS$*o6oW z5an7Pxnkz0a=-xGDfafQjJppVtFEv`e_SLHmbe`@s2b`%&w&>vrrB_kLjyte&v# z4)BuIDck|_f2*rg0#_>6$mNQepUTy4u0}D7&_%ZDy=i~tj=GMq*Zu;&oTvV3;1m0g ziY0JGP`_)F_f=QtGT?D*bHe&x>FRB@_U7DcYu!H$+hl#Nu!=5o~pUQOSy(WSIqoWuJ&_@h=_=Yh=_=Yh=_=Yh=_=Yh=_>f Z@h^!J)%MJUUVH!m002ovPDHLkV1mXBE!hA7 delta 754 zcmbQr+03Tc8Q|y6%O%Cdz`(%k>ERN@z`&>hWUFzo0m; zdKUz+ zd2d^==Gebka_aT2v!72>+Wy(|p=rj6@PswX_W3c(XT4g@`*=yl=Q}}9%Iq}vu<=&1 z+*!MFylAODVSLWXnzgpA-f;KF^ef+A+&1;=GCQy9n)iJ2 zq3j9Ie6F@17SVXWRJFH@H5TIfUa4n_KNW%xL?*~TbiA%pz-S>_U(Wj@aN>I=^T+=j zAJ~16-XZ%rzac&C%#53YGo$V@RTb`MUc=0NAZ5-Srh@fK_gT}D#2#>M@X#olTd_y( z_DsWMwfFTtYx@MaLLvhfbaAdd{#L>GK*h@nt+c8y-1iNvZ3{o({-D~mPA)=MR=(?Y>Y<xzBH=P1~mX0njl z?!EN9b<5P5lE!JD&htzOS|G>t{*g)-*Un9uOw$|enLi01P(QR^X5oIO-;r6DnZJSU z^;tTFsZ^rEr-Gwy=7uV*eQisbV_4&a)D0oeP>NT~;yl9s6b aVZC_i>#Sd9>ZgIpn8DN4&t;ucLK6TT!C9aH diff --git a/test/golden/overleftrightarrow424866188.png b/test/golden/overleftrightarrow424866188.png index 3fbf58c13884e705adf866fd606fcda8bed3ac0c..35c5a080b767baba2eb791ed71a906f7234e1e95 100644 GIT binary patch literal 1763 zcmZ`)dpy$%8~+*RPEpLQ4uy!dICGG#Hj>HhXhUOid)+S^lY2I=OUk8^=`b9vw-JV1 zo8BxPDr2KrF6kIixfROFC0_6Qo`28tc|OnOpXdAee*bvBdG4;~l;pMK0RT|KINEyv zfP~)OY$yxftJh=AH1?WAyvI2-z~br5?=4dCXbe_%FVbX#uL1zL0Ar8BCefGasZF>G zI?qq%YYI`=4tI+}RDMh?w$zct#L8v|MA+~87Qt>lhuobV-lD1oIQ1PKND6uIGU&mo zqrF>W{;G)`Y@}crdRmP{csXt!hr`p65iyLob6raKVE_e7u z(G$pJA4Ya3xv+N*bT zpz4>EfCLFbLczT{Z&xXrded+9<7eOx!C}QlkBdU6ecfq*4h=h_OIbf#IQfp68<(Xd zypA_PP`^>jt~M!i9Da}2Tr;NmnOs5=Dzs3gD#es=>mI1I=fCQWTsDEvpa%V(LXhRS zY1oNPiCD>8+NtRlN@JiimyzVo)$2&415qzlGdE%TzI(S+Qg$Zz5cm7GX^;cek-$pB zLaXsfl_cm$=OF;;95-9H4=QCTNuZ~G0H$h-&BgEa6L`(w-5-Ht&fpkudr8x$&k9RG z4j`Z&;@F6c_+Rf@sfVf9%57KAJ@pg`%-{cdjkUqKbnqTG_en~~KPiv!l^OR!eU`~1 zYblmQSzS0axRkRuWC8HP=sd{Peh{zicrGyq>CNZ)@) zdRuv0i7qjzusuEoI-Z|z5nt)U%W4GCG&GsTg$oQ<0qxjeTob4hKC=TqX^ATi#wim< zEt>}iSY?m0-5}+QE7ScBuS&p!twui^>MuD&!y&uFzQqN@n18@9<%6X0nqmEG>Ju6Z zw~p9C)!;4ty;y(WyyWl1?loTTfZ>eKD`)=vZJlWuuZ{OhV$DC3#Re|$D#}8 z@9YWa99a~l12f5a>m>RJxxDCP#p^jsLKUfn<-EK+I7!qEb<^!ku)!J{cJmVg%Bo`vt@xEKa6uNa4qJTOJZl|rk;;p|&NoTs_!y!m8r%q9@y`7o%zdE%ul7BrB5qZv3t@4k9^w2?TQjq>I-YTh+jnlS`~t*v}fX%DS{q z&=&h~ExhXf@nk~k*p!jSRSrM2A#}T*F1ogH_i^qH>$pD8KN-90&lVg11sth@tZ;Wg z_zkr<$i2uBEBB083)*VXp=j+;I1edlZPJbmyypFR`|x_E;x7aolgmsmW6dVa{lQez zs^!&(^nABl(TwHbk2n^$88mN98*6hw|?+SW0`m{YqKYd~a`-bUQJ^rv|O z%qNjHR`0s5%yW)WVD*JxHF3@&E4Xtqm`8@MMUxOz7q5i>bH7MPUL|=B^vjXD=*8;B zf-CF}#UvZI?fff@iG(sX(CNH7y2$nE0M;KoUN)IjC&)-wF^UukT3@#~Z|2U7x*n=P u6(NrFJmr$%>3^xj{oC*VUsqs|zRL&=&#p~Bnwr})DgblV)t-g+&-@QmYDIzo literal 1002 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 literal 883 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz)i~IIWO)_aT_D9+9OUlAu~T%Ci6BS7U|q%!}PnJC-`Qc-`k^pe*Mh3DfcYz z|BT?+*FUgt|R;xw3Ox$DL=w7n$t(c6a;_c(HeL9Y<@)8OHeyx1D8@r@$2$ zvhPXD{jRWR+xxlh2M+ffLo#d4s{Gf#EYbv~e{pZjKcJaV#PD4DyMwht+kliMMN%-Z-B5w68a`J85Z7s*#_| z-0bcXxpsoz6qc3M{yve>C3zLuw9xOlGwwf{yLd;o{hQ}%yPRJ}`F*>kfu9K{`dfTlSy0BznC^(zr5>Eld9> zQ|PtG1y-!O%X0P08*-QaHP*bmZ1;n+de+ClN~&Hxw_GvRXKGw|*rAzQYMJ)1?hAV| zpOJg%-`LFGGar2_bibuH!!TLx_n83S3$coe(_Y3k&NNI;%T50$btIXs{gTan+q_vIXZkEX(L5`+t9?V=5~pXE z>(VFga{ubDVbU=B<&XIXLLaacSk3*+T`+$s_Z&&%v`=R|kkTnI&1TB{V+e6kyRbk@ SniZIF7(8A5T-G@yGywo62$-4x diff --git a/test/golden/overrightharpoon301951104.png b/test/golden/overrightharpoon301951104.png index 0dad5003f5322e936a0032b91eaa56da55c4fc1f..55754fe7be68b0cdce0a59d09a2315b7799bde74 100644 GIT binary patch delta 1198 zcmbQuwwqJ2Gr-TCmrII^fq{Y7)59f*fq_vG$X4TE1CrhOy5bWRQkrqJ-_o?S{r6LsSFPH$ z@73COl_mboGvS~f%8K08-*E9v?H%qrvv&52d}rS6)&63le}m~#XOT_(J2sYdFn;1F zhip$|-h+de6uDNuK6+(WvEGM=Uea@?sdF>jXX!(Il*o3#{+9T4 z#&)mvl`)((6Mnw^GxLD>0aeN09vj(yaNP*9^5BnQ-LpP-@2xdg`L627ra1Iu-0Ppt zC$uYey;8E|ZwdA~hP=}^+`D>Dl@`BLu-(8udtK`d1f7N$PI~?UZO}vqJ<}Z)Hr&Wm@We*G=*d%CwNO@_Xep6#Zq`a@X zSGy!bI`iy?q93&+R|(a^`Q3i|cm=)v(9JSh*;AACO$? z%roJr-S2(Z&OpI02lIHJawE<=E05PR7+Y0u5VmlC`h8mFeTMpX*B zMjQF9Gnv+1`^?^G`Jn0nm+o%vAC@cPFRy&+TlFvWLBl!*xxjbqSJoHvhOe9Q^JPqB z@z)UU8`4vrH<&m6y~VJ3*Rmy(+g@D>nHTogQg=36-^#eu^}k$8`&OQRyDI#ve?Yof z#PO61%NCZNUA-4-Mm^XNUq$E5T!H*-ve!FbUvK_2<<^!a#bC4&rk%mHoI%IeRxl?~C2d zH&Q;7t-ZS-`=WUI*9X;XRyjAqW^eCU`=D^QY|5#fZF=FS{*bla I=akR{0Kelx(EtDd delta 778 zcmdnZIh#$fGr-TCmrII^fq{Y7)59f*fq_v2$X4TE1Cr%cYlFzshIQj z&i?G+K#BH`$K|61STxrOva`E(afzxcK6nst#8cCwQ1GDZg`5{RGt?Aw!{4m)?g{rPOqcY(NfdwrQEsdysLlDumT z&5~z@1E1bfDzdJh*I~NA?v+y6!VB5y_XW5zZ!)Z7=yslytp2=nMNzKcPFepWYzEwW zq)HWc`>4iSXCFv$`|J|3b6dxqKJ`PU9V_qb@@2X&@h|nDAI!*k9M=_=O?qv{y~g0r zxt+nts(&soy?y!kjPL(L{T9xvJIB<|R{x=9@jUfKr?$F2DYFq==jc;;*Y2y-4gY2< z`;M+jY6V3N=gnVLDy@o%cF8*~{7~wMN#p#*dQK4UJYGA0_LIA37{nW#4+t6X$FQAS zdjIaCisUf!(g$T#H6j%Zf0*7a`y>5er=)S(F(u=G@&>o67-q9Z)&wij?F@I`Ph4Nm zT&&4mz#OqGqiE}v{hrU$=bf2hI5|CSfnR{hicMk7S)yBJZo7MiQF!U!nNu<^VyZe72;+WCiD~>ysJ88@HFt+hqEp zw%5|NP@nsjykLap-@R^yX&~)?jALD;t|UK*)mn5_F?_p70q>8ys`jikOMXmO-g5rH zzUjwI8kp10%s6RxIe3YqEc?8GJ1qPC3cp?XRX1I#K)AxOP&voCz43gekE})LDW{7G zKcq_Pk{1HQ=hK-lB9)8NnjiT_*as=D&fI@>$-GOywMDWH95$(A-oYNjv~Jn+KTI}@ nHy@k{3V*y1%g8FkDsmW@ycs-Q{an^LB{Ts5q(xxt diff --git a/test/golden/text-accents-1.png b/test/golden/text-accents-1.png index 0802229a505ab0dc4c17c8b474db0960c9ca8f95..2f2029735166dced7b70f8c8a456262f6a08d96b 100644 GIT binary patch delta 1897 zcmV-v2bTDX3GoggiBL{Q4GJ0x0000DNk~Le0003k0000c2nGNE0FhJ8nUNtMe+L^$ zL_t(|ob8-Vh#W-}$Nv#e_KE>%MZENCPH}?xK~~5ihn9edgLqJ6!g`X?C_vcW&p1gflS65Z{Zuchd2Sd;FOjW;E z@4c$(SJeX;hG7_nVHk#C7=~dOe}-WghG7_nVHk#C7=~eVPSLjjcQYdZy8z0*1@SNk zumvEe&r_0lrDwT}{iP(kkNOrw!E#l73!*4Uu36uL>^H3F)<8#(f;uSKNiFE}kep^h zGR=gXC7n0ok$#y6{QjWe4r_({Zw4UiTPR{8V&#s99b`Tr14yO-)`e^(e>uxgI@wZm zSi9mi6o;NDx%6vj9cxCuxEPR)L7k@_+^Yc%o(1{bv~NKU3U-vCIq+dXcTCy9g6*&| z8Snt=l4*!?-c^_ZjJ`1+Gz`NKgv^3%ro2x~8WQMPN2?r#NPh1|tmfn*SH|d-z!j=< z>M0WfCrF2!h@1~NkA#lff3PB-shc%%9(5d9?^NXsW0^LrmScUiNtdtRc(RP)v z*H~di>+b(E5hz`3X{aI%F%}JzQHQjv7bG9& ztkx6ci*e4rNNGb!scfo|ewnguB~R?MD!T57jyhq@a#bYPqD9=qf5yrzLZ_})3ESE^ znNkFti%iUJ+D>^Vk%q`9u%&b8l|WwcC_QCjm_-_*5;HrwqQ=*kE30yJN?q9+MRr;4d16YWo#Qt2UhNIQvI7Y`p0%!ebC04XAS9yQAY!4%1q0(%Io`FcP@lG zF;;51H=)c;0H*=$cz*M-t;#sjZFVc*H{1It&td0cgCA}O`09S4ui5mu?wp~xC-8R} zO%E5;W8S9QDm{V~;IZWRr`vsJtU!RDE0r=qe~_HP=B9l z=ZV;eT304ie_tEIVx>Kt6SpL6z#fYegtlf0vzOeI=$1WA$IDY2R2q zxeev5XfA?Pma$lAA1hu$XIh#a0H4tNR~_H~6Tz%&}sNB0G9zg(~z`0C+ge*a23D}03SBgfA7=ZHB)ur)024%z>liTWh&#- zt4aS5J2&|XliG#{W#=y`?IFutqB3uL>b6+fORAm!Bec`n0I&?;3ne4~JP=sNO#ly( z(30Os(K=j>cAbu|h;yd_yrA+#f6#F$P{uXV^Jj7HPdeToA>$5!YXDvpBT=gUniM@< z9pEo?e_R#kQuUXl`btO}qDMQsIv372UJ|nhi^}^2r zc$x%l!*M0wa{!(Ka6$!R3`;b%KTac0TaF3CcAoj2a0b9P)R0Fa1u7_Uf4T)R=kAFw3caldrc{!R|tFwLWt?3Hp0<{I$SFeXXyAn9Z%9x zE4`%3EPLd8l8)Ead3pV1ac!TB8R@$z^i9=YlB%aGPjQNl8+2@=zx+PcS3=sbPdgvQ z|KS|W1yRmovziT%aw%;f57{6{&COV40)bMbotQg1i%yYK6g0A4H~iZ zAEB)RcwY44+<0YAx~ zzNC_zC5@C9#HwPd{!+$NUkPo)RQ=_-R6QS5kFpd1KBZN~t1b11#mXK#cS5cne>Ub# zYo*xuR?ug;F>;}v^P7szjr=Eoh1lRGmr5t}lAGB0`mQ}4W3f+!A4JW?Q}pa`Q?;pY zE(|@w-i>*@@s0OPtt(^9s0^2r8|GY(=Y;5AsAm(mRIr5V39*S#Zg}MDyZ-SYRDYkH zLwzNs4P*3o{j+PVo(%6j8Vg(TKeb$sW?8JXixtB#48t%C!!QiPFbu;m48t%C!!QiP jFbu;m48t%C!wBOa*gY_o?K?^g00000NkvXXu0mjfkI9NH delta 1148 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 Ef{SDX(f|Me delta 977 zcmV;?11|iX4B!VLiBL{Q4GJ0x0000DNk~Le0002M0000c2nGNE0FuF!n2{kLe*=n1 zL_t(|ob8*vYZO5khaW$>EvydP4GK2bDWub4Q4!%vn^>g@hy(<|{tD6Z5VRAn@ec?W ztSnOqu~2NRw9rNyn-pSk7Bl01-0o#=clP!!`8{y#?yx)an>X|E&N~wjLI@#*5JCtc zgb+fA6V17<1&B_FfIGl7U<&-~e^$=1#K0BchkYIZe}LbeDQbx=ASp>tFqK|KV$ZZy zVvMnA9~c3f-O4$Z38tfhvF#KXhRFDAh)e=<0Nf}^9{``0ti_jYOe5-(HmL1R75VWF z_zdg;7dzH6j~KWM+_%rS?e%pxa@uD|eze~L9(Sb0mo3bwG`07u&L(CSe>lY0HtJT+ zTy`*89TV2W#ip|Ph)AbSM~_*5H)Is2iC!?ixm!>t zgWYCNMr|)c^$wJB1BwQ?-0`WwhAI>hL$8reffaq8%G4c=*Vf1`6zOB+#~y7q01 z8zHAukLqniahg`R%q=StGK$mLAE+jE^!CUPbeqi1uFy^tXWi`En02eL^tMYdy}moa z*-_mUUbZH{rp;TZERt6dw@7q8VAXfhE4@J(*aDn86Opd?%cea@eeV!?Im3)eeN5*s zmwhL_((6Utvp`3{e+zqmui_ow7_U!WjtBOA_uVVt1MnF~YuN^gnYN*0*`jxa0u5vfmCmymfmF1J{Q^sc|&QhYl= z0=xxo0dFu{@Mr4j3Yyn4%8=f6%UFiqN_T6bE9+g-7;6MPvFVpe zgj9)alGi@)lziChrTy-q^h$4q-XQcyW3yw@b1LrqNA{deLb@?Awf9NQyd2rXYGd*n zAH@@&(ks0}CkP>g5JCtcgb+dqA%qY@oNoRB4p|H2oV2#;00000NkvXXu0mjfa@oyq diff --git a/test/golden/tilde150386117.png b/test/golden/tilde150386117.png index acf9684a4ad3887dedc6aa847aac7ae30b967e1e..a372afabf98bba150c1d65cabe3a10489450acfa 100644 GIT binary patch delta 888 zcmZ3_(!s9S8Q|y6%O%Cdz`(%k>ERN@z`!U4WXp4~0Z9u^ro9stYbj{@g-N=@hay46^&9E#GAt)Z~nkay3@71!HNgx%bHbiZ4KK+Y|u$kS6j z51*L|-K9?0$PO=j*;_Nx%9InDUfAECJd(sVa4M$UMo@!NtN(=110a zU2p4*uGBSOF(c>BtDe+lF^4z&`RBBHLv8xxqv&z3W*S~@LfPCf2 z)l1@@>(>9DvDE$Ti~MuliKlmJ#bpPjEb?44$$Od{yB$+?%whFhe!IsFPb+gKxyS1G z?Bm>1kjlsWye7m?NS3fkt0AE({P|1>Fl<{rMNJK^6 z>=w*A4BK-SYg_{ppc7J58kWiU@&5`?>UqhvLdT%vD4KUce-b`is zuKVBmLFe5G%inCbe2}?fu~!^sx&ERN@z`&>oWXp4~0m&6o)kPB(t7GoEW~KOq0W z`U2BDrg*7!+U$Mx4YCiIesJnA@Z2?rCfBzh8(s%OmfWH2NXXD-e8{ASik>(UgCr^$BrFa zcE?9WnTJE{`xAc-=EUQLaoq+Q*S2lkxN&7hThyA(0v~vOFw}HkK6>@7%DHO3HO%{S zfIw?j=T!OMTRFq`CDonV@2>|E%R4*!$I_j>y}f58&K~jO{9bPc1dmN>OOLm79bES4 zuhqkU`2oj)Hl}$PhZN224&d9vZYSt=^!lSe@=N8nCMG8*2Vd+7d9E}?a9xT1<1bQmdKI;Vst02n;_xBvhE diff --git a/test/golden/undergroup274196240.png b/test/golden/undergroup274196240.png index 2c133981be1f7a6752decfeb40bd3a38326886a9..2183bfe4333a0eb97de3a60e1df1a942c368ad3f 100644 GIT binary patch delta 1408 zcmV-`1%LX`28;_KiBL{Q4GJ0x0000DNk~Le0003Y0000Y2nGNE01*Cf0g)jee+4#4 zL_t(|ob8-lh?G?vho2(B7!4sNO`}GFK4>#&t)-8PU??j}M6E3Qz=hnDE{g2NtiZl5 z3N|e&C8&+Qh`^|{vJ4?mqYc68(h`DJ^INmawwvF`pTq1p^X|MeyW{VHmznd<`JeNg zGiT2Gdfu~wF~%5Uj4{R-V~jDze;8woF~%5Uj4`IuIb#&DJ-~9kKLYdvvw#J_xk_)T z5nlox*ZYfs=YSKylZyWWSeL{s25!;kTY&*!K5)IxJqqjz`3t}@;7Wb|5wICp1x%6m zO4Vzx&hpAKKJAsSS5qkiD?)kz_!3yH4p;*W)`%}DPeJKEYS^5mHG*J)`T*8LQF|z4JzJVo#mBfeA+8tuclIvWMqvbilNbIo-}_kq!%lu92ztj z@^mGgL})Z&u=gcpmP5Krc`D@$DBWYPj`GSfKJAsiS5qlUA~F~RDv||8rktc#heo5B zG!E{rBwb26wot_>tz&NZe}PomQ94D8y~dwcmhow?{JnA|705!`=u?q)Y(1nu5PO{- zURlPcz4G@u$(dP#5@zXjXU6yv(5;27dYP@)T@A$C4r~PW+v~LQ$}&FfmA}_XvP?n+ z&3KiWwVFUFSvyGS3Abz28eK>h&Wd53fe|{kT;&$A9Nt&^fh@LHf5&-c8K3sb-)ls& zOhWeq-|10YMSw)0H+lRQ=>c}=5iX(8`$C>FFgc`OQJr0(V|Rzo3&4ZGze*Q@PZd)L zKaimiQv$BFSI2o}8K3sb*Q+L3CZQRc^}f+nZf~dcTkPnt#qZ~Zva0g_4EOED&|@J zXr2x;c7K%(UiKRQURlPcz4G@m#+dQTS5+1y8)c$q;Q7GEf57EUa!XkPd@kojIn|Mc zUSNZ~?rFEoD43|*@H>DHflJyg)MA#Z-JA4J9aEd-z`M;TXs7l7+&79cHmZ!ueu6)N z3!5PqSgNwO2j{z+Tt^m`$>oRObyvHkGV;Cr=je40FumPUE#fh?c~kfv=e1jE4D*Eg zXhSm!o29~rf0I@9dRZ5??*pt4=}D)Et(Q5$@v_8ub{+9~acl6nH1X^8gQ&D`+4%?#h;3E--B%Z))6g#KyT&Bj9DFmN1r9=HZLr$+vg7RNSA=BGqv zyUzaxJfw-EQHsEIz^f|jfa*-0kLfSFXD5$~^P;G~eaT>!^0Kw#q9DGj+A! zqPA?))07H3bbc4`fF{~b;XL35EwT=4>%q<8^MzWFKcWTT?j~MT$0JjL8$*8$)w_eb zk*8xbfR{AbD*U5IdPBMzPET&n59kR>f0goOg*AcJ2Zv#&Oe>dp- zUjyy0f5ik~+6Z1NtL#>7l~)!fhd!>bPv7I(D)}GQWI8RJ+po49YJqPvnGo7OF`R!( z{|!buE@uEQ>xp26<7)ffHh+(;pjLma)WtRzE&yK8`oPg}n_4;k06x*+tcRt#!v0mI ztdWi*z_-9N$>6WY`B($>GUR@$MLs6w@E3<(a6DpB$RTYrWA)YxoHbIkaD27xDe&!U>(Sbl{>L+ z4tr75YB!XVxJtr-+}7du9rNtA^ECULF=n5Azv}7tJTt$~^ZcIQQ@?)CGtYn|Ns=T< zk|arzBuSDaEp01$$c_RBfOWtme=rUl0rtjcXMs;8`8seu);9y!fS%{8ZZk?03*@33E*l;z7C8<7T`26MH=L4u{|60%$PA#?Mz>7BMneRtpTdl zpxG!p83WcAwnrn=pgrJC&8uU^jG1a?I$GULr3H)^)>|XtWRwqq7r?ucfBX~ROJRFU zly68=!A((qF=NI|Dx>mUrf_mAS!!-BG^D%-4Zkv}a&u%$Qle znK^O>sP(k(Cjkxt&zL)9YfyfVxrg*D3t)Sc(}nMAq?wr+GiIuv=_qG_x&b_oMzluA z5Azyu4EWU{zXy0p`pFU6e>1Spg*pvjjTtj$DxWEpGeB(xZjl~>pCrwm*2Z@=;0*A9 z^dM{@8-UkQrw;5aWFZZF4dAgEGiEBEDV6i0W`pz+*4JprhuCfnQn!IuCHWd~J?ei4 zE&)y8XzcSXaEG}AoEbA_s+p0brD;_cb?yN_DF53^H;$8Ddp|{*e_{RZaex2&I5~#7 zZ8@rTJ~`}zJgt6v-|LQMNbfl{d)UXl*vG*rr)l33_S2w_lVh0MmZNItlfyp9Q|z~% z?I7Jxev9?Rx*UyZy$f-Le{(Shb(|c-+_oH5JD(i(L7w^j))!6MgVbfZ`=j4s;88SY zhPfB*etiCsG}Y_ne}WF`I8|#~j;ftc4*MWaS-*9(m|yYgqzkYww!g=L7P3FeACWn? zK%FLV6WAErGqKOb7}Rlc40GFZRPB6n*avyK>9@YAlcuwiq>i7Rw|pYK=Wv4VM#(0r z(XD4)-7bSVPR=sSZS#EWgJJGBNs=Tz diff --git a/test/golden/underleftarrow1031964323.png b/test/golden/underleftarrow1031964323.png index f5fe248c925f3b2e6bade77eb50ef8987e822bad..6867a215a813c918653db4271157dfd15eb4db73 100644 GIT binary patch delta 1366 zcmV-c1*!U$2jU7LiBL{Q4GJ0x0000DNk~Le0003Y0000c2nGNE0E=%e7m*LIAjM9T%Atbrgasq7_;2p`(Eq9_caKL{>K ze+1iz!U$yhLl5;3{UH>?A~K8ZuVz^Z36WVC5m`xvy?jRwhuPVgyXVf`nfZQRcFvvi zJLhxmoO|Z(IcF{yV~jDz7-Nhvf5sSNj4{R-V~jDz7-PDfW2O;11l+3EzX2P7`M?U` zRHff;5MKfA((7}8QQ#18kK$hkHbyZkfy?y%JHR+_EwDt#ZU?>(@|S=S-~zq>60ik$ z0GKWB`&6&Jy2~p||Fl=WUP-9}tAq47@CL9}CtwViXb@jfo|4kT%0I4Sf5X5L<*Tt; z^`bmSROfQ#tJP1CXDldVD2S=3tO>>2tGm3i^iO-`>y?y}Btym|Q4Sg%=ZW)|gY-(p zRD%Xh1bGIdlSI&Hg3dl1m01nagUVAYXI$wadv%ppmi}q4{JoM=mPE)zAW)MmF*(&J zy*6kx8cD;>Js71c(TOe9e{qWISRPy;wRTjdh_P4ad1dLJ_R8NYS7L!I#EqVc_{26t ze1X`jH@vd+PkZI>b(CYX1Vzl(-%m5fSAa#D*lL!G^!JMvVwM4K0>9X+r@XTCPkZI> zb(AcFP)Q?RZDg${P>JRaVupg-wR(*%MH6S`V4i_VPHeT#En+oze_ihaS!u7X^UBgc z?UldRq+}U{ZUDAwDXu0!B(N%4{tFobc4!HgpwS0{JXN4SNUv9&gTaa28@yivZUp{R zx(vLcm{M?o>%_W$kU*V6U$8%F;jWm9JMr zvTRnY08au3f$hKxs&uK2Z2?|v5MKh;MVqFs2Ci59PT=XN0acy6gKFGfrE3j;3ivRp zXBfCjF>7?uJQ$4F8|rNEvRCJOW$B;x%HJy~Yk->*miLu*e^=(os7CCW#zVkOMN1^& z8{nj(B?@A_24B-Ab_FBebXfwtoT#iud2~u4V#+Q1NY}#M;69_dyAGxK)*i6bBh)!h>gJAMN9Mw>wvcsl{E+Wpbh^b zJ>25vxpwg=fACt-5(zj1_(&@(y~yKjx|8o}nwgkBQ*xPFfnO7pSC7wtJGI=nC#O2He^B$b=sJwd2Qyo|4SVtD->0Dl3v`7N3(>|2biWVt= ziuzZQ3(Pb}S*uJ7o5D{xM){ z!aKN>Y}3Hr=?nnh6)jO9JAku`mgrQD%MjD2A1|i(7XK@lANn~#d6RLx2F_Lgp0cWSNhhkmEDU0eBkjeb4P`Te3rj4{R-EMtr@#u#IaF~%5Uj4{R-V~jDz7-LMt Y|62qCEu7|fbpQYW07*qoM6N<$f*~@D00000 literal 918 zcmeAS@N?(olHy`uVBq!ia0y~yVAKGz)i~IIWO)_aT_D9+9OUlAuoP_978JRyuGtGTf|Z3*vIwycNJwkHheka_DgVFSlOKPI6Z z7lDuq$Fwvul#fJcgiU%NFJMw8woyPtsq^9?H5YGAC#j=)V#d$kwcaWEdH2oRlutDZ zZ*ueI&z*jt|K{GajUDLV#J6p$+uvvu$lc&S!x((P^}(F~cS|2sJMLq=^JzUl^Y_O4 z2W02h^V)>FNv4*$sI9o|aC!ea#@7dQ4Bl9qbKlWEVcy_5pLGYc}u5lOuuJZFXMa@40PY5^CFu> zRy;l+e8=~L_KvH;clU=guVcKtLppJ`B}2`p<0cK4ck1jobe$y)Wcw52RvrEz>PC>+m(H-5^WEX8*eB{$ld-y~ zOeg8xY}c&E8!yO&q_pO2y|P+y+lD*0+1^GRxntga~djGAB z9Xs>IR`wouDh_BgOqf`(dbxOuZdvH|WWnP5IziI?t^j3cXV=Hw zp7Y_k=4bw!>yfOwu}8aV^K7QC5<3|GEco#{c-K`1KBoCE_ue>qq0jY9?PiZ$8?jl; zvlXTva^7)z_e25p!?j#H9Cn;Oy6QHP0~T7X^O(z3vd{3Ae51ZMvfBhM%+rr~^Vd~`wapGX|GUkd vcT@*v@0i`SkSp#gQdkHGVuFb~{xaX3q7}D@mtPZ@w-`KK{an^LB{Ts519GOK diff --git a/test/golden/underleftrightarrow128845106.png b/test/golden/underleftrightarrow128845106.png index 9a0cf69a087bf8f038c911a9f918597e98df3ad1..d33656c9763c21f68d9a00da8c555ca45c4f9027 100644 GIT binary patch delta 1700 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 wxYE;&kx$Izxvw5@nEY^ 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 Awg3PC diff --git a/test/golden/utilde829741846.png b/test/golden/utilde829741846.png index 9e99670d65a074038a5188d408dd4946d88469e1..9a4d222eb46d62643d2b4530e9f6630f67334f1e 100644 GIT binary patch delta 1824 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 delta 590 zcmeyy^?*gOGr-TCmrII^fq{Y7)59f*fq_vG$X4KB1Cp_3=eQ;+%GWb-dAc};RLpsM zYk!uABSXVS{e$mU%ygH`I^hR;a2p=bk>}{HPPLt%{}I~ls$Uvdo2BJ?gQ=(Jaf!%99Jun z^VgjIaL?3BM_&h@QtEA15iL0N!(rxC#)q-%bP<-@E!C+%W%0w?b;iu%%<6)tcJqR6 z+2t=S`TA?hCXL4qlRjk>CGTRlVY=41`hfHU+Ydb--j%S~u-4tWapT4nlj4_*>m}-V z_Hq7Ux_2~n_W{lg>B-5-!Iyou%=x7BfUm%3ha$(}n{Sh2w(;jM-p|d+$;q0v^KGBa zedRMX%};BO<%&5SG-nen&%nLqKj5xnGZa=_&DE4FTjz70g_}$$AlvtU$%xh*#Rm;qGi8XcNKUmhp z+*ql8U}0}>udlCh=qr0|JBB=F`v&m?rVlJXSgx~A`SILJT3UMcMK=}XIJ(62oA+Gf W4eK}7Qj>v6gu&C*&t;ucLK6T{-5*5& diff --git a/test/golden/widecheck478155530.png b/test/golden/widecheck478155530.png index 54163b1a6d2fe67fcff34ec4ad4b7bb2e166c687..7eada42984f746604f34042152dfa9facb00ea85 100644 GIT binary patch delta 1632 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 GgeCy_gWHh+ diff --git a/test/golden/widehat812256357.png b/test/golden/widehat812256357.png index 8c5a8e5727cbf2a5b0bcf8c92e2723030aab9472..6b260d0eb0996878826dc518a021512024ca5132 100644 GIT binary patch delta 1604 zcmV-K2D|x`2+j;4iBL{Q4GJ0x0000DNk~Le0003R0000X2nGNE00wzvV38poe+BqS zL_t(|ob8)WY*a-Y$3L2Altn>crO-m3MUg*M5eYS3L>oPjSf!X4Q{%x)LA{v3#b``0 z@uEqCF&d9G8ZQPlKm>wB(HJEaiC{qmi?uBfEff{>pyK5_);$|o1+)V<0UrRH zfbGDa<5=%xpaocNw*LTofG@P&1DqL04Oy86ECLpqv;epk_#QYIr2~}~Tp~@tbxKLJ ze+|$N^Z`e;wfjF;TKqUL31|f7jFSEWegX!xjnj9PZbTYmHJbZ?TYxRVf4&l~n+H57 zb6F0Y1$G190(SySbZ#5)9`HW!>lif#mZ`2_EDLo0lm_NL;4+zAGcZM;_eSQkw@e+Q z(HNOYFq9c4PZ(%F0K;ZrHbwc4$aH#vLrT5C>2cIwh`Gi%5@`*(=R|pjlm@ju1vKb} zRIlw6lmBc10}5&6BDXaQfAfuDG^ChFXy0k|!=MahKz-5=T(16@rT(oqX|k?A8JSPN z$_mFvE_TC9F`Ajc6TliE4}1eG2EGDb1l}%i-4YqgDh=e_z=yyt;L|AYG~h1aZlD#o zQKqvAco+Dkh{mQUTDeuxO0P`i0I*-%p#o*p8`Ejl{z84WH!`2Te-iqS6f;??)6m18M!DQje6!WQ% z_7hX@Xhw9ljCQAy6p2K_&0xqF$Y5kB!3_QwqlT+Ze>6lU6pm*q?}-8tkxdtjEJm{k zSSO>{1-t`n27Z^Le?Furr5<<%cv%Cy9k^e2reG|el-P-Nz&$da6>9t@rQd+tBU3q< zVkn2p=pV}sDF!qZ_|h29=fK~JMq)$BOMjY~^p)}B%0j+?2{q|1dN?wlgPNL68)a%U zOW*Bi1~M?t)8InPh|DL=kdXPLnNd9bNQ*vfs?+xu8%Ua&e^djF1xzUHU#EP7MU3cJ z)(W#2O}C~n+lt%;=E`tRXyESzKEA*q`+S+s9h$@MS7gC1whhJ`847NElnkYoCB9oM;H(d9&-F*2b#Go@=(Uo_|jmS!Mfunj0rEs>9= zXtUKfvyCxLe^s=-8+f$Rf*offvfNDnoOG_x&Hv_N8B2LalLOXj$}nBeWOe}0$k|4K zr=x#s65uKA&jX&<=j&C*X5jUxo(|w%eg2Ums&+*&(}5=yDY!1zRjs;OfXB5z0(5CG zu2vacdYn*;y2>I4Y%~wrT7Yv3uM<7E?E%`%HHogtf9beWdAfD3Q)MLPnsq8G)EVk% zQ@$<02G`}fs#sU6>Irn4azlAN{FhqMRW==_Li8~7oDtrw;}(-=qvm2zJLt4ej{bk4F-dGf{(x}!2{MOWFhM#pXDOGRRnBG+s%4MX|u52ZOe zPNL4se<_daa$VJ`E1yzEj~SdnM=m<96R-;LblNI_>JEG$j6I!J; zEEhej%A5H$1v;-aC7g3zuB%#f<)Sju24@mIe`~5GT?NTvGGwY7uuvFI=7TG2Hs zS&Sy9O4jIjwU*t77r63T%g|-6nW;Q)NaRve782j87bgRY_4>jAHF~So1BC0=s=PDi zf1K-bUDc$kUgd6AG<7`E)uxw(?OXP>qH9#LF4*hT8{5OcbNZs6H4fL6vY6acJDDdZ);Bxvpx}mFRuHVc;|1O%2EuI=2IOE2^WGbUBXW zIF92uj^j9v<2a7vIF92uj^j9v<2a7v8aR$qN&W@yP`m3Mfn~7(0000<3 delta 1029 zcmX@dGlfI3Gr-TCmrII^fq{Y7)59f*fq_vG$X4WF1CrCSWYOOM~OE1T;(SYO;7Lg2NVljFyda>E9mWbdF9j_T}nULoBkgNF%#>I=sdc#e}Z$g zVt8k3h31;AGk)IDFWy{UUGDjg=RNc3H|O3}TmODr^ZpGFyAy|EivT*&@%db<izC~JNMvTZi1x7qdI8|2CI#4jupjaFrSUs_UKyQbH0YdJ7gJbpRImdn#tU~ zF=xl6dDrJ{^slhf?*Cywzg$MgOpIGz{yu+Aj!s;$?0iq(7g`0pKbUG{ov$$p{7`=;V=Nq2QNd=vG|JpcM*XR_y0;d7HNT`r&H7c}qa0W-}|Hs<5Mv-H%y z^{u?Hyzo`Xi}bXR$1?)BD;RQ){gqQp# zqj%-RD?b@^Obd4ZU&)hD>a&7jo`BCnZ-Y5=Z_Ef=b6;goj`3o}`czx<&Prlc{NiLb7M1+kM;LJY9N><)8yM8}D(qxg}ACc}#vy^G_{p z+xX(vqu%!#@66}gnZN3jTKRg`i_C=DPnaqrc^*&sq6< zSLmna<44>=kGH&8eY9sem$6Fp{g*r5)~jgVVLQHDW^>ibZ z6C=MzuT$eBzlE}X=r&TbU9~@==5D3xchje@XHEII!?>G`t5DAK`m-Y$ZpU)wm@Z^} zV3_Fm%jkpH4-Ol3i+K48wm;L{q%xPB%vhGhSmFCJ%e>M4Kzqb?wl~bLFL@~Unn?Pp ziodRpafx_d>2LYoynJ)%jNb>iJ~#vQOjKJubJo@;6>}fdgzZ1_;Eq2??AetH(fnO1 zy(X7Dj2qLkzHxrG2a3AQ@-+FsVz*jKx9_(7haUWoedh@@`%*}T*2-ij?*rBkgcC#m zRIT|x&*W7bP^Yr5oADGYwJi<>yWBti(EAWAx#Nk{SCJc&AWm%y`hLEPzcKoN{{z(m w)(Xa&?&sSj{@mUN(%FlVk)WCDNX}30iF23CtI}?91LkZ7Pgg&ebxsLQ0PG~-9smFU diff --git a/test/golden/widetilde326421305.png b/test/golden/widetilde326421305.png index 4daadd81f4a8570340f406a00ae64494aafcd466..6b39d40008b5dabba1e86aadf91a03299273be55 100644 GIT binary patch delta 1848 zcmV-82gmsB2*3^@iBL{Q4GJ0x0000DNk~Le0003R0000X2nGNE00wzvV38poe+KGF zL_t(|ob8-xY*j@Vh95uyy;KUNtfjpIvbB`m0*V^z5>W{O6&00;QN-vEf*3WT5e+d0 zLomiACMG2s_XJsDL`l>}lvqNGh%{0PMY>qpBBX)_!9VXIoCG!j z#lW!y^SczNY~_AbW%L5lfj$apx_yW~4n2V$PDocs13D}2 zA>b#VT)LavNpDMJ0)u3m6A7dX?46;|8~8`}`T+fa3%xWafrG#vU@uS)f7G^PT@ocr zTK57+{zv-0N}mCYP@m5Oy6Juw*=Zoq-APvmGy#o3gW9}KeS8N{3LI~zI(7(Q9nDq1 zeBe&tVi{r?@TL=ICa?l{64;=@a<9T@U>mUA8Q9st{W^XgcqxuCF9U7?mZ%XXI`;~I z>wznPslZ=A1+Y)yZzpa9f4Eg00X5>=z@ibL`Y>>_oUuzp^~_b9<^yAZ{+cWf zDb#DgG^k#uVwBwp7%rQP^6r&t0t!NVI-l;+KUlg4tN%<<{f??Xe=LcSwznpTA+pmj zV5s_Lw))S0ISn)^ROwn3P~+L6vnG~a&ZO8+&VB%Jxf8co?Y>!KsUsMpx{lW*k`G)5 zd@UjL{18@`YqB>Nu3hNI%0ek?wqQP7Yd<3j(A@8Uh%v=q;)xbBJ z!AGbQ=Bp!21J(lXe@Mq%V2+$iCGa!wJ+M)_;xR$abG}vLmL@=yT}_Tno&Qv+b|z$7HW!$Ent+tPI8Ls~OZk zo}hu#2y6vP6n3ia-Q;*CtAmZyie$g)U8Cbt*}g8pI=Q5&f1GJ@tW%xUCu)bSny6~j zSLziGC~k&U6TLK0gH=@@XO%Hb?S}^bE`@Snx14yj?%ypvISNsgQ>C~SveU1!LuG;! zRai!9LYoB?IxC?PpiJ$xO`5{=`&eYDk9XDi0M&Ph>=iiD8r3O9L-7v ze^yBco|T}De;TCCTJhWltVy7v(}Bl;+r8`6z%Rh3z{i>`0~YE2X9<+k5_f1tG+EBg z=eX*BP{#cZ_(4YZc|e_dof`j4Fb=p;D}iBhw(+Rf;HZ-BG7a9A9zibvp3=;Q5rYam4B9K&)%?N#kKrwUDCWx$_t(toM+`;@j+e`yna%x`Zd$qsp1DUSy((!C~) zmqR*ka-3gR*)U6wtexaMqF(;xa=5$IHv&gm-WJhkYmX)@nOfF1YnF`H8O{Vb&aBs{ z88fcOP6DQQ&;2JfuxdI`)0rS&D;1yLH848b5p)Dmt$apnHR3*sby1uKIm`wp-BH=C zRufR0f1HV77)FPZ$ciSS$CWX9G@(o;8Aan!*rRhWYbjuJfh>nz$&f8<|vOWe4=zO8#6zSSR<>5XfKCZlie=>tIf?q>6Xmi?hnXY8jRj6_Tiky6d z{7U#QsiLdR%ySAv8&Rhm;YB(xaN?}io{O8uDdiK0E^*@Id4|BL7*5AoXu3>SlIn`+ zn#*d%$#fh-k(Xzx=xQ^C-uXy=mFL;N;beXPX)s-0| ze~%Jpa0WUe-g&C%YIpob4TE2?c=*OMU8d_?)8!A&^G(-jI){i8ix~;L7>6o0QJYC& z3Eqa?VY*D$IjSpPf485fx=s_;(L^0j)>5O+^Ue#LrB$qoMZC?bOy~KU7K~RIV>xHK zOjok#igsHe^=}yPNTXnf{72{?rZ9W-fQM7 zRYsm;yb9-j1h~(6iO+PIu4L17kK)hP`3(Ja2j>FsC+Aer)hb~eO+ZZI>K5fO)l`NzTH?L@0sqTTcrG&oolAcbS0CnLCW_Ff32o! zoxISsBhrv+x>_ad3wsOokz@n#oEmzW9_G4XQwe z&V$Om9^-o((`CAnNmmqjP4Tw??`l9^qidV=UjkfGNta<5hG7_nVHk#C7=~dOhG7_n mVHk#C7=~dOhG7^T$-nw~xHhZ54q27}0000wqQ7NZ1{rGc5vv_y;im0aP?8 zFrq>fc26W*N|{J@K@bIS6j4ej<~{a#JbSnI!?u9$M_SG9dcHev-pqTmH$EGL5JCtc zgb+dqA%qY@2qAPlvZRY^5fxoQW4^9KeLVL4z{lB&O9{9(~ zN#boZVH!AY=f7n4r|tYbm5qM`ADFz&{TQY{ky+pxS8Ko8iqV-wi1@~fw55}F6@0*fSvZ3C;o!$O@)RF3Wfe@j*#Cppa> z+OqrSfOX&|gPqy}t^muxsn8CjLF`!R$Bx*3f>-wdMUJCDJB3ARxZ zx(nPR4Zf ze4nTupiNk`W67>Pus7K|s6GMW1ocU}VLA_(C8~tu_PJegMH@DGf5djXR1-1=YOi2B z><;kx?C`+(7@p&c#x}{?u5<^A#NafpkFFIG;p%g4E20LJ7U13OO|P#!05!+ntZ z%-i?HE-rda=ixB8&D~IX|Khl9F`2ie(wkhq;P|}pafvS+eQA<}R!PYr?@Wu7a2Bo6 zM^p}9p?~5ju}n%ve{+SOZP~MPJ65Px%5f)s>`!MvT~Bx(tfh&zOd2qs6q9&UDbXg` zoKMC<_@s$})-QQ@8+l+J6nWtJo8_>0zoF`bC+wEN_5aN4cm^Yy*;0AC8H~~BXUI4dA*|i7U0{)Xm8fl~{XvSiS^qVmMm~;{N z1U$EU3&1PjvNY02BTYe5%MVQ|kv1itQSFC#cJs~5YruKntu)d|BTYdwHVfJHWm4wz z`!np`OqNC(e`%!ISMFP*Gtx*SjWi=@#^x32^Pe=*NF&WCnlCin6Y|X_KR?gj?-u+f zjWp6oQ=_S+NfMd?{s3N*cE!)y{WqCW7o?F!8fglezBEZfQ>0AyyIo%e{sevuM%@G+ zNF$9j(iAj(Y5HZw>%gzTJJKJt{tVn9{TmFd!Tiq|HKdV78fkb0k diff --git a/test/helper.dart b/test/helper.dart index 9728a75a..4b061052 100644 --- a/test/helper.dart +++ b/test/helper.dart @@ -1,7 +1,10 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_math_fork/ast.dart'; import 'package:flutter_math_fork/flutter_math.dart'; import 'package:flutter_math_fork/src/parser/tex/parser.dart'; @@ -14,20 +17,21 @@ void testTexToMatchGoldenFile( double scale = 1, }) { testWidgets(description, (WidgetTester tester) async { - tester.binding.window.physicalSizeTestValue = - Size(500 * scale, 300 * scale); - tester.binding.window.devicePixelRatioTestValue = 1.0; + addTearDown(tester.view.resetPhysicalSize); + addTearDown(tester.view.resetDevicePixelRatio); + tester.view.physicalSize = Size(500 * scale, 300 * scale); + tester.view.devicePixelRatio = 1.0; final key = GlobalKey(); await tester.pumpWidget( MaterialApp( home: Scaffold( body: Center( child: RepaintBoundary( + key: key, child: Padding( padding: const EdgeInsets.all(8.0), child: Math.tex( expression, - key: key, options: MathOptions( style: MathStyle.display, fontSize: scale * MathOptions.defaultFontSize, @@ -93,11 +97,11 @@ void testTexToRenderLike( home: Scaffold( body: Center( child: RepaintBoundary( + key: key, child: Padding( padding: const EdgeInsets.all(8.0), child: Math.tex( expression1, - key: key, options: MathOptions( fontSize: MathOptions.defaultFontSize, style: MathStyle.display, @@ -110,13 +114,7 @@ void testTexToRenderLike( ), ); await tester.pumpAndSettle(); - if (Platform.isWindows) { - // Android-specific code - await expectLater( - find.byKey(key), - matchesGoldenFile( - 'golden/temp/${(description + expression1 + expression2).hashCode}.png')); - } + final firstImage = await _captureWidgetImage(tester, key); final key2 = GlobalKey(); await tester.pumpWidget( @@ -124,11 +122,11 @@ void testTexToRenderLike( home: Scaffold( body: Center( child: RepaintBoundary( + key: key2, child: Padding( padding: const EdgeInsets.all(8.0), child: Math.tex( expression2, - key: key2, options: MathOptions( fontSize: MathOptions.defaultFontSize, style: MathStyle.display, @@ -141,14 +139,61 @@ void testTexToRenderLike( ), ); await tester.pumpAndSettle(); - if (Platform.isWindows) { - // Android-specific code - await expectLater( - find.byKey(key2), - matchesGoldenFile( - 'golden/temp/${(description + expression1 + expression2).hashCode}.png')); + final secondImage = await _captureWidgetImage(tester, key2); + + expect( + secondImage.width, + firstImage.width, + reason: 'Rendered width mismatch for "$description"', + ); + expect( + secondImage.height, + firstImage.height, + reason: 'Rendered height mismatch for "$description"', + ); + expect( + listEquals(secondImage.bytes, firstImage.bytes), + isTrue, + reason: 'Rendered pixels mismatch for "$description"', + ); + }); +} + +Future<_CapturedImage> _captureWidgetImage(WidgetTester tester, Key key) async { + final boundary = tester.renderObject(find.byKey(key)); + final capturedImage = await tester.runAsync(() async { + final image = await boundary.toImage(pixelRatio: 1.0); + try { + final byteData = + await image.toByteData(format: ui.ImageByteFormat.rawRgba); + if (byteData == null) { + throw StateError('Failed to capture image bytes for widget.'); + } + return _CapturedImage( + width: image.width, + height: image.height, + bytes: byteData.buffer.asUint8List(), + ); + } finally { + image.dispose(); } }); + if (capturedImage == null) { + throw StateError('Failed to capture image for widget.'); + } + return capturedImage; +} + +class _CapturedImage { + const _CapturedImage({ + required this.width, + required this.height, + required this.bytes, + }); + + final int width; + final int height; + final Uint8List bytes; } const strictSettings = TexParserSettings(strict: Strict.error); diff --git a/test/katex_spec_test.dart b/test/katex_spec_test.dart index f35ac6fa..381f3ade 100644 --- a/test/katex_spec_test.dart +++ b/test/katex_spec_test.dart @@ -371,7 +371,6 @@ void main() { expect(r'\begingroup xy }', toNotParse()); }); - //TODO // test("should produce a semi-simple group", () { // final parse = getParsed(r'\begingroup xy \endgroup'); @@ -384,7 +383,6 @@ void main() { // // expect(ord.semisimple).toBeTruthy(); // }); - //TODO // test("should not affect spacing in math mode", () { // expect(r'\begingroup x+ \endgroup y'.toBuildLike(r'x+y'); // }); @@ -1377,7 +1375,6 @@ void main() { expect(m3.body.length, 2); }); - // TODO // test("should grab \\arraystretch", () { // final parse = getParsed(r'\def\arraystretch{1.5}\begin{matrix}a&b\\c&d\end{matrix}'); // expect(parse).toMatchSnapshot(); @@ -1560,7 +1557,7 @@ void main() { expect("\\iint\nolimits_i^n", toBuild); expect("\\iiint\nolimits_i^n", toBuild); expect("\\oint_i^n", toBuild); - // expect("\\oiint_i^n",toBuild); // TODO + // expect("\\oiint_i^n",toBuild); // expect("\\oiiint_i^n",toBuild); expect("\\oint\nolimits_i^n", toBuild); // expect("\\oiint\nolimits_i^n",toBuild); @@ -1606,11 +1603,11 @@ void main() { expect(r'\mathrm x', toParse()); expect(r'\mathbb x', toParse()); expect(r'\mathit x', toParse()); - // expect(r'\mathnormal x', toParse()); // TODO + // expect(r'\mathnormal x', toParse()); expect(r'\mathrm {x + 1}', toParse()); expect(r'\mathbb {x + 1}', toParse()); expect(r'\mathit {x + 1}', toParse()); - // expect(r'\mathnormal {x + 1}', toParse()); // TODO + // expect(r'\mathnormal {x + 1}', toParse()); }); test("should parse \\mathcal and \\mathfrak", () { @@ -1645,7 +1642,6 @@ void main() { texMathFontOptions["\\mathfrak"]); }); - // TODO // test("should parse nested font commands", () { // final nestedParse = getParsed(r'\mathbb{R \neq \mathrm{R}}').children[0]; // expect(nestedParse.font, "mathbb"); @@ -1759,7 +1755,6 @@ void main() { toParse()); }); - //TODO // test("should parse comments in the macro definition", () { // expect("\\def\\foo{1 %}\n2}\n\\foo").toParseLike(r'12'); // }); @@ -1776,15 +1771,12 @@ void main() { testTexToRenderLike("should not produce or consume space", "\\text{hello% comment 1\nworld}", r'\text{helloworld}'); - // TODO // testTexToRenderLike("should not produce or consume space", // "\\text{hello% comment\n\nworld}", r'\text{hello world}'); testTexToRenderLike( "should not include comments in the output", "5 % comment\n", r'5'); }); - -// TODO // group("A bin builder", () { // test("should create mbins normally", () { // final built = getParsed(r'x + y'); @@ -1815,7 +1807,6 @@ void main() { // }); // }); -// TODO // group("A \\phantom builder and \\smash builder", () { // test("should both build a mord", () { // expect(getBuilt(r'\hphantom{a}').children[0].classes).toContain("mord"); @@ -1889,7 +1880,6 @@ void main() { expect(r'\vec{x}_2', toBuild); expect(r'\vec{x}_2^2', toBuild); }); - // TODO // test("should produce mords", () { // expect(getBuilt(r'\vec x').children[0].classes).toContain("mord"); // expect(getBuilt(r'\vec +').children[0].classes).toContain("mord"); @@ -2293,7 +2283,6 @@ void main() { // }); // }); -// TODO // group("A document fragment", () { // test("should have paddings applied inside an extensible arrow", () { // final markup = katex.renderToString("\\tiny\\xrightarrow\\textcolor{red}{x}"); @@ -2311,7 +2300,6 @@ void main() { // }); // }); -// TODO // group("A parser error", () { // test("should report the position of an error", () { // try { @@ -2474,7 +2462,6 @@ void main() { // }); }); -// TODO // group("A parser that does not throw on unsupported commands", () { // // The parser breaks on unsupported commands unless it is explicitly // // told not to @@ -2546,7 +2533,6 @@ void main() { }); group("A macro expander", () { - // TODO // test("should produce individual tokens", () { // expect(r'e^\foo'.toParseLike("e^1 23", // new Settings({macros: {"\\foo": "123"}})); @@ -2658,7 +2644,7 @@ void main() { // }})); // }); - // TODO: The following is not currently possible to get working, given that + // The following is not currently possible to get working, given that // functions and macros are dealt with separately. /* test("should allow for space function arguments", () { @@ -2768,7 +2754,7 @@ void main() { expect(r'\varsubsetneqq\varsupsetneq\varsupsetneqq', toBuild); }); - // TODO(edemaine): This doesn't work yet. Parses like `\text text`, + //(edemaine): This doesn't work yet. Parses like `\text text`, // which doesn't treat all four letters as an argument. //test("\\TextOrMath should work in a macro passed to \\text", () { // expect(r'\text\mode'.toParseLike(r`([r'\text{text}', new Settings({macros: @@ -2790,7 +2776,7 @@ void main() { // expect(r'\gdef\foo\bar', toParse()); // expect(r'\gdef{\foo\bar}{}'.not, toParse()); // expect(r'\gdef{}{}'.not, toParse()); - // // TODO: These shouldn't work, but `1` and `{1}` are currently treated + // // These shouldn't work, but `1` and `{1}` are currently treated // // the same, as are `\foo(r' and '){\foo}`. // //expect(r'\gdef\foo1'.not, toParse()); // //expect(r'\gdef{\foo}{}'.not, toParse()); @@ -2814,7 +2800,7 @@ void main() { // test("\\global needs to followed by \\def", () => { // expect(r'\global\def\foo{}\foo'.toParseLike(r''); - // // TODO: This doesn't work yet; \global needs to expand argument. + // // This doesn't work yet; \global needs to expand argument. // //expect(r'\def\DEF{\def}\global\DEF\foo{}\foo'.toParseLike(r''); // expect(r'\global\foo'.not, toParse()); // expect(r'\global\bar x'.not, toParse()); @@ -2953,7 +2939,7 @@ void main() { r'\operatorname*{arg\,max}'); }); -// TODO +// // group("\\tag support", () { // final displayMode = new Settings({displayMode: true}); @@ -3018,10 +3004,10 @@ void main() { // }); // }); -// TODO +// // group("Unicode accents", () { // test("should parse Latin-1 letters in math mode", () { -// // TODO(edemaine): Unsupported Latin-1 letters in math: ÇÐÞçðþ +// // (edemaine): Unsupported Latin-1 letters in math: ÇÐÞçðþ // expect(`ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïñòóôõöùúûüýÿ` // .toParseLike( // r(r'\grave A\acute A\hat A\tilde A\ddot A\mathring A') + @@ -3041,7 +3027,7 @@ void main() { // }); // test("should parse Latin-1 letters in text mode", () { -// // TODO(edemaine): Unsupported Latin-1 letters in text: ÇÐÞçðþ +// //(edemaine): Unsupported Latin-1 letters in text: ÇÐÞçðþ // expect(`\text{ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïñòóôõöùúûüýÿ}` // .toParseLike( // r(r'\text{\')A\'A\^A\~A\"A\r A` + @@ -3084,7 +3070,7 @@ void main() { // }); group("Unicode", () { - // TODO + // // test("should parse negated relations", () { // expect(r'∉∤∦≁≆≠≨≩≮≯≰≱⊀⊁⊈⊉⊊⊋⊬⊭⊮⊯⋠⋡⋦⋧⋨⋩⋬⋭⪇⪈⪉⪊⪵⪶⪹⪺⫋⫌', toParse()); // }); @@ -3097,7 +3083,7 @@ void main() { expect(r'∏∐∑∫∬∭∮⋀⋁⋂⋃⨀⨁⨂⨄⨆', toBuildStrict); }); - // TODO + // // test("should build more relations", () { // expect( // r'⊂⊃⊆⊇⊏⊐⊑⊒⊢⊣⊩⊪⊸⋈⋍⋐⋑⋔⋛⋞⋟⌢⌣⩾⪆⪌⪕⪖⪯⪰⪷⪸⫅⫆≘≙≚≛≝≞≟≲⩽⪅≶⋚⪋', diff --git a/test/widgets/selectable_test.dart b/test/widgets/selectable_test.dart index 9fd70b15..28d90a9d 100644 --- a/test/widgets/selectable_test.dart +++ b/test/widgets/selectable_test.dart @@ -96,7 +96,7 @@ void main() { final selectableMath = tester.state( find.byType(InternalSelectableMath)); // selectable text cannot open keyboard. - // TODO + // // await tester.showKeyboard(find.byType(InternalSelectableMath)); // expect(tester.testTextInput.hasAnyClients, false); // await skipPastScrollingAnimation(tester);