scribble-math/mathjax-dev/fonts/Tables/TeX/makeTable
2010-08-02 17:46:41 +00:00

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.'">&nbsp;</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">&nbsp;</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>&nbsp;',
'<SPAN CLASS="tt">&lt;</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">&gt;</SPAN>&nbsp;',
'<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;