Giter VIP home page Giter VIP logo

flutter_math_fork's Introduction

Flutter Math

Build Status codecov Pub Version

⚠ fork

This is a fork of flutter_math addressing compatibility problems while flutter_math is not being maintained.


Math equation rendering in pure Dart & Flutter.

This project aims to achieve maximum compatibility and fidelity with regard to the KaTeX project, while maintaining the performance advantage of Dart and Flutter. A further UnicodeMath-style equation editing support will be experimented in the future.

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.

Rendering Samples

x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

Example1

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

\hat f(\xi) = \int_{-\infty}^\infty f(x)e^{- 2\pi i \xi x}\mathrm{d}x

Example3

How to use

Add flutter_math to your pubspec.yaml dependencies

Mobile

Currently only Android platform has been tested. If you encounter any issues with iOS, please file them.

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

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.

Display-style equations:

Math.tex(r'\frac a b', mathStyle: MathStyle.display) // Default

In-line equations

Math.tex(r'\frac a b', mathStyle: MathStyle.text)

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

Math.tex(
  r'\frac a b',
  textStyle: TextStyle(fontSize: 42),
  // logicalPpi: MathOptions.defaultLogicalPpiFor(42),
)

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.

SelectableMath.tex(r'\frac a b', textStyle: TextStyle(fontSize: 42))

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.

Math.tex(
  r'\garbled $tring', 
  textStyle: TextStyle(color: Colors.green),
  onErrorFallback: (err) => Container(
    color: Colors.red,
    child: Text(err.messageWithType, style: TextStyle(color: Colors.yellow)),
  ),
)

If you wish to have more granularity dealing with equations, you can manually invoke the parser and supply AST into the widget.

SyntaxTree ast;
try {
  ast = SyntaxTree(greenRoot: TexParser(r'\frac a b', TexParserSettings()).parse());
} on ParseException catch (e) {
  // Handle my error here
}

SelectableMath(
  ast: ast,
  mathStyle: MathStyle.text,
  textStyle: TextStyle(fontSize: 42),
)

Credits

This project is possible thanks to the inspirations and resources from the KaTeX Project, MathJax, Zefyr, and CaTeX.

Goals

  • : TeX math parsing (See design doc)
  • : AST rendering in flutter
  • : Selectable widget
  • : TeX output (WIP)
  • : UnicodeMath parsing and encoding
  • : UnicodeMath-style editing
  • : Breakable equations
  • : MathML parsing and encoding

flutter_math_fork's People

Contributors

alihassan143 avatar creativecreatorormaybenot avatar douglasserena avatar edhom avatar fzyzcjy avatar hardiklakhalani avatar ichordedionysos avatar jankolancer avatar jeuler avatar jigneshworld avatar kamil-simple avatar michalsrutek avatar millerovv avatar olof-dev avatar p-mazhnik avatar sese-schneider avatar skyost avatar the-redhat avatar walsha2 avatar yeomdonguk avatar znjameswu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_math_fork's Issues

Error: The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:

its flutter project any solution for it???

./../../../flutter/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.3.3+1/lib/src/widgets/selectable.dart:407:7:Error: The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:

TextSelectionDelegate.copySelection
TextSelectionDelegate.cutSelection
TextSelectionDelegate.pasteText
TextSelectionDelegate.selectAll
Try to either
provide an implementation,
inherit an implementation from a superclass or mixin,
mark the class as abstract, or
provide a 'noSuchMethod' implementation.

`SelectableMath` doesn't render selection with `provider` 6.0

SelectableMath doesn't render selection with provider 6.0.0

I use macOS and Chrome (web) / Android emulator, flutter 2.5.3

Steps to reproduce:

  1. Run the example app (I was getting null-safety issues, so I had to remove flutter_tex dependency first)
  2. Type some expression and try to select it. You can't.

Issue disappears if I downgrade the provider dependency to 5.0.0

Add access to a baseline

Hello,
Thank you very much for this library, it is amazingly useful. One problem that I am having is, that I cannot combine multiple equations and text within the same Inline span without it jumping around vertically. Here is a small example:
image

The most likely cause of this is, that the Math widgets don't really have a defined baseline and are therefore added in by a heuristic, like centered or aligned to the bottom. That's where problems arise: If I have one equation that has all its symbols above the text-baseline, it will be rendered correctly. However, if I put a simple f, or a sum with limits right next to it in another math widget, all symbols within that equation will be shifted, because now the bottom of the widget, which currently can be regarded as the effective baseline, is in another place

Is there a fix for this issue working right now and I havent found it, or would that need further development? I would assume that within the simple club app, this could become problematic as well

Parse Error: Can't use \not and \perp together

Guys, thank you for your effort.

Entering the tex commands \not\perp for 'nonorthogonality' in Math.tex causes the following error

ParseError: \not has to be followed by a combinable character

Any idea why?

The font changes when Math.tex is in a TextButton

Hi,
when I try to put Math.tex in a button, the font of the letters is automatically changed. Below is an image where on the left I created an InkWell with Math.tex (which maintains the classic Math.tex font), and on the right a TextButton with Math.tex

Screenshot_20230817-154841~2 (1)

As you can see the fonts are different, I would like the classic Math.tex font to be kept in a button as well, how can I do this?

InkWell( onTap: () {}, child: Align( alignment: Alignment.center, child: Math.tex( r"abc", ), ), ),

TextButton( onPressed: () => {}, child: Math.tex( r"abc", ), ),

Line breaking with Wrap causes inconsistent positioning

The line-breaking doc suggests breaking the latex into parts and putting them into a Wrap widget, however, this causes inconsistencies in the positioning and spacing between the parts.

x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

Actual result:
image

Expected result:
image

Is there a better way to do this?

输入这种latex显示有误

输入这个latex公式解析有误,'3 \times 5 + \{ 1 + 2 \} \} '

原文如下
3*5+{1+2}}

当左边只有一个{ 括号,但是右边有2个 }},就会出现问题。

IntrinsicWidth overflow

When I put the Math.tex in an IntrinsicWidth and use characters like - + * etc .. it overflows

Immagine 2022-08-21 175328

import 'package:flutter/material.dart';
import 'package:flutter_math_fork/flutter_math.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: (context, child) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              
              children: [
                IntrinsicWidth(child: Math.tex('555-222', options: MathOptions(fontSize: 20))),
                SizedBox(height: 100),
                IntrinsicWidth(child: Math.tex('5555555+222', options: MathOptions(fontSize: 20))),
                SizedBox(height: 100),
                IntrinsicWidth(child: Math.tex('555***222', options: MathOptions(fontSize: 20))),
              ],
            ),
          ),
        );
      }
    );
  }
}

Error parsing {equation}

The library currently cannot parse this equation:

\begin{equation} \fbox{$\sqrt{\dfrac{A}{B}}=\dfrac{\sqrt{AB}}{|B|}$} \end{equation}

Parser Error: Expected group after '^'

Hi Team, Thank you for the package.
There is an error when I enter '^':
image
The code:

Math.tex(
                  fitModelController.expr.value,
                  textStyle: TextStyle(color: Colors.green),
                  onErrorFallback: (err) => Container(
                    color: Colors.red,
                    child: Text(err.messageWithType,
                        style: TextStyle(color: Colors.yellow)),
                  ),
                ),

BTW, I would like to know whether it is only for web and mobile. The above codes are running on Win Desktop. No errors with the online demo.

Thank you.

The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:

Error output from Xcode build:

** BUILD FAILED **

Xcode's output:

../../../../Developer/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.3.3+1/lib/src/widgets/selectable.dart:407:7: Error: The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:
- TextSelectionDelegate.copySelection
- TextSelectionDelegate.cutSelection
- TextSelectionDelegate.pasteText
- TextSelectionDelegate.selectAll
Try to either
- provide an implementation,
- inherit an implementation from a superclass or mixin,
- mark the class as abstract, or
- provide a 'noSuchMethod' implementation.

class InternalSelectableMathState extends State<InternalSelectableMath>
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
../../../../Developer/flutter/packages/flutter/lib/src/services/text_input.dart:985:8: Context: 'TextSelectionDelegate.copySelection' is defined here.
  void copySelection(SelectionChangedCause cause);
       ^^^^^^^^^^^^^
../../../../Developer/flutter/packages/flutter/lib/src/services/text_input.dart:965:8: Context: 'TextSelectionDelegate.cutSelection' is defined here.
  void cutSelection(SelectionChangedCause cause);
       ^^^^^^^^^^^^
../../../../Developer/flutter/packages/flutter/lib/src/services/text_input.dart:973:16: Context: 'TextSelectionDelegate.pasteText' is defined here.
  Future<void> pasteText(SelectionChangedCause cause);
               ^^^^^^^^^
../../../../Developer/flutter/packages/flutter/lib/src/services/text_input.dart:979:8: Context: 'TextSelectionDelegate.selectAll' is defined here.
  void selectAll(SelectionChangedCause cause);

support for '\unicode'

This library does not support rendering \unicode{xxx} into unicode characters, you can match such formulas before parsing and replace them with unicode characters to display

Here I use regular expressions to filter and replace, it should be able to support \unicode{xxx}, hope you can add it if you have time

/// replace all unicode directives before parsing
///
/// rule of '\unicode{xxx}'
/// - \unicode{ [^x][0-9a-zA-Z]* }  -- decimal
/// - \unicode{ x[0-9a-zA-Z]* } -- hexadecimal
String unicodeFilter(String raw) {
  var reg = RegExp(
    r'\${1,2}\\unicode\{(?<isHex>x)?(?<val>[0-9a-eA-E]*)\}\${1,2}',
    dotAll: true,
  );

  String replaced = '';
  int p = 0;

  reg.allMatches(raw).forEach((part) {
    if (part.start > p) {
      replaced += raw.substring(p, part.start);
    }

    bool isHex = part.namedGroup('isHex') == 'x';
    int? v = int.tryParse(part.namedGroup('val') ?? '', radix: isHex ? 16 : 10);

    if (v != null) replaced += String.fromCharCode(v);

    p = part.end;
  });

  return replaced;
}

image

hline color

The hline color in the environments isn't working. It's always black:

Math.tex(r'\color{green}\begin{array}{|c}123\\ \hline 123\end{array}')

I've also tried:

Math.tex(r'\begin{array}{|c}123\\ \hline 123\end{array}', textStyle: TextStyle(color: Colors.green))

The delimiter color for pmatrix, bmatrix, vmatrix, etc. is right, but hline isn't:

Math.tex(r'\color{green}\begin{pmatrix}123\\ \hline 123\end{pmatrix}')

When I tried changing the hline color on the Online Demo, it works, but when run on a device, it's always black.

Null safety warnings

I'm getting these warnings when running my application.

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selectable.dart:459:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
      SchedulerBinding.instance!.addPostFrameCallback((_) {
                       ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay_manager.dart:138:28: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
      if (SchedulerBinding.instance!.schedulerPhase ==
                           ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay_manager.dart:140:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
        SchedulerBinding.instance!
                         ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/web_selection_manager.dart:119:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
      SchedulerBinding.instance!
                       ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:141:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
    if (SchedulerBinding.instance!.schedulerPhase ==
                         ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:143:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
      SchedulerBinding.instance!.addPostFrameCallback(_markNeedsBuild);
                       ^

/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:193:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
    if (SchedulerBinding.instance!.schedulerPhase ==

                         ^
/C:/Users/user/AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:195:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/E:/Programs/Flutter/flutter/packages/flutter/lib/src/scheduler/binding.dart').
      SchedulerBinding.instance!.addPostFrameCallback(_markNeedsBuild);

                       ^

can this plugin allow text and mathematical formulas to be displayed in one line?

Hello, can this plugin allow text and mathematical formulas to be displayed in one line?
Below is test codes:

import 'package:flutter/material.dart';
import 'package:flutter_math_fork/flutter_math.dart';

class Demome extends StatelessWidget {
  const Demome({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final expression =
        "Calculus is a branch of mathematics that deals with the derivatives and integrals of functions. Here is an example calculus:
Example: Find the derivative of the function $f(x)=x^3$at $x=2$.
Solution: Using the derivation formula, we can find the derivation of $f'(x)$:
$$f'(x) = 3x^2$$
Then, put $x=2$into $f'(x)$to get:
$$f'(2) = 3(2)^2 = 12$$
Thus, the derivative of the function $f(x)$at $x=2$is $12$.";
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text(expression, softWrap: true),
        ),
        Divider(
          thickness: 1.0,
          height: 1.0,
        ),
        Expanded(
          child: Center(
            child: Math.tex(
              expression,
              mathStyle: MathStyle.textCramped,
              settings: TexParserSettings(
                strict: Strict.ignore,
                displayMode: true,
              ),
            ),
          ),
        )
      ],
    );
  }
}

Use $ as delimiters in Katex

I'm a newbie with katex, so I don't know how to use katex with exists my data.
Now I display math data with mathjax in website with config:

<script type="text/x-mathjax-config">
  MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
</script>

How to I setup katex with similar config to display my exist data by flutter_math_fork.

Below is my test codes:

import 'package:flutter/material.dart';
import 'package:flutter_math_fork/flutter_math.dart';

class Demome extends StatelessWidget {
  const Demome({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final expression =
        "\\({{\\left( x-2 \\right)}^{2}}+{{\\left( y-1 \\right)}^{2}}+{{\\left( z+3 \\right)}^{2}}=13.\\)";
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      mainAxisSize: MainAxisSize.min,
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        Padding(
          padding: const EdgeInsets.all(8.0),
          child: Text(expression, softWrap: true),
        ),
        Divider(
          thickness: 1.0,
          height: 1.0,
        ),
        Expanded(
          child: Center(
            child: Math.tex(
              expression,
              mathStyle: MathStyle.textCramped,
              settings: TexParserSettings(
                strict: Strict.ignore,
                displayMode: true,
              ),
            ),
          ),
        )
      ],
    );
  }
}

And I have received an error message: "Parse error: Can't use '\(' in math mode".

I have tried to read documents, test codes and sample codes many times but I can't find any solution for my situation.

render error (sqrt)

  • version: 0.6.1

  • Data: Rút gọn biểu thức $P=\dfrac{\left(a^{\tiny 2 \sqrt{2}}-1\right)\left(a^{\tiny 3 \sqrt{2}}-a^{\tiny 2 \sqrt{2}}+a^{\tiny \sqrt{2}}\right)}{a^{\tiny 4 \sqrt{2}}+a^{\tiny \sqrt{2}}}$ với $a$ là số dương.
    image

flutter_math_fork null check error

flutter_math_fork null error shown as bellow

/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selectable.dart:459:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.

'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
SchedulerBinding.instance!.addPostFrameCallback((_) {
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay_manager.dart:138:28: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
if (SchedulerBinding.instance!.schedulerPhase ==
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay_manager.dart:140:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
SchedulerBinding.instance!
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/web_selection_manager.dart:119:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
SchedulerBinding.instance!
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:141:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
if (SchedulerBinding.instance!.schedulerPhase ==
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:143:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
SchedulerBinding.instance!.addPostFrameCallback(_markNeedsBuild);
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:193:26: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
if (SchedulerBinding.instance!.schedulerPhase ==
^
/opt/hostedtoolcache/flutter/3.0.5-stable/x64/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.5.0/lib/src/widgets/selection/overlay.dart:195:24: Warning: Operand of null-aware operation '!' has type 'SchedulerBinding' which excludes null.
'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/opt/hostedtoolcache/flutter/3.0.5-stable/x64/packages/flutter/lib/src/scheduler/binding.dart').
SchedulerBinding.instance!.addPostFrameCallback(_markNeedsBuild);

Baseline was handled better in previous versions

Hi,

Here's a little problem I have with newer versions of flutter_math_fork : the text baseline seems to be incorrect. Here's a little example :

In 0.3.0+2 :

In 0.6.1 :

My code hasn't changed :

  @override
  Widget build(BuildContext context) {
    Math math = Math.tex(
      content.replaceAll(r'\displaystyle', ''),
      textStyle: textStyle.copyWith(color: textStyle.color),
    );

    List<Math> parts = math.texBreak().parts;
    return RichText(
      text: TextSpan(
        children: _handleParts(parts),
      ),
    );
  }

  /// Handles the math parts.
  List<InlineSpan> _handleParts(List<Math> parts) {
    List<InlineSpan> result = [];
    for (Math part in parts) {
      result.add(WidgetSpan(
        baseline: TextBaseline.alphabetic,
        alignment: PlaceholderAlignment.baseline,
        child: part,
      ));
      result.add(const TextSpan(
        text: ' ',
      ));
    }
    // result.removeLast();
    return result;
  }

Complete code

Thanks for your help !

Math.tex showing error when passing custom variable values in it using string interpolation

`class ResultPage extends StatefulWidget {
DataModel dataModel;
ResultPage({Key? key, required this.dataModel}) : super(key: key);

@OverRide
_ResultPageState createState() => _ResultPageState();
}

class _ResultPageState extends State {
@OverRide
Widget build(BuildContext context) {
return Scaffold(
body:Math.tex(
'x = \frac {${dataModel.data.value1}-y1} {${dataModel.data.value1}-x1}',
textStyle: textStyle,
// "m = y2-y1/x2-x1",
)
);)
}`

Null check operator used on a null value

Hey,
I've successfully implemented flutter_math in a RichText widget (see znjameswu/flutter_math#29 (comment)). But I still have some problems :

======== Exception caught by rendering library =====================================================
The following _CastError was thrown during performLayout():
Null check operator used on a null value

The relevant error-causing widget was: 
  RichText file:///D:/Hugo/Projets/Flutter/bacomathiques/lib/pages/html/widgets/math_widget.dart:41:12
When the exception was thrown, this was the stack: 
#0      MultiscriptsLayoutDelegate.performHorizontalIntrinsicLayout (package:flutter_math_fork/src/render/layout/multiscripts.dart:136:53)
#1      IntrinsicLayoutDelegate.performLayout (package:flutter_math_fork/src/render/layout/custom_layout.dart:266:19)
#2      RenderCustomLayout.performLayout (package:flutter_math_fork/src/render/layout/custom_layout.dart:198:27)
#3      RenderObject.layout (package:flutter/src/rendering/object.dart:1784:7)
#4      RenderLine.performLayout (package:flutter_math_fork/src/render/layout/line.dart:332:15)
...
The following RenderObject was being processed when the exception was fired: RenderCustomLayout<_ScriptPos>#19c04 relayoutBoundary=up35 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
...  parentData: offset=Offset(0.0, 0.0); canBreakBefore = false; customSize = false; trailingMargin = 4.444444444444445; alignerOrSpacer = false (can use size)
...  constraints: BoxConstraints(unconstrained)
...  size: MISSING
RenderObject: RenderCustomLayout<_ScriptPos>#19c04 relayoutBoundary=up35 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE
  parentData: offset=Offset(0.0, 0.0); canBreakBefore = false; customSize = false; trailingMargin = 4.444444444444445; alignerOrSpacer = false (can use size)
  constraints: BoxConstraints(unconstrained)
  size: MISSING
====================================================================================================

The problem seems to be the following line (in src/render/layout/multiscripts.dart) :

Screenshot_3

flutter_math_fork 0.6.3 incompatible with flutter html 2.2.1

Because flutter_math_fork >=0.6.0 depends on flutter_svg ^1.0.0 and flutter_html 2.2.1 depends on flutter_svg >=0.22.0 <1.0.0, flutter_math_fork >=0.6.0 is incompatible with flutter_html 2.2.1. And because no versions of flutter_html match >2.2.1 <3.0.0, flutter_math_fork >=0.6.0 is incompatible with flutter_html ^2.2.1. So, because mysite depends on both flutter_html ^2.2.1 and flutter_math_fork ^0.6.3, version solving failed. pub get failed (1; So, because mysite depends on both flutter_html ^2.2.1 and flutter_math_fork ^0.6.3, version solving failed.)

'InternalSelectableMathState' is missing implementations for these members:

Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:

package:facebook_audience_network

For solutions, see https://dart.dev/go/unsound-null-safety
/C:/src/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_math_fork-0.3.3+1/lib/src/widgets/selectable.dart:407:7: Error: The non-abstract class 'InternalSelectableMathState'
is missing implementations for these members:

TextSelectionDelegate.copySelection
TextSelectionDelegate.cutSelection
TextSelectionDelegate.pasteText
TextSelectionDelegate.selectAll
Try to either
provide an implementation,
inherit an implementation from a superclass or mixin,
mark the class as abstract, or
provide a 'noSuchMethod' implementation.

class InternalSelectableMathState extends State
^^^^^^^^^^^^^^^^^^^^^^^^^^^
/C:/src/flutter/packages/flutter/lib/src/services/text_input.dart:985:8: Context: 'TextSelectionDelegate.copySelection' is defined here.
void copySelection(SelectionChangedCause cause);
^^^^^^^^^^^^^
/C:/src/flutter/packages/flutter/lib/src/services/text_input.dart:965:8: Context: 'TextSelectionDelegate.cutSelection' is defined here.
void cutSelection(SelectionChangedCause cause);
^^^^^^^^^^^^
/C:/src/flutter/packages/flutter/lib/src/services/text_input.dart:973:16: Context: 'TextSelectionDelegate.pasteText' is defined here.
Future pasteText(SelectionChangedCause cause);
^^^^^^^^^
/C:/src/flutter/packages/flutter/lib/src/services/text_input.dart:979:8: Context: 'TextSelectionDelegate.selectAll' is defined here.
void selectAll(SelectionChangedCause cause);
^^^^^^^^^
Unhandled exception:
Bad state: Unsupported Null Safety mode NonNullableByDefaultCompiledMode.Invalid, in null.
#0 ProgramCompiler.emitModule (package:dev_compiler/src/kernel/compiler.dart:472:9)
#1 JavaScriptBundler.compile (package:frontend_server/src/javascript_bundle.dart:152:33)
#2 FrontendCompiler.writeJavascriptBundle (package:frontend_server/frontend_server.dart:650:47)

#3 FrontendCompiler.compile (package:frontend_server/frontend_server.dart:558:9)

#4 listenAndCompile. (package:frontend_server/frontend_server.dart:1135:11)

the Dart compiler exited unexpectedly.

flutter_math_fork-0.7.1 does not support flutter sdk: '>=3.2.0-191.0.dev <4.0.0'

Describe the bug
The package does not compile when used in the flutter beta channel.

To Reproduce
Steps to reproduce the behavior:

  1. Switch to the flutter beta channel
  2. Try to run the app

Additional context

Error (Xcode): ../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.7.1/lib/src/widgets/selection/gesture_detector_builder_selectable.dart:38:22: Error: Type 'TapDragUpDetails' not found.

The non-abstract class 'InternalSelectableMathState' is missing implementations for these members

../../AppData/Local/Pub/Cache/hosted/pub.dartlang.org/flutter_math_fork-0.3.3+1/lib/src/widgets/selectable.dart:407:7: Error: The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:

  • TextSelectionDelegate.copySelection
  • TextSelectionDelegate.cutSelection
  • TextSelectionDelegate.pasteText
  • TextSelectionDelegate.selectAll
    Try to either
  • provide an implementation,
  • inherit an implementation from a superclass or mixin,
  • mark the class as abstract, or
  • provide a 'noSuchMethod' implementation.

class InternalSelectableMathState extends State
^^^^^^^^^^^^^^^^^^^^^^^^^^^
/C:/desarrollo/flutter/packages/flutter/lib/src/services/text_input.dart:985:8: Context: 'TextSelectionDelegate.copySelection' is defined here.
void copySelection(SelectionChangedCause cause);
^^^^^^^^^^^^^
/C:/desarrollo/flutter/packages/flutter/lib/src/services/text_input.dart:965:8: Context: 'TextSelectionDelegate.cutSelection' is defined here.
void cutSelection(SelectionChangedCause cause);
^^^^^^^^^^^^
/C:/desarrollo/flutter/packages/flutter/lib/src/services/text_input.dart:973:16: Context: 'TextSelectionDelegate.pasteText' is defined here.
Future pasteText(SelectionChangedCause cause);
^^^^^^^^^
/C:/desarrollo/flutter/packages/flutter/lib/src/services/text_input.dart:979:8: Context: 'TextSelectionDelegate.selectAll' is defined here.
void selectAll(SelectionChangedCause cause);
^^^^^^^^^

FAILURE: Build failed with an exception.

  • Where:
    Script 'C:\desarrollo\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1070

  • What went wrong:
    Execution failed for task ':app:compileFlutterBuildDebug'.

Process 'command 'C:\desarrollo\flutter\bin\flutter.bat'' finished with non-zero exit value 1

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 8m 5s
Exception: Gradle task assembleDebug failed with exit code 1

To add line breaking capability to '\text' block.

Hi,

I am coming here from the original flutter_math repo. Thank you so much for maintaining this project. I have an issue with wrapping functionality.

Issue: Cannot be able to wrap text block. Please see the below example,

final teXt = Math.tex(
      // context.select<QuizState, String>((state) => state.questionStr!),
      r'\text {This string is not going to be wrapped. Is there a way? because I want to mix text and math} \frac {3} {4.4}',
).texBreak();

// ...

Wrap(children: teXt.parts), //output: everything is in a single line. overflow error. 

Is this issue solvable? Here the \text block is not breaking up (and the test of the equation as well). Is the logic hard to implement? I think it just needed to separate each words.

Thank you again.

Error (Xcode): ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:186:20: Error: The argument type 'void Function(TapDownDetails)' can't be assigned to the parameter type 'void Function(TapDragDownDetails)?'.

Error (Xcode): ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:186:20: Error: The argument type 'void Function(TapDownDetails)' can't be assigned to the parameter type 'void Function(TapDragDownDetails)?'.

Add valid copyright information

Currently, in the LICENSE file, the copyright information is not correct. It literally reads (in line 190):

Copyright [yyyy] [name of copyright owner]

Could you please add a valid year and name?

occurs "Multiple widgets used the same GlobalKey" error, when use Math.tex().textBreak().parts with flutter_markdown

hi.
thank you for making this package.

i'm trying to use this package with flutter_markdown.

when i use Math.text().texBreak() function. the error occured.

i don't know why multiple widgets use same global key.


class HomeView extends StatelessWidget {
  const HomeView({super.key});

  @override
  Widget build(BuildContext context) {
    final homeController = Get.find<HomeController>();

    return Scaffold(
      appBar: AppBar(),
      body: SafeArea(
        child: Center(
          child: ListView(
            padding: const EdgeInsets.all(24),
            children: [
              MarkdownBody(
                data: fakeWorkSpaceData,
                inlineSyntaxes: [
                  md.TexInlineSyntex(),
                ],
                blockSyntaxes: const [
                  md.FencedTexBlockSyntax(),
                ],
                builders: {
                  'tex': TexWidget(),
                  'texblock': TexBlockElementBuilder(),
                },
                styleSheet: MarkdownStyleSheet(
                  texblockDecoration: BoxDecoration(
                    border: Border.all(color: Colors.red),
                  ),
                ),
              ),
              TextButton(
                key: const ValueKey('increment'),
                onPressed: homeController.incrementCount,
                child: Obx(
                  () => Text(
                    '${homeController.count.value}',
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class TexBlockElementBuilder extends MarkdownElementBuilder {
  /// texblock 태그를 가진 하위 text 엘리먼트에 도달했을 때
  @override
  Widget visitText(md.Text text, TextStyle? preferredStyle) =>
      const SizedBox.shrink();

  /// texblock 태르를 가진 하위 엘리먼트(textr
  @override
  Widget visitElementAfter(md.Element element, TextStyle? preferredStyle) =>
      Container();
}

///
class TexWidget extends MarkdownElementBuilder {
  @override
  Widget visitElementAfter(md.Element element, TextStyle? preferredStyle) {
    final parrentIsTexblock = element.attributes['parrent'] == 'texblock';
    return element.isEmpty
        ? const SizedBox()
        : Wrap(
            children: Math.tex(
              element.children!.first.textContent,
              textStyle: TextStyle(fontSize: parrentIsTexblock ? 100 : 50),
              settings:
                  TexParserSettings(globalGroup: false, displayMode: true),
            ).texBreak().parts,
          );
  }
}

plz help me!

Request to Upgrade flutter_svg Dependency in flutter_math_fork

Dear flutter_math_fork Maintainers,

I am currently using your package, flutter_math_fork, in my Flutter project and I appreciate the functionality it provides. However, I have encountered a version conflict issue with the flutter_svg dependency.

My project requires the use of flutter_svg version 2.0.5, but flutter_math_fork currently depends on an older version of flutter_svg. This version mismatch is causing conflicts and preventing my project from building successfully.

I kindly request that you consider upgrading the flutter_svg dependency in flutter_math_fork to version 2.0.5 or later. This upgrade would resolve the version conflict and greatly assist in the progress of my project.

I understand that such an upgrade may have implications for other users of flutter_math_fork, and I appreciate the careful consideration that goes into maintaining package dependencies.

Thank you for your time and for the work you do maintaining flutter_math_fork. I look forward to any updates you can provide on this matter.

Failed to build iOS app

I have the following error when running on iOS

Running Xcode build...
Xcode build done. 27.6s
Failed to build iOS app
Could not build the precompiled application for the device.
Error (Xcode): ../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.6.3+1/lib/src/widgets/selection/gesture_detector_builder.dart:186:20: Error: The argument type 'void Function(TapDownDetails)' can't be assigned to the parameter type 'void Function(TapDragDownDetails)?'.

It runs without any issues on my Android phone.

I am rather new. Please advise.

thongjoon

Missing implementations

Flutter sdk: 6.0.0
flutter/.pub-cache/hosted/pub.flutter-io.cn/flutter_math_fork-0.4.0/lib/src/widgets/selectable.dart:407:7: Error: The non-abstract class 'InternalSelectableMathState' is missing implementations for these members:

  • TextSelectionDelegate.copySelection
  • TextSelectionDelegate.cutSelection
  • TextSelectionDelegate.pasteText
  • TextSelectionDelegate.selectAll
    Try to either
  • provide an implementation,
  • inherit an implementation from a superclass or mixin,
  • mark the class as abstract, or
  • provide a 'noSuchMethod' implementation.

class InternalSelectableMathState extends State
^^^^^^^^^^^^^^^^^^^^^^^^^^^
../../flutter/packages/flutter/lib/src/services/text_input.dart:948:8: Context: 'TextSelectionDelegate.copySelection' is defined here.
void copySelection(SelectionChangedCause cause) {
^^^^^^^^^^^^^
../../flutter/packages/flutter/lib/src/services/text_input.dart:872:8: Context: 'TextSelectionDelegate.cutSelection' is defined here.
void cutSelection(SelectionChangedCause cause) {
^^^^^^^^^^^^
../../flutter/packages/flutter/lib/src/services/text_input.dart:900:16: Context: 'TextSelectionDelegate.pasteText' is defined here.
Future pasteText(SelectionChangedCause cause) async {
^^^^^^^^^
../../flutter/packages/flutter/lib/src/services/text_input.dart:928:8: Context: 'TextSelectionDelegate.selectAll' is defined here.
void selectAll(SelectionChangedCause cause) {
^^^^^^^^^

Does not run on flutter 3.10

 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:186:20: Error: The argument type 'void Function(TapDownDetails)' can't be assigned to the parameter type 'void Function(TapDragDownDetails)?'.
  - 'TapDownDetails' is from 'package:flutter/src/gestures/tap.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/tap.dart').
  - 'TapDragDownDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onTapDown: onTapDown,
                    ^
 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:190:24: Error: The argument type 'void Function(TapUpDetails)' can't be assigned to the parameter type 'void Function(TapDragUpDetails)?'.
  - 'TapUpDetails' is from 'package:flutter/src/gestures/tap.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/tap.dart').
  - 'TapDragUpDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onSingleTapUp: onSingleTapUp,
                        ^
 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:195:26: Error: The argument type 'void Function(TapDownDetails)' can't be assigned to the parameter type 'void Function(TapDragDownDetails)?'.
  - 'TapDownDetails' is from 'package:flutter/src/gestures/tap.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/tap.dart').
  - 'TapDragDownDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onDoubleTapDown: onDoubleTapDown,
                          ^
 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:196:31: Error: The argument type 'void Function(DragStartDetails)' can't be assigned to the parameter type 'void Function(TapDragStartDetails)?'.
  - 'DragStartDetails' is from 'package:flutter/src/gestures/drag_details.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart').
  - 'TapDragStartDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onDragSelectionStart: onDragSelectionStart,
                               ^
 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:197:32: Error: The argument type 'void Function(DragStartDetails, DragUpdateDetails)' can't be assigned to the parameter type 'void Function(TapDragUpdateDetails)?'.
  - 'DragStartDetails' is from 'package:flutter/src/gestures/drag_details.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart').
  - 'DragUpdateDetails' is from 'package:flutter/src/gestures/drag_details.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart').
  - 'TapDragUpdateDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onDragSelectionUpdate: onDragSelectionUpdate,
                                ^
 ../../../.pub-cache/hosted/pub.dev/flutter_math_fork-0.5.0/lib/src/widgets/selection/gesture_detector_builder.dart:198:29: Error: The argument type 'void Function(DragEndDetails)' can't be assigned to the parameter type 'void Function(TapDragEndDetails)?'.
  - 'DragEndDetails' is from 'package:flutter/src/gestures/drag_details.dart' ('/opt/flutter/packages/flutter/lib/src/gestures/drag_details.dart').
  - 'TapDragEndDetails' is from 'package:flutter/src/widgets/tap_and_drag_gestures.dart' ('/opt/flutter/packages/flutter/lib/src/widgets/tap_and_drag_gestures.dart').
         onDragSelectionEnd: onDragSelectionEnd,
                             ^


font

How can I add a new font

Undefined control sequence: \displaylines

The library currently cannot parse this equation:
\displaylines{\begin{align*} \mathrm{{V}'{\left({t}\right)}} &= \mathrm{\frac{{d}}{{\left.{d}{t}\right.}}{\left({t}^{{-\frac{{3}}{{5}}}}+{t}^{{8}}\right)}} \[3pt] &= \mathrm{-\frac{{3}}{{5}}{t}^{{-\frac{{3}}{{5}}-{1}}}+{8}{t}^{{{8}-{1}}}} \[3pt] &= \mathrm{-\frac{{3}}{{5}}{t}^{{-\frac{{8}}{{5}}}}+{8}{t}^{{7}}} \end{align*}}

Stop using deprecated classess

You use in your code ToolbarOptions which is

@Deprecated(
  'Use `contextMenuBuilder` instead. '
  'This feature was deprecated after v3.3.0-0.5.pre.',
)

Also in the TextSelectionControls

  @Deprecated(
    'Use `contextMenuBuilder` instead. '
    'This feature was deprecated after v3.3.0-0.5.pre.',
  )
  Widget buildToolbar(
    BuildContext context,
    Rect globalEditableRegion,
    double textLineHeight,
    Offset selectionMidpoint,
    List<TextSelectionPoint> endpoints,
    TextSelectionDelegate delegate,
    // TODO(chunhtai): Change to ValueListenable<ClipboardStatus>? once
    // migration is done. https://github.com/flutter/flutter/issues/99360
    ClipboardStatusNotifier? clipboardStatus,
    Offset? lastSecondaryTapDownPosition,
  );

Should be fixed.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.