To hack on MathQuill, you‘re gonna want to build and test the source files you edit. In addition to make
, MathQuill uses some build tools written on Node, so you will need to install that before running make
. (Once it’s installed, make
automatically does npm install
, installing the necessary build tools.)
make
builds build/mathquill.{css,js,min.js}
make dev
won't try to minify MathQuill (which can be annoyingly slow)make test
builds mathquill.test.js
(used by test/unit.html
) and also doesn't minifymake basic
builds mathquill-basic.{js,min.js,css}
and font/Symbola-basic.{eot,ttf}
; serve and load them instead for a stripped- down version of MathQuill for basic mathematics, without advanced LaTeX commands. Specifically, it doesn‘t let you type LaTeX backslash commands with \
or text blocks with $
, and also won’t render any LaTeX commands that can‘t by typed without \
. The resulting JS is only somewhat smaller, but the font is like 100x smaller. (TODO: reduce full MathQuill’s font size.)All the CSS is in src/css
. Most of it‘s pretty straightforward, the choice of font isn’t settled, and fractions are somewhat arcane, see the Wiki pages “Fonts” and “Fractions”.
All the JavaScript that you actually want to read is in src/
, build/
is created by make
to contain the same JS cat'ed and minified.
There‘s a lot of JavaScript but the big picture isn’t too complicated, there's 2 thin layers sandwiching 2 broad but modularized layers:
More specifically:
(In comments and internal documentation, ::
means .prototype.
.)
tree.js
defines base classes of objects relating to the tree.cursor.js
defines objects representing the cursor and a selection of math or text, with associated HTML elements.Fraction
, SquareRoot
, or VanillaSymbol
.\frac
or \ . Unlike loose usage in the LaTeX community, where \ne
and \neq
(which print the same symbol, ≠) might or might not be considered the same command, in the context of MathQuill they are considered different “control sequences” for the same “command”..moveTowards
on the node just left of the cursor, dispatching on what kind of command the node is (Fraction::moveTowards
and SquareRoot::moveTowards
can insert the cursor in different places).controller.js
defines the base class for the controller, which each math field or static math instance has one of, and to which each service adds methods.publicapi.js
defines the global MathQuill.getInterface()
function, the MQ.MathField()
etc. constructors, and the API objects returned by them. The constructors, and the API methods on the objects they return, call appropriate controller methods to initialize and manipulate math field and static math instances.Misc.:
intro.js
defines some simple sugar for the idiomatic JS classes used throughout MathQuill, plus some globals and opening boilerplate.
Classes are defined using Pjs, and the variable _
is used by convention as the prototype.
services/*.util.js
files are unimportant to the overall architecture, you can ignore them until you have to deal with code that is using them.