UNPKG

kekule

Version:

Open source JavaScript toolkit for chemoinformatics

125 lines (113 loc) 3.58 kB
/** * @fileoverview * Some system functions of Kekule widget lib. * @author Partridge Jiang */ /* * requires /lan/classes.js * requires /core/kekule.common.js * requires /widget/kekule.widget.base.js * requires /xbrowsers/kekule.x.js */ (function(){ "use strict"; /** @ignore */ var _FontDetector = function() { // a font will be compared against all the three default fonts. // and if it doesn't match all 3 then that font is not available. var baseFonts = ['monospace', 'sans-serif', 'serif']; //we use m or w because these two characters take up the maximum width. // And we use a LLi so that the same matching fonts can get separated var testString = "mmmmmmmmmmlli"; //we test using 72px font size, we may use any size. I guess larger the better. var testSize = '72px'; var h = document.getElementsByTagName("body")[0]; // create a SPAN in the document to get the width of the text we use to test var s = document.createElement("span"); s.style.fontSize = testSize; s.innerHTML = testString; var defaultWidth = {}; var defaultHeight = {}; for (var index in baseFonts) { //get the default width for the three base fonts s.style.fontFamily = baseFonts[index]; h.appendChild(s); defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font h.removeChild(s); } function detect(font) { var detected = false; for (var index in baseFonts) { s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback. h.appendChild(s); var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]); h.removeChild(s); detected = detected || matched; } return detected; } this.detect = detect; }; var _fontDetector; /** * A util class to detect if a font is available in browser. * The detection method is borrowed from http://www.lalit.org/lab/javascript-css-font-detect/. * @class */ Kekule.Widget.FontDetector = { /** * Check if a font family is available in browser. * @param {String} fontFamily * @returns {Bool} */ detect: function(fontFamily) { var d = _fontDetector; if (!d) { d = new _FontDetector(); _fontDetector = d; } return d.detect(fontFamily); } }; var _defFontList = [ 'Arial, Helvetica, sans-serif', 'Georgia, Times New Roman, Times, serif', 'Courier New, Courier, monospace', 'Tahoma, Geneva, sans-serif', 'Trebuchet MS, Arial, Helvetica, sans-serif', 'Arial Black, Gadget, sans-serif', 'Palatino Linotype, Book Antiqua, Palatino, serif', 'Lucida Sans Unicode, Lucida Grande, sans-serif', 'MS Serif, New York, serif', 'Lucida Console, Monaco, monospace', 'Comic Sans MS, cursive' ]; /** * A util class to list a set of fonts available for Kekule widget system. * @class */ Kekule.Widget.FontEnumerator = { /** * Returns a list of available fonts in browser out of candidateFonts. * If candidateFonts is not set, a default font set will be used. * @param {Array} candidateFonts * @returns {Array} */ getAvailableFontFamilies: function(candidateFonts) { if (!candidateFonts) candidateFonts = _defFontList; var result = []; for (var i = 0, l = candidateFonts.length; i < l; ++i) { var fn = candidateFonts[i]; if (Kekule.Widget.FontDetector.detect(fn)) result.push(fn); } return result; } }; })();