
git-svn-id: https://mathjax.svn.sourceforge.net/svnroot/mathjax/trunk@546 b8fd5906-0fad-46e2-a0d3-10d94ff285d1
409 lines
14 KiB
Perl
Executable File
409 lines
14 KiB
Perl
Executable File
#! /usr/bin/perl
|
|
|
|
# Makes a collection of font sample pages for the MathJax fonts
|
|
#
|
|
# Usage: ./makeTable
|
|
|
|
%fonts = (
|
|
'MathJax_Main' => "font-family: MathJax_Main;",
|
|
'MathJax_Main-Bold' => "font-family: MathJax_Main; font-weight:bold;",
|
|
'MathJax_Main-Italic' => "font-family: MathJax_Main; font-style:italic;",
|
|
'MathJax_Math-Italic' => "font-family: MathJax_Math; font-style:italic;",
|
|
'MathJax_Math-Bold-Italic' => "font-family: MathJax_Math; font-style:italic; font-weight:bold",
|
|
'MathJax_Size1' => "font-family: MathJax_Size1;",
|
|
'MathJax_Size2' => "font-family: MathJax_Size2;",
|
|
'MathJax_Size3' => "font-family: MathJax_Size3;",
|
|
'MathJax_Size4' => "font-family: MathJax_Size4;",
|
|
'MathJax_Caligraphic' => "font-family: MathJax_Caligraphic;",
|
|
'MathJax_Caligraphic-Bold' => "font-family: MathJax_Caligraphic; font-weight:bold;",
|
|
'MathJax_Greek' => "font-family: MathJax_Greek;",
|
|
'MathJax_Greek-Bold' => "font-family: MathJax_Greek; font-weight:bold",
|
|
'MathJax_Greek-Italic' => "font-family: MathJax_Greek; font-style:italic",
|
|
'MathJax_Greek-Bold-Italic' => "font-family: MathJax_Greek; font-style:italic; font-weight:bold",
|
|
'MathJax_WinChrome' => "font-family: MathJax_WinChrome;",
|
|
'MathJax_WinIE6' => "font-family: MathJax_WinIE6;",
|
|
'MathJax_AMS' => "font-family: MathJax_AMS;",
|
|
'MathJax_Fraktur' => "font-family: MathJax_Fraktur;",
|
|
'MathJax_Fraktur-Bold' => "font-family: MathJax_Fraktur; font-weight:bold",
|
|
'MathJax_SansSerif' => "font-family: MathJax_SansSerif;",
|
|
'MathJax_SansSerif-Bold' => "font-family: MathJax_SansSerif; font-weight:bold",
|
|
'MathJax_SansSerif-Italic' => "font-family: MathJax_SansSerif; font-style:italic",
|
|
'MathJax_Script' => "font-family: MathJax_Script;",
|
|
'MathJax_Typewriter' => "font-family: MathJax_Typewriter;",
|
|
);
|
|
|
|
require "unicode.pl";
|
|
|
|
sub byName {
|
|
my ($A,$B) = ($a,$b);
|
|
$A =~ s/Greek/V2_Greek/; $B =~ s/Greek/V2_Greek/;
|
|
$A =~ s/_(AMS|Caligraphic|Fraktur|Script|SansSerif|Typewriter)/_V1_\1/;
|
|
$B =~ s/_(AMS|Caligraphic|Fraktur|Script|SansSerif|Typewriter)/_V1_\1/;
|
|
$A =~ s/-Bold-/-XBold-/; $B =~ s/-Bold-/-XBold-/;
|
|
return $A cmp $B;
|
|
}
|
|
|
|
@fonts = sort byName (keys %fonts);
|
|
|
|
sub GetTableData {
|
|
foreach $font (split(/\n/,`find -L ../../AFM/TeX/fonts -name "*.js"`)) {GetFileData($font)}
|
|
CountRangeEntries();
|
|
}
|
|
|
|
sub GetFileData {
|
|
my $file = shift;
|
|
open(INFILE,$file);
|
|
my @lines = <INFILE>;
|
|
close(INFILE);
|
|
chomp(@lines);
|
|
FindChars(@lines);
|
|
}
|
|
|
|
sub FindChars {
|
|
my $font = ""; my $char;
|
|
foreach my $line (@_) {
|
|
if ($line =~ m/FONTDATA.FONTS\['([^']*)'\]/) {
|
|
$font = $1; $font =~ s/bold/Bold/; $font =~ s/italic/Italic/;
|
|
} elsif ($font ne "MathJax_Math" && $line =~ m/^ +0x([A-F0-9]*):/) {
|
|
$char = sprintf("%05X",hex($1));
|
|
$CHAR{$char}{$font} = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
sub CountRangeEntries {
|
|
foreach my $range (@ranges) {
|
|
my ($name,$start,$end) = @{$range};
|
|
my $N = 0;
|
|
foreach my $font (@fonts) {
|
|
my $n = 0;
|
|
foreach $c ($start..$end) {
|
|
my $C = sprintf("%05X",$c);
|
|
$n++ if $CHAR{$C} && $CHAR{$C}{$font};
|
|
}
|
|
$N += $n unless $font =~ m/Greek|_Win/;
|
|
$count{$font} += $n;
|
|
$frcount{$font}{$name} = $n;
|
|
$frcount{$font}{MathJax_All} += $n unless $font =~ m/Greek|_Win/;
|
|
}
|
|
$count{MathJax_All} += $N;
|
|
$frcount{MathJax_All}{$name} = $N;
|
|
}
|
|
}
|
|
|
|
sub MakeHeader {
|
|
my $FONT = shift; my $range = (shift) || "";
|
|
@HEADER = (
|
|
'<HTML>',
|
|
'<HEAD>',
|
|
'<TITLE>MathJax Font Table for '.($FONT || "All Fonts").$range.'</TITLE>',
|
|
'<STYLE TYPE="text/css">',
|
|
' .header {font-weight: bold; padding: 3px}',
|
|
' .space {width: 2px}',
|
|
' .blank {padding: 10}',
|
|
' .label {padding: 5; font-family: monospace; text-align: right; font-size: 80%}',
|
|
' .NA {padding: 10; background: white; border: solid #F4F4F4 1px}',
|
|
' .other {padding: 10; background: #CCCCCC}',
|
|
' .hidden {visibility: hidden}',
|
|
' .MJAX {padding: 10; font-size: 133%; background: #F0F0F0}',
|
|
($FONT ?
|
|
' .'.$FONT.' {'.$fonts{$FONT}.'}' :
|
|
(map {' .'.$_.' {'.$fonts{$_}.'}'} @fonts)
|
|
),
|
|
' .caption TD {font-family: monospace; font-size: 80%; text-align: center}',
|
|
' .small {font-size: 80%; vertical-align: .15em}',
|
|
' .tt {font-family: monospace; margin: 0px -.125em}',
|
|
' A {text-decoration: none}',
|
|
' .navigation {position: fixed; top:5; right:0; width:auto}',
|
|
' .combine {font-family: MathJax_Main}',
|
|
' @media print {.navigation {display: none}}',
|
|
'</STYLE>',
|
|
'</HEAD>',
|
|
'<BODY>',
|
|
'<BR>',
|
|
'<CENTER>',
|
|
'<H1>'.($FONT || "MathJax Font").' Character Tables</H1>',
|
|
);
|
|
}
|
|
|
|
@FOOTER = (
|
|
'</CENTER>',
|
|
'</BODY>',
|
|
'</HTML>',
|
|
);
|
|
|
|
@TABLEstart = (
|
|
'<TABLE BORDER="0" CELLSPACING="2" CELLPADDING="0">',
|
|
'',
|
|
'<TR ALIGN="CENTER"><TD CLASS="blank"></TD><TD CLASS="space"></TD><TD CLASS="header" COLSPAN="17">',
|
|
);
|
|
@TABLEhead = (
|
|
'</TR>',
|
|
'',
|
|
'<TR CLASS="caption">',
|
|
'<TD CLASS="blank"></TD>',
|
|
'<TD CLASS="space"></TD>',
|
|
'<TD>0</TD><TD>1</TD><TD>2</TD><TD>3</TD><TD>4</TD><TD>5</TD><TD>6</TD><TD>7</TD>',
|
|
'<TD CLASS="space"></TD>',
|
|
'<TD>8</TD><TD>9</TD><TD>A</TD><TD>B</TD><TD>C</TD><TD>D</TD><TD>E</TD><TD>F</TD>',
|
|
'</TR>',
|
|
);
|
|
@TABLEfoot = (
|
|
'</TABLE>',
|
|
'<p>'
|
|
);
|
|
|
|
@ROWstart = ('<TR ALIGN="CENTER">');
|
|
@ROWend = ('</TR>');
|
|
|
|
sub PrintTOC {
|
|
mkdir "TeX" unless -d "TeX";
|
|
open(HTML,">TeX/index.html");
|
|
PrintHTML(
|
|
'<HTML>',
|
|
'<HEAD>',
|
|
'<TITLE>MathJax Fonts Unicode Block Table of Contents</TITLE>',
|
|
'<STYLE TYPE="text/css">',
|
|
' .tlabel {background: #CCCCCC; text-align: center; font-size: 80%; padding:1px 2px}',
|
|
' .llabel {text-align: right}',
|
|
' .space {width: 2px}',
|
|
' .hspace {height: 2px}',
|
|
' .blank {}',
|
|
' .count {background: #F0F0F0; padding: 3px}',
|
|
' .tcount {background: #E4E4E4; padding: 3px}',
|
|
' .bold {font-weight: bold}',
|
|
' .italic {font-style: italic}',
|
|
' A {text-decoration: none}',
|
|
'</STYLE>',
|
|
'</HEAD>',
|
|
'<BODY>',
|
|
'<CENTER>',
|
|
'<TABLE BORDER="0" CELLSPACING="2" CELLPADDING="0">',
|
|
'<TR ALIGN="CENTER"><TD></TD><TD></TD><TD COLSPAN="35">',
|
|
'<H1>MathJax Fonts Unicode Block<BR>Table of Contents</H1>',
|
|
'</TD></TR>',
|
|
);
|
|
|
|
my @names = ('Main','Math','Size<I>n</I>','AMS','Cal',"Frak","SS","Scr","Type",'Greek','Chr','IE6','All');
|
|
my @rows = (1,1,1,1,1,1,1,1,1,1,1,1,2); my @columns = (3,2,4,1,2,2,3,1,1,4,1,1,1);
|
|
my $rows = scalar(@ranges) + 5;
|
|
|
|
print HTML "<TR>\n";
|
|
print HTML '<TD CLASS="blank" ROWSPAN="3"></TD>',"\n";
|
|
foreach my $i (0..$#names) {
|
|
print HTML '<TD CLASS="space" ROWSPAN="',$rows,'"></TD>',"\n" if $rows[$i];
|
|
print HTML '<TD CLASS="tlabel"',
|
|
($rows[$i] > 1 ? ' ROWSPAN="'.$rows[$i].'"' : ''),
|
|
($columns[$i] > 1 ? ' COLSPAN="'.$columns[$i].'"' : ''),
|
|
'>',$names[$i],'</TD>',"\n";
|
|
}
|
|
print HTML "</TR>\n";
|
|
|
|
print HTML "<TR>\n";
|
|
foreach my $name ('','B','I', 'I','BI', '1','2','3','4', '', '','B', '','B', '','B','I',
|
|
'', '','B','I','BI', '', '', '') {
|
|
print HTML '<TD CLASS="tlabel',
|
|
($name =~ m/B/ ? ' bold' : ''),
|
|
($name =~ m/I/ ? ' italic' : ''),'">',$name,'</TD>',"\n";
|
|
}
|
|
print HTML "</TR>\n";
|
|
|
|
print HTML '<TR><TD CLASS="hspace"></TD></TR>',"\n";
|
|
|
|
foreach my $range (@ranges) {
|
|
my ($name,$start,$end) = @{$range};
|
|
next unless $frcount{MathJax_All}{$name};
|
|
my $file = sprintf("/%04X-%04X.html",$start,$end);
|
|
print HTML '<TR ALIGN="RIGHT">',"\n";
|
|
print HTML '<TD CLASS="llabel">',$name,'</TD>',"\n";
|
|
foreach my $font (@fonts) {
|
|
print HTML '<TD CLASS="count">',
|
|
($frcount{$font}{$name} ? '<A HREF="'.substr($font,8).$file.'">'.$frcount{$font}{$name}.'</A>' : ''),
|
|
'</TD>',"\n";
|
|
}
|
|
print HTML '<TD CLASS="tcount"><A HREF="All',$file,'">',$frcount{MathJax_All}{$name},'</A></TD>';
|
|
print HTML "</TR>\n";
|
|
}
|
|
|
|
print HTML '<TR><TD CLASS="hspace"></TD></TR>',"\n";
|
|
print HTML '<TR ALIGN="RIGHT">',"\n";
|
|
print HTML '<TD CLASS="llabel">All</TD>',"\n";
|
|
foreach my $font (@fonts,"MathJax_All") {
|
|
print HTML '<TD CLASS="tcount"><A HREF="',substr($font,8),'/All.html">',$count{$font},'</A></TD>',"\n"
|
|
}
|
|
print HTML "</TR>\n";
|
|
|
|
PrintHTML(
|
|
'</CENTER>',
|
|
'</BODY>',
|
|
'</HTML>',
|
|
);
|
|
|
|
close(HTML);
|
|
}
|
|
|
|
sub PrintFullTable {
|
|
my $i = shift; my $FONT = ($i ne '' ? $fonts[$i] : '');
|
|
my $dir = "TeX/".(substr($FONT,8) || "All");
|
|
my $file = "$dir/All.html";
|
|
mkdir "TeX" unless -d "TeX";
|
|
mkdir $dir unless -d $dir;
|
|
open(HTML,">",$file);
|
|
MakeHeader($FONT);
|
|
PrintHTML(@HEADER);
|
|
foreach my $j (0..$#ranges) {PrintRange($i,$j)}
|
|
PrintNavigation($i,'');
|
|
PrintHTML(@FOOTER);
|
|
close(HTML);
|
|
}
|
|
|
|
sub PrintRangeTable {
|
|
my $i = shift; my $j = shift;
|
|
my $FONT = ($i ne '' ? $fonts[$i] : '');
|
|
my ($name,$start,$end) = @{$ranges[$j]};
|
|
return if $frcount{($i eq '' ? "MathJax_All" : $FONT)}{$name} == 0;
|
|
my $chars = sprintf("%04X-%04X",$start,$end);
|
|
my $dir = "TeX/".($FONT ? substr($FONT,8) : "All");
|
|
my $file = "$dir/$chars.html";
|
|
mkdir "TeX" unless -d "TeX";
|
|
mkdir $dir unless -d $dir;
|
|
open(HTML,">",$file);
|
|
MakeHeader($FONT," ($chars)");
|
|
PrintHTML(@HEADER);
|
|
PrintRange($i,$j);
|
|
PrintNavigation($i,$j);
|
|
PrintHTML(@FOOTER);
|
|
close(HTML);
|
|
}
|
|
|
|
sub PrintRange {
|
|
my $i = shift; my $j = shift;
|
|
my $FONT = ($i ne '' ? $fonts[$i] : '');
|
|
my ($name,$start,$end) = @{$ranges[$j]};
|
|
return if $frcount{($i eq '' ? "MathJax_All" : $FONT)}{$name} == 0;
|
|
PrintHTML(@TABLEstart);
|
|
print HTML sprintf("%s: %04X - %04X",$name,$start,$end);
|
|
PrintHTML(@TABLEhead);
|
|
while ($start < $end && !defined($CHAR{sprintf("%05X",$start)})) {$start++}
|
|
while ($end > $start && !defined($CHAR{sprintf("%05X",$end)})) {$end--}
|
|
foreach my $row (int($start/0x10)..int($end/0x10))
|
|
{PrintRow($FONT,$row,(($name =~ m/Combining/i) ? 'a' : ''))}
|
|
PrintHTML(@TABLEfoot);
|
|
}
|
|
|
|
sub PrintRow {
|
|
my $FONT = shift; my $row = shift;
|
|
my $combine = shift; my $COMBINE = $combine;
|
|
$combine = '<SPAN CLASS="combine">'.$combine.'</SPAN>' if $combine && $FONT =~ /Size|_AMS/;
|
|
my $r = sprintf("%03X",$row); $row *= 0x10;
|
|
PrintHTML(@ROWstart);
|
|
print HTML '<TD CLASS="label">'.$r.'</TD><TD CLASS="space""></TD>',"\n";
|
|
foreach my $i (0x00..0x0F) {
|
|
my $c = sprintf("%05X",$row+$i);
|
|
if (defined($CHAR{$c})) {
|
|
my $title = $CHARNAME{$c}." (".sprintf("0x%X",$row+$i).")";
|
|
if ($FONT) {
|
|
if ($CHAR{$c}{$FONT}) {
|
|
print HTML '<TD CLASS="MJAX '.$FONT.'" TITLE="'.$title.'">'.$combine.'&#x'.$c.';'.$combine.'</TD>'."\n";
|
|
} else {
|
|
print HTML '<TD CLASS="other" TITLE="'.$title.'"> </TD>'."\n";
|
|
}
|
|
} else {
|
|
print HTML '<TD CLASS="MJAX" VALIGN="TOP">';
|
|
foreach my $font (sort byName (keys %{$CHAR{$c}})) {
|
|
next if $font =~ m/Greek|_Win/; $combine = $COMBINE;
|
|
$combine = '<SPAN CLASS="combine">'.$COMBINE.'</SPAN>' if $COMBINE && $font =~ /Size|_AMS/;
|
|
print HTML '<SPAN CLASS="'.$font.'" TITLE="'.$title." ".$font.'">'.
|
|
$combine.'&#x'.$c.';'.$combine.'</SPAN><BR>';
|
|
}
|
|
print HTML '</TD>'."\n";
|
|
}
|
|
} else {
|
|
print HTML '<TD CLASS="NA"> </TD>'."\n";
|
|
}
|
|
print HTML '<TD CLASS="space"></TD>'."\n" if $i == 7;
|
|
}
|
|
PrintHTML(@ROWend);
|
|
}
|
|
|
|
sub PrintNavigation {
|
|
my $i = shift; my $j = shift;
|
|
my $FONT = ($i ne '' ? $fonts[$i] : 'MathJax_All');
|
|
my ($name,$start,$end) = ($j ne '' ? @{$ranges[$j]} : ('MathJax_All',0,0));
|
|
my ($pfont,$nfont,$prange,$nrange);
|
|
my ($pi,$ni,$pj,$nj);
|
|
|
|
if ($i ne "") {
|
|
($pi,$ni) = ($i-1,$i+1); ($pfont,$nfont) = ($fonts[$pi],$fonts[$ni]);
|
|
while ($j && $ni <= $#fonts && $frcount{$nfont}{$name} == 0) {$nfont = $fonts[++$ni]}
|
|
} else {
|
|
$pi = $#fonts; $pfont = $fonts[$#fonts]; $ni = 0; $nfont = "";
|
|
}
|
|
while ($j && $pi >= 0 && $frcount{$pfont}{$name} == 0) {$pfont = $fonts[--$pi]}
|
|
$pfont = "" if $pi < 0; $nfont = "MathJAx_All" if $ni > $#fonts;
|
|
$pfont = substr($pfont,8); $nfont = substr($nfont,8);
|
|
my $pfurl = "../".$pfont.($j ne '' ? sprintf("/%04X-%04X.html",$start,$end) : '/All.html');
|
|
my $nfurl = "../".$nfont.($j ne '' ? sprintf("/%04X-%04X.html",$start,$end) : '/All.html');
|
|
|
|
if ($j ne "") {
|
|
($pj,$nj) = ($j-1,$j+1); ($prange,$nrange) = ($ranges[$pj],$ranges[$nj]);
|
|
while ($nj <= $#ranges && $frcount{$FONT}{$nrange->[0]} == 0) {$nrange = $ranges[++$nj]}
|
|
} else {
|
|
$pj = $#ranges; $prange = $ranges[$pj]; $nj = 0; $nrange = ['',0,0];
|
|
}
|
|
while ($pj >= 0 && $frcount{$FONT}{$prange->[0]} == 0) {$prange = $ranges[--$pj]}
|
|
$prange = ['',0,0] if $pj < 0; $nrange = ['All',0,0] if $nj > $#ranges;
|
|
my $prurl = sprintf("%04X-%04X.html",$prange->[1],$prange->[2]);
|
|
my $nrurl = ($nrange->[2] ? sprintf("%04X-%04X.html",$nrange->[1],$nrange->[2]) : "All.html");
|
|
|
|
PrintHTML(
|
|
'<DIV CLASS="navigation">',
|
|
'<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0" STYLE="width:25.75em">',
|
|
'<TR>',
|
|
'<TD COLSPAN="3" ALIGN="CENTER">',
|
|
($prange->[0] ?
|
|
('<A CLASS="small" HREF="'.$prurl.'">'.$prange->[0].'</A><BR>'.
|
|
'<SPAN CLASS="tt">/</SPAN><SPAN CLASS="tt">\</SPAN>') : '..'),
|
|
|
|
'</TD>', '</TR>', '<TR>',
|
|
'<TD STYLE="width:12em" ALIGN="RIGHT">',
|
|
($pfont ?
|
|
('<A CLASS="small" HREF="'.$pfurl.'">'.$pfont.'</A> ',
|
|
'<SPAN CLASS="tt"><</SPAN>') : ':'),
|
|
'</TD>',
|
|
'<TD STYLE="width:1.75em" ALIGN="CENTER"><A HREF="../index.html">O</A></TD>',
|
|
'<TD STYLE="width:12em" ALIGN="LEFT">',
|
|
($nfont ?
|
|
('<SPAN CLASS="tt">></SPAN> ',
|
|
'<A CLASS="small" HREF="'.$nfurl.'">'.$nfont.'</A>') : ':'),
|
|
'</TD>', '</TR>', '<TR>',
|
|
'<TD COLSPAN="3" ALIGN="CENTER">',
|
|
($nrange->[0] ?
|
|
('<SPAN CLASS="tt">\</SPAN><SPAN CLASS="tt">/</SPAN><BR>'.
|
|
'<A CLASS="small" HREF="'.$nrurl.'">'.$nrange->[0].'</A>') :
|
|
'<SPAN STYLE="position:relative"><SPAN STYLE="position:relative; top:-.5em">..</SPAN></SPAN>'),
|
|
'</TD>', '</TR>',
|
|
'</TABLE>',
|
|
'</DIV>',
|
|
);
|
|
}
|
|
|
|
sub PrintHTML {
|
|
print HTML join("\n",@_),"\n";
|
|
}
|
|
|
|
sub PrintAllTables {
|
|
foreach my $font (0..$#fonts) {
|
|
foreach my $range (0..$#ranges) {PrintRangeTable($font,$range)}
|
|
PrintFullTable($font);
|
|
}
|
|
foreach my $range (0..$#ranges) {PrintRangeTable('',$range)}
|
|
PrintFullTable('');
|
|
}
|
|
|
|
GetTableData();
|
|
PrintTOC();
|
|
PrintAllTables();
|
|
|
|
1;
|