mirror of
https://github.com/Smaug123/KaTeX
synced 2025-10-07 20:28:38 +00:00
Modernize font creation (#624)
* Modernize font creation * Automate the build process, instead of writing a complicated manual * Update sources used by the docker image away from google code * Exclude MathJax-dev checkout from docker image, to allow image reuse * Try to keep the individual image layers small by combining RUN commands and removing temporary files used only during each individual step * Allow creating fonts from local directory Also use hash of Dockerfile to compute image tag, in order to ensure creation of a new image if the Dockerfile changes. * make glob syntax work on MacOS
This commit is contained in:
committed by
Kevin Barabash
parent
a4b1bf01be
commit
a9708a25f2
@@ -2,7 +2,10 @@ FROM ubuntu:14.04
|
|||||||
MAINTAINER xymostech <xymostech@gmail.com>
|
MAINTAINER xymostech <xymostech@gmail.com>
|
||||||
|
|
||||||
# Install things
|
# Install things
|
||||||
RUN apt-get -qq update && apt-get -qqy install \
|
RUN apt-get update \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get -y upgrade \
|
||||||
|
&& DEBIAN_FRONTEND=noninteractive apt-get -y install \
|
||||||
|
--no-install-recommends --auto-remove \
|
||||||
git \
|
git \
|
||||||
dvipng \
|
dvipng \
|
||||||
default-jre \
|
default-jre \
|
||||||
@@ -23,39 +26,41 @@ RUN apt-get -qq update && apt-get -qqy install \
|
|||||||
woff-tools \
|
woff-tools \
|
||||||
pkg-config \
|
pkg-config \
|
||||||
libharfbuzz-dev \
|
libharfbuzz-dev \
|
||||||
libfreetype6-dev || true
|
libfreetype6-dev \
|
||||||
RUN gem install ttfunk --version 1.1.1
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& gem install ttfunk --version 1.1.1
|
||||||
|
|
||||||
# Download yuicompressor
|
# Download yuicompressor
|
||||||
RUN mkdir /usr/share/yui-compressor/
|
ADD https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.jar /usr/share/yui-compressor/yui-compressor.jar
|
||||||
RUN wget "https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.jar" -O /usr/share/yui-compressor/yui-compressor.jar
|
|
||||||
|
|
||||||
# Download batik-ttf2svg.jar
|
# Download batik-ttf2svg.jar
|
||||||
RUN wget "https://archive.apache.org/dist/xmlgraphics/batik/batik-1.7.zip"
|
RUN wget "https://archive.apache.org/dist/xmlgraphics/batik/batik-1.7.zip" \
|
||||||
RUN unzip -qq batik-1.7.zip
|
&& unzip batik-*.zip batik-*/batik-ttf2svg.jar \
|
||||||
RUN mv batik-1.7/batik-ttf2svg.jar /usr/share/java/
|
&& mv batik-*/batik-ttf2svg.jar /usr/share/java/ \
|
||||||
|
&& rm -r batik-*
|
||||||
|
|
||||||
# Download and compile ttf2eof (note we add a patch to make it compile)
|
# Download and compile ttf2eof (note we add a patch to make it compile)
|
||||||
RUN wget "https://ttf2eot.googlecode.com/files/ttf2eot-0.0.2-2.tar.gz"
|
RUN wget "https://github.com/wget/ttf2eot/archive/v0.0.2-2.tar.gz" -O ttf2eot.tar.gz\
|
||||||
RUN tar -xzf ttf2eot-0.0.2-2.tar.gz
|
&& tar -xzf ttf2eot.tar.gz \
|
||||||
RUN sed -i "1s/^/#include <cstddef>/" ttf2eot-0.0.2-2/OpenTypeUtilities.h
|
&& sed -i "1s/^/#include <cstddef>/" ttf2eot-*/OpenTypeUtilities.h \
|
||||||
RUN make -C ttf2eot-0.0.2-2/
|
&& make -C ttf2eot-*/ \
|
||||||
RUN mv ttf2eot-0.0.2-2/ttf2eot /usr/bin/
|
&& mv ttf2eot-*/ttf2eot /usr/bin/ \
|
||||||
|
&& rm -r ttf2eot*
|
||||||
|
|
||||||
# Download and compile ttfautohint
|
# Download and compile ttfautohint
|
||||||
RUN wget "http://download.savannah.gnu.org/releases/freetype/ttfautohint-1.3.tar.gz"
|
RUN wget "http://download.savannah.gnu.org/releases/freetype/ttfautohint-1.3.tar.gz" \
|
||||||
RUN tar -xzf ttfautohint-1.3.tar.gz
|
&& tar -xzf ttfautohint-*.tar.gz \
|
||||||
RUN cd ttfautohint-1.3/ && ./configure --without-qt
|
&& cd ttfautohint-*/ \
|
||||||
RUN make -C ttfautohint-1.3/
|
&& ./configure --without-qt \
|
||||||
RUN mv ttfautohint-1.3/frontend/ttfautohint /usr/bin
|
&& make \
|
||||||
|
&& mv frontend/ttfautohint /usr/bin \
|
||||||
|
&& cd .. \
|
||||||
|
&& rm -r ttfautohint-*
|
||||||
|
|
||||||
# Download and compile woff2_compress
|
# Download and compile woff2_compress
|
||||||
RUN git clone "https://code.google.com/p/font-compression-reference/" woff2_compress
|
RUN wget "https://github.com/google/woff2/archive/d9a74803fa884559879e3205cfe6f257a2d85519.tar.gz" -O woff2.tar.gz \
|
||||||
RUN make -C woff2_compress/woff2/
|
&& tar -xzf woff2.tar.gz \
|
||||||
RUN mv woff2_compress/woff2/woff2_compress /usr/bin/
|
&& make -C woff2-*/woff2/ \
|
||||||
|
&& mv woff2-*/woff2/woff2_compress /usr/bin \
|
||||||
# Download and setup MathJax-dev
|
&& rm -r woff2*
|
||||||
RUN git clone "https://github.com/khan/MathJax-dev.git"
|
|
||||||
RUN cp MathJax-dev/default.cfg MathJax-dev/custom.cfg
|
|
||||||
RUN make -C MathJax-dev custom.cfg.pl
|
|
||||||
|
|
||||||
|
@@ -1,55 +1,22 @@
|
|||||||
### How to generate MathJax fonts
|
### How to generate MathJax fonts
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
It's really simple (now)! Just make a docker image from the included Dockerfile
|
The `buildFonts.sh` script should do everything automatically,
|
||||||
using a command like
|
as long as Docker is installed.
|
||||||
|
|
||||||
sudo docker build --tag=mathjaxfonts .
|
If you want to try out a change
|
||||||
|
to [the MathJax-dev repository](https://github.com/Khan/MathJax-dev),
|
||||||
|
create a local clone (or download and unpack the ZIP file)
|
||||||
|
and specify the path to this directory as an arument to `buildFonts.sh`.
|
||||||
|
You can also specify a local or remote tarball,
|
||||||
|
e.g. a GitHub download of your own personal feature branch.
|
||||||
|
|
||||||
from within this directory (note you need to have docker installed and running
|
The script `buildFonts.sh` automatically creates Docker images
|
||||||
for this to work). This will build a docker image with the mathjaxfonts tag,
|
from the supplied `Dockerfile`.
|
||||||
which you can then use to run dockers based on them. Then, run a mathjaxfonts
|
It uses the hash of the file to tag the image, so a change to the file
|
||||||
docker with
|
will result in the creation of a new image.
|
||||||
|
If you want to see all created images, run `docker images katex/fonts`.
|
||||||
|
To remove all generated images, you can run
|
||||||
|
`docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' katex/fonts)`.
|
||||||
|
|
||||||
sudo docker run --interactive --tty --name mjf mathjaxfonts /bin/bash
|
If there is a problem, file a bug report.
|
||||||
|
|
||||||
We name this docker "mjf" so we can reference it later when we want to copy the
|
|
||||||
files off. (If you get an error about the name being in use, perhaps because you
|
|
||||||
are trying to create another docker, you can either delete the old docker with
|
|
||||||
|
|
||||||
sudo docker rm mjf
|
|
||||||
|
|
||||||
or use a different name.) This will get you into the docker in the root
|
|
||||||
directory. From there, cd into the `/MathJax-dev/fonts/OTF/TeX` directory, and
|
|
||||||
run
|
|
||||||
|
|
||||||
make ttf eot woff woff2
|
|
||||||
|
|
||||||
to build all of the fonts that we need. Finally, leave the docker and copy all
|
|
||||||
the files off with the `copy_fonts.sh` script:
|
|
||||||
|
|
||||||
./copy_fonts.sh mjf
|
|
||||||
|
|
||||||
And you're good to go! Don't forget to update the font metrics with `make
|
|
||||||
metrics`.
|
|
||||||
|
|
||||||
### General Docker Help
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
When you quit the docker, it will stop the docker from running. If you want to
|
|
||||||
reattach to the docker, you can start it again with
|
|
||||||
|
|
||||||
sudo docker start mjf
|
|
||||||
|
|
||||||
and then attach with
|
|
||||||
|
|
||||||
sudo docker attach mjf
|
|
||||||
|
|
||||||
Alternatively, if you want to detach from the docker when you're done instead of
|
|
||||||
quitting and stopping it, you can detach with `C-p C-q`, and then re-attach with
|
|
||||||
|
|
||||||
sudo docker attach mjf
|
|
||||||
|
|
||||||
To see a list of your current dockers, you can run
|
|
||||||
|
|
||||||
docker ps
|
|
||||||
|
148
dockers/MathJaxFonts/buildFonts.sh
Executable file
148
dockers/MathJaxFonts/buildFonts.sh
Executable file
@@ -0,0 +1,148 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
shopt -s extglob
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
while [[ $# -gt 1 ]]; do
|
||||||
|
echo "$1" >&2
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
echo "Usage: ${0##*/} [OPTIONS] [SOURCE]"
|
||||||
|
echo ""
|
||||||
|
echo "SOURCE may be"
|
||||||
|
echo " - a URL for a tarball, or"
|
||||||
|
echo " - a local tarball file, or"
|
||||||
|
echo " - a local directory"
|
||||||
|
echo "with a layout compatible to MathJax-dev."
|
||||||
|
echo "It defaults to ${URL}"
|
||||||
|
echo ""
|
||||||
|
echo "OPTIONS:"
|
||||||
|
echo " -h|--help display this help"
|
||||||
|
echo " --image NAME:TAG use the named docker image [$IMAGE]"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
used_fonts=(
|
||||||
|
KaTeX_AMS-Regular
|
||||||
|
KaTeX_Caligraphic-Bold
|
||||||
|
KaTeX_Caligraphic-Regular
|
||||||
|
KaTeX_Fraktur-Bold
|
||||||
|
KaTeX_Fraktur-Regular
|
||||||
|
KaTeX_Main-Bold
|
||||||
|
KaTeX_Main-Italic
|
||||||
|
KaTeX_Main-Regular
|
||||||
|
KaTeX_Math-BoldItalic
|
||||||
|
KaTeX_Math-Italic
|
||||||
|
KaTeX_Math-Regular
|
||||||
|
KaTeX_SansSerif-Bold
|
||||||
|
KaTeX_SansSerif-Italic
|
||||||
|
KaTeX_SansSerif-Regular
|
||||||
|
KaTeX_Script-Regular
|
||||||
|
KaTeX_Size1-Regular
|
||||||
|
KaTeX_Size2-Regular
|
||||||
|
KaTeX_Size3-Regular
|
||||||
|
KaTeX_Size4-Regular
|
||||||
|
KaTeX_Typewriter-Regular
|
||||||
|
)
|
||||||
|
|
||||||
|
filetypes=( ttf eot woff woff2 )
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
[[ "${CONTAINER}" ]] \
|
||||||
|
&& docker stop "${CONTAINER}" >/dev/null \
|
||||||
|
&& docker rm "${CONTAINER}" >/dev/null
|
||||||
|
CONTAINER=
|
||||||
|
[[ -f "${TMPFILE}" ]] && rm "${TMPFILE}"
|
||||||
|
TMPFILE=
|
||||||
|
}
|
||||||
|
CONTAINER=
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
IMAGE="katex/fonts:DF-$(openssl sha1 Dockerfile | tail -c 9)"
|
||||||
|
URL=https://github.com/Khan/MathJax-dev/archive/master.tar.gz
|
||||||
|
TMPFILE=
|
||||||
|
FILE=
|
||||||
|
NARGS=0
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case "$1" in
|
||||||
|
-h|--help)
|
||||||
|
usage 0
|
||||||
|
;;
|
||||||
|
--image=*)
|
||||||
|
IMAGE="${1#*=}"
|
||||||
|
;;
|
||||||
|
--image)
|
||||||
|
shift
|
||||||
|
IMAGE="$1"
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
usage "Invalid option: $1" "" 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
case $NARGS in
|
||||||
|
0)
|
||||||
|
if [[ -d "$1" ]]; then
|
||||||
|
TMPFILE="$(mktemp "${TMPDIR:-/tmp}/mjf.XXXXXXXX")"
|
||||||
|
FILE="$TMPFILE"
|
||||||
|
pushd "$1"
|
||||||
|
if [[ ! -f fonts/OTF/TeX/Makefile ]]; then
|
||||||
|
echo "$1 does not look like MathJax-dev" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
tar cf "$FILE" Makefile default.cfg fonts/OTF/TeX
|
||||||
|
popd
|
||||||
|
elif [[ -f "$1" ]]; then
|
||||||
|
FILE="$1"
|
||||||
|
elif [[ "$1" = http?(s)://* ]]; then
|
||||||
|
URL="$1"
|
||||||
|
else
|
||||||
|
echo "'$1' is not a valid source" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
NARGS=1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage "Too many arguments: $1" "" 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# build image if missing
|
||||||
|
if [[ $(docker images "$IMAGE" | wc -l) -lt 2 ]]; then
|
||||||
|
echo "Need to build docker image $IMAGE"
|
||||||
|
docker build --tag "$IMAGE" .
|
||||||
|
fi
|
||||||
|
|
||||||
|
CMDS="set -ex
|
||||||
|
test -f MathJax-dev.tar.gz || wget -O MathJax-dev.tar.gz '${URL}'
|
||||||
|
mk=\$(tar tf MathJax-dev.tar.gz | grep 'fonts/OTF/TeX/Makefile\$')
|
||||||
|
tar xf MathJax-dev.tar.gz
|
||||||
|
cd \"\${mk%fonts/*}\"
|
||||||
|
cp default.cfg custom.cfg
|
||||||
|
make custom.cfg.pl
|
||||||
|
make -C fonts/OTF/TeX ${filetypes[*]}
|
||||||
|
tar cf /fonts.tar ${filetypes[*]/#/fonts/OTF/TeX/}"
|
||||||
|
|
||||||
|
echo "Creating and starting docker container from image $IMAGE"
|
||||||
|
CONTAINER=$(docker create "$IMAGE" /bin/sh -c "${CMDS}")
|
||||||
|
if [[ ${FILE} ]]; then
|
||||||
|
docker cp "${FILE}" $CONTAINER:/MathJax-dev.tar.gz
|
||||||
|
fi
|
||||||
|
docker start --attach $CONTAINER
|
||||||
|
docker cp $CONTAINER:/fonts.tar .
|
||||||
|
cleanup
|
||||||
|
echo "Docker executed successfully, will now unpack the fonts"
|
||||||
|
|
||||||
|
tar xf fonts.tar
|
||||||
|
for filetype in "${filetypes[@]}"; do
|
||||||
|
for font in "${used_fonts[@]}"; do
|
||||||
|
echo "$filetype/$font"
|
||||||
|
mv "fonts/OTF/TeX/$filetype/$font".* ../../static/fonts/
|
||||||
|
done
|
||||||
|
done
|
||||||
|
rm -rf fonts fonts.tar
|
@@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Usage: $(basename $0) <docker name>"
|
|
||||||
echo " If you followed the README, the docker name would be 'mjf'"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
DOCKER_NAME="$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir fonts
|
|
||||||
|
|
||||||
used_fonts=(
|
|
||||||
KaTeX_AMS-Regular
|
|
||||||
KaTeX_Caligraphic-Bold
|
|
||||||
KaTeX_Caligraphic-Regular
|
|
||||||
KaTeX_Fraktur-Bold
|
|
||||||
KaTeX_Fraktur-Regular
|
|
||||||
KaTeX_Main-Bold
|
|
||||||
KaTeX_Main-Italic
|
|
||||||
KaTeX_Main-Regular
|
|
||||||
KaTeX_Math-BoldItalic
|
|
||||||
KaTeX_Math-Italic
|
|
||||||
KaTeX_Math-Regular
|
|
||||||
KaTeX_SansSerif-Bold
|
|
||||||
KaTeX_SansSerif-Italic
|
|
||||||
KaTeX_SansSerif-Regular
|
|
||||||
KaTeX_Script-Regular
|
|
||||||
KaTeX_Size1-Regular
|
|
||||||
KaTeX_Size2-Regular
|
|
||||||
KaTeX_Size3-Regular
|
|
||||||
KaTeX_Size4-Regular
|
|
||||||
KaTeX_Typewriter-Regular
|
|
||||||
)
|
|
||||||
|
|
||||||
for filetype in ttf eot woff woff2; do
|
|
||||||
echo "Copying $filetype"
|
|
||||||
docker cp "$DOCKER_NAME":/MathJax-dev/fonts/OTF/TeX/"$filetype" fonts
|
|
||||||
|
|
||||||
for font in ${used_fonts[*]}; do
|
|
||||||
mv fonts/"$filetype"/"$font"* fonts/
|
|
||||||
done
|
|
||||||
|
|
||||||
rm -rf fonts/"$filetype"
|
|
||||||
done
|
|
Reference in New Issue
Block a user