123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
- /* vim: set ts=2 et sw=2 tw=80: */
- /*************************************************************
- *
- * MathJax/jax/output/HTML-CSS/imageFonts.js
- *
- * Implements the image fallback fonts for the HTML-CSS OutputJax.
- *
- * ---------------------------------------------------------------------
- *
- * Copyright (c) 2009-2013 The MathJax Consortium
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- (function (HUB,HTMLCSS,AJAX) {
- var VERSION = "2.2";
-
- HUB.Register.LoadHook(HTMLCSS.fontDir + "/fontdata.js",function () {
- HTMLCSS.Augment({
- allowWebFonts: false,
-
- imgDir: HTMLCSS.webfontDir+"/png",
- imgPacked: (MathJax.isPacked ? "" : "/unpacked"),
- imgSize: ['050','060','071','085',100,120,141,168,200,238,283,336,400,476],
- imgBaseIndex: 4, // set by initImg()
- imgSizeForEm: {}, // cache of indexes by em-size
- imgSizeForScale: {}, // cache of indexes by scale for a given em-size
- imgZoom: 1, // set by initImg for each equation
- handleImg: function (span,font,c,n,text) {
- if (text.length) {this.addText(span,text)}
- var orig = c[5].orig; if (!orig) {orig = c[5].orig = [c[0],c[1],c[2],c[3],c[4]]}
- var bscale = this.imgZoom; if (!span.scale) {span.scale = 1}
- var index = this.imgIndex(span.scale*bscale);
- if (index == this.imgEmWidth.length-1 &&
- this.em*span.scale*bscale/this.imgEmWidth[index] > 1.1)
- {bscale = this.imgEmWidth[index]/(this.em*span.scale)}
- var factor = this.imgEmWidth[index]/(this.em*(span.scale||1)*bscale);
- c[0] = orig[0]*factor; c[1] = orig[1]*factor; c[2] = orig[2]*factor;
- c[3] = orig[3]*factor; c[4] = orig[4]*factor;
- var dir = this.imgDir+"/"+font.directory+"/"+this.imgSize[index];
- var chr = n.toString(16).toUpperCase(); while (chr.length < 4) {chr = "0"+chr};
- var file = dir+"/"+chr+".png";
- var img = c[5].img[index];
- var style = {width:Math.floor(img[0]/bscale+.5)+"px", height:Math.floor(img[1]/bscale+.5)+"px"};
- if (img[2]) {style.verticalAlign = Math.floor(-img[2]/bscale+.5)+"px"}
- if (c[3] < 0) {style.marginLeft = this.Em(c[3]/1000)}
- if (c[4] != c[2]) {style.marginRight = this.Em((c[2]-c[4])/1000)}
- if (this.msieIE6) {
- style.filter = "progid:DXImageTransform.Microsoft." +
- "AlphaImageLoader(src='"+AJAX.fileURL(file)+"', sizingMethod='scale')";
- file = this.directory+"/blank.gif"
- }
- this.addElement(span,"img",{src:AJAX.fileURL(file), style:style, isMathJax:true});
- return "";
- },
-
- defineImageData: function (def) {
- for (var font in def) {if (def.hasOwnProperty(font)) {
- var FONT = HTMLCSS.FONTDATA.FONTS[font];
- if (FONT) {
- font = def[font];
- for (var n in font) {if (font.hasOwnProperty(n) && FONT[n]) {FONT[n][5] = {img: font[n]}}}
- }
- }}
- },
-
- initImg: function (span) {
- if (this.imgSizeForEm[this.em]) {this.imgBaseIndex = this.imgSizeForEm[this.em]}
- for (var i = 0, m = this.imgEmWidth.length-1; i < m; i++)
- {if (this.em <= this.imgEmWidth[i]) break}
- if (i && this.imgEmWidth[i] - this.em > this.em - this.imgEmWidth[i-1]) {i--}
- this.imgSizeForEm[this.em] = this.imgBaseIndex = i;
- this.imgZoom = this.imgBrowserZoom();
- },
-
- imgIndex: function (scale) {
- if (!scale) {return this.imgBaseIndex}
- if (!this.imgSizeForScale[this.em]) {this.imgSizeForScale[this.em] = {}}
- if (this.imgSizeForScale[this.em][scale]) {return this.imgSizeForScale[this.em][scale]}
- var em = this.em * scale;
- for (var i = 0, m = this.imgEmWidth.length-1; i < m; i++)
- {if (em <= this.imgEmWidth[i]) break}
- if (i && this.imgEmWidth[i] - em > em - this.imgEmWidth[i-1]) {i--}
- this.imgSizeForScale[this.em][scale] = i;
- return i;
- },
-
- imgBrowserZoom: function () {return 1}
-
- });
-
- HUB.Browser.Select({
-
- Firefox: function (browser) {
- var ZDIV = HTMLCSS.addElement(document.body,"div",{
- style: {
- display:"none", visibility:"hidden", overflow:"scroll",
- position:"absolute", top:0, left: 0, width:"200px", height:"200px",
- padding:0, border:0, margin:0
- }
- });
-
- var ZFRAME = HTMLCSS.addElement(ZDIV,"div",{
- style: {
- position:"absolute", left:0, top:0, right:0, bottom:0,
- padding:0, border:0, margin:0
- }
- });
- HTMLCSS.Augment({
- imgSpaceBug: true,
- imgSpace: "\u00A0",
-
- imgZoomLevel: (browser.isMac ?
- {50:.3, 30:.5, 22:.67, 19:.8, 16:.9, 15:1, 13:1.1, 12:1.2,
- 11:1.33, 10:1.5, 9:1.7, 7:2, 6:2.4, 5:3, 0:15} :
- {56:.3, 34:.5, 25:.67, 21:.8, 19:.9, 17:1, 15:1.1, 14:1.2,
- 13:1.33, 11:1.5, 10:1.7, 8:2, 7:2.4, 6:3, 0:17}
- ),
-
- imgZoomDiv: ZDIV,
-
- imgBrowserZoom: function () {
- var size = this.imgZoomLevel;
- ZDIV.style.display = "";
- var ratio = (ZDIV.offsetWidth-ZFRAME.offsetWidth);
- ratio = (size[ratio] ? size[ratio] : size[0]/ratio);
- ZDIV.style.display = "none";
- return ratio;
- }
- });
- },
- Safari: function (browser) {
- // for iPhone and iTouch
- // var webkit = (navigator.appVersion+"AppleWebKit/530").match(/AppleWebKit\/(\d+)/)[1];
- HTMLCSS.Augment({
- // imgHeightBug: (!browser.isMac || webkit > 525),
- // imgDepthBug: (!browser.isMac || webkit > 525),
- imgBrowserZoom: function () {return 3}
- });
- },
-
- Chrome: function (browser) {
- HTMLCSS.Augment({
- imgHeightBug: true,
- imgBrowserZoom: function () {return 3}
- });
- },
-
- Opera: function (browser) {
- HTMLCSS.Augment({
- imgSpaceBug: true,
- imgSpace: "\u00A0\u00A0",
-
- imgDoc: (document.compatMode == "BackCompat" ? document.body :
- document.documentElement),
- imgBrowserZoom: function () {
- if (browser.isMac) {return 3} // Mac Opera scales very nicely
- var H = this.imgDoc.clientHeight, d = Math.floor(15*H/window.innerHeight);
- if (this.imgDoc.clientWidth < this.imgDoc.scrollWidth-d) {H += d}
- return parseFloat((window.innerHeight/H).toFixed(1));
- }
- });
- }
- });
-
- var GETWIDTHS = function () {
- var img = HTMLCSS.FONTDATA.FONTS["MathJax_Main"][0x2014][5].img; // em-dash
- HTMLCSS.imgEmWidth = [];
- for (var i = 0, m = img.length; i < m; i++) {HTMLCSS.imgEmWidth[i] = img[i][0]}
- };
-
- var IMGDIR = HTMLCSS.imgDir + HTMLCSS.imgPacked;
-
- MathJax.Callback.Queue(
- ["Require",AJAX,IMGDIR+"/imagedata.js"],
- GETWIDTHS,
- ["loadComplete",AJAX,HTMLCSS.directory+"/imageFonts.js"]
- );
-
- });
-
- })(MathJax.Hub,MathJax.OutputJax["HTML-CSS"],MathJax.Ajax);
|