scribble-mathjax/mathjax-dev/MML-entities/makeEntities

91 lines
3.7 KiB
Perl
Executable File

#! /usr/bin/perl
# Create the data.js file of common entity names
# plus the entities directory of less-common ones
#
# Usage: ./makeEntities
open(MATHJAX,"MJ-Unicode-TeX.txt");
while ($line = <MATHJAX>) {$MJ{substr($line,2,4)} = 1}
close(MATHJAX);
foreach $code (
'02C6', '02C7', '02C9', '02CA', '02CB', '02CD', '02CE', '02CF',
'02D8', '02D9', '02DA', '02DC', '0331', '0332', '203E',
'2329', '232A', 'FE37', 'FE38',
'002D', '005E', '005F', '007E',
'00A8', '00AF', '00B0', '00B4', '00B7',
'02B9', '2022',
'25AA', '25B4', '25B5', '25BE', '25Bf', '25C2', '2A2F',
'2061', '2062', '2063', '2064',
'2146', '2147', '2148',
) {$MJ{$code} = 1}
open(UNICODE,"MML-Unicode-List.txt");
while ($line = <UNICODE>) {
chomp($line); next unless $line =~ m/\S/;
($entity,$code,$code2,$name) = ($line =~ m/(.*), *U0?([0-9A-F]+)(?:-0([0-9A-F]+))?, (.*)/);
if (length($code) == 5 || $entity =~ m/^[a-zA-Z0-9](fr|opf|scr)$/) {
$font = substr($entity,1);
if (length($code) == 5) {$code = "D835\\u".sprintf("%04X",hex($code)-0x1D400+0xDC00)}
$range{$font}{$entity} = $code;
} elsif ($MJ{$code} && !$code2 && $MJcode{$code} &&
$entity =~ m/^[A-Z]/ && $entity !~ m/Diacritical|Short|Lower|Upper/) {
$range{lc(substr($MJcode{$code},0,1))}{$MJcode{$code}} = $code;
delete $range{main}{$MJcode{$code}};
$range{main}{$entity} = $code;
$MJcode{$code} = $entity;
} elsif ($MJ{$code} && !$code2 && !$MJcode{$code} && $entity !~ m/Diacritical|Lower|Upper/) {
$range{main}{$entity} = $code;
$MJcode{$code} = $entity;
} else {
$code .= "\\u$code2" if $code2;
$range{lc(substr($entity,0,1))}{$entity} = $code;
}
}
close(UNICODE);
mkdir "entities" unless -d "entities";
foreach $name (sort(keys %range)) {
next if $name eq "";
print "$name...";
if ($name eq "main") {
open(JSFILE,">data.js") || die "Can't write data.js";
print JSFILE " MATHML.Parse.Entity = {\n";
print JSFILE " ",join(",\n ",map {"$_: '\\u$range{$name}{$_}'"} sort(keys(%{$range{$name}}))),"\n";
print JSFILE " }\n";
close(JSFILE);
} else {
open(JSFILE,">entities/$name.js") || die "Can't write entitied/$name.js";
print JSFILE "/*************************************************************\n";
print JSFILE " *\n";
print JSFILE " * MathJax/jax/output/HTML-CSS/entities/$name.js\n";
print JSFILE " *\n";
print JSFILE " * Copyright (c) 2010 Design Science, Inc.\n";
print JSFILE " *\n";
print JSFILE " * Licensed under the Apache License, Version 2.0 (the \"License\");\n";
print JSFILE " * you may not use this file except in compliance with the License.\n";
print JSFILE " * You may obtain a copy of the License at\n";
print JSFILE " *\n";
print JSFILE " * http://www.apache.org/licenses/LICENSE-2.0\n";
print JSFILE " *\n";
print JSFILE " * Unless required by applicable law or agreed to in writing, software\n";
print JSFILE " * distributed under the License is distributed on an \"AS IS\" BASIS,\n";
print JSFILE " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n";
print JSFILE " * See the License for the specific language governing permissions and\n";
print JSFILE " * limitations under the License.\n";
print JSFILE " *\n";
print JSFILE " */\n\n";
print JSFILE "(function (MATHML) {\n";
print JSFILE " MathJax.Hub.Insert(MATHML.Parse.Entity,{\n";
print JSFILE " ",join(",\n ",map {"'$_': '\\u$range{$name}{$_}'"} sort(keys(%{$range{$name}}))),"\n";
print JSFILE " });\n\n";
print JSFILE " MathJax.Ajax.loadComplete(MATHML.entityDir+\"/$name.js\");\n\n";
print JSFILE "})(MathJax.InputJax.MathML);\n";
close(JSFILE);
}
print "\n";
}