Files
openlayers/float-no-zero/closure-library/closure/goog/ui/equation/imagerenderer.js
2014-03-07 10:55:12 +01:00

191 lines
5.5 KiB
JavaScript

// Copyright 2009 The Closure Library Authors. All Rights Reserved.
//
// 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.
/**
* @fileoverview Functions for rendering the equation images.
*
*/
goog.provide('goog.ui.equation.ImageRenderer');
goog.require('goog.dom.TagName');
goog.require('goog.dom.classes');
goog.require('goog.string');
goog.require('goog.uri.utils');
/**
* The server name which renders the equations.
* We use https as equations may be embedded in https pages
* and using https prevents mixed content warnings. Note that
* https equations work only on google.com domains.
* @type {string}
* @private
*/
goog.ui.equation.ImageRenderer.SERVER_NAME_ =
'https://www.google.com';
/**
* The longest equation which may be displayed, in characters.
* @type {number}
*/
goog.ui.equation.ImageRenderer.MAX_EQUATION_LENGTH = 200;
/**
* Class to put on our equations IMG elements.
* @type {string}
*/
goog.ui.equation.ImageRenderer.EE_IMG_CLASS = 'ee_img';
/**
* Non-standard to put on our equations IMG elements. Useful when classes need
* to be scrubbed from the user-generated HTML, but non-standard attributes
* can be white-listed.
*
* @type {string}
*/
goog.ui.equation.ImageRenderer.EE_IMG_ATTR = 'eeimg';
/**
* Vertical alignment for the equations IMG elements.
* @type {string}
*/
goog.ui.equation.ImageRenderer.EE_IMG_VERTICAL_ALIGN = 'middle';
/**
* The default background color as used in the img url, which is fully
* transparent white.
* @type {string}
*/
goog.ui.equation.ImageRenderer.BACKGROUND_COLOR = 'FFFFFF00';
/**
* The default foreground color as used in the img url, which is black.
* @type {string}
*/
goog.ui.equation.ImageRenderer.FOREGROUND_COLOR = '000000';
/**
* Class to put on IMG elements to keep the resize property bubble from
* appearing. This is different from PLACEHOLDER_IMG_CLASS because it's
* reasonable in some cases to be able to resize a placeholder (which should
* be reflected when the placeholder is replaced with the other content).
* @type {string}
*/
goog.ui.equation.ImageRenderer.NO_RESIZE_IMG_CLASS =
goog.getCssName('tr_noresize');
/**
* Returns the equation image src url given the equation.
* @param {string} equation The equation.
* @return {string} The equation image src url (empty string in case the
* equation was empty).
*/
goog.ui.equation.ImageRenderer.getImageUrl = function(equation) {
if (!equation) {
return '';
}
var url = goog.ui.equation.ImageRenderer.SERVER_NAME_ +
'/chart?cht=tx' +
'&chf=bg,s,' +
goog.ui.equation.ImageRenderer.BACKGROUND_COLOR +
'&chco=' +
goog.ui.equation.ImageRenderer.FOREGROUND_COLOR +
'&chl=' +
encodeURIComponent(equation);
return url;
};
/**
* Returns the equation string src for given image url.
* @param {string} imageUrl The image url.
* @return {string?} The equation string, null if imageUrl cannot be parsed.
*/
goog.ui.equation.ImageRenderer.getEquationFromImageUrl = function(imageUrl) {
return goog.uri.utils.getParamValue(imageUrl, 'chl');
};
/**
* Gets the equation string from the given equation IMG node. Returns empty
* string if the src attribute of the is not a valid equation url.
* @param {Element} equationNode The equation IMG element.
* @return {string} The equation string.
*/
goog.ui.equation.ImageRenderer.getEquationFromImage = function(equationNode) {
var url = equationNode.getAttribute('src');
if (!url) {
// Should never happen.
return '';
}
return goog.ui.equation.ImageRenderer.getEquationFromImageUrl(
url) || '';
};
/**
* Checks whether given node is an equation element.
* @param {Node} node The node to check.
* @return {boolean} Whether given node is an equation element.
*/
goog.ui.equation.ImageRenderer.isEquationElement = function(node) {
return node.nodeName == goog.dom.TagName.IMG &&
(node.getAttribute(
goog.ui.equation.ImageRenderer.EE_IMG_ATTR) ||
goog.dom.classes.has(node,
goog.ui.equation.ImageRenderer.EE_IMG_CLASS));
};
/**
* Returns the html for the html image tag for the given equation.
* @param {string} equation The equation.
* @return {string} The html code to embed in the document.
*/
goog.ui.equation.ImageRenderer.getHtml = function(equation) {
var imageSrc =
goog.ui.equation.ImageRenderer.getImageUrl(equation);
if (!imageSrc) {
return '';
}
return '<img src="' + imageSrc + '" ' +
'alt="' + goog.string.htmlEscape(equation) + '" ' +
'class="' + goog.ui.equation.ImageRenderer.EE_IMG_CLASS +
' ' + goog.ui.equation.ImageRenderer.NO_RESIZE_IMG_CLASS +
'" ' + goog.ui.equation.ImageRenderer.EE_IMG_ATTR + '="1" ' +
'style="vertical-align: ' +
goog.ui.equation.ImageRenderer.EE_IMG_VERTICAL_ALIGN + '">';
};
/**
* Checks whether equation is too long to be displayed.
* @param {string} equation The equation to test.
* @return {boolean} Whether the equation is too long.
*/
goog.ui.equation.ImageRenderer.isEquationTooLong = function(equation) {
return equation.length >
goog.ui.equation.ImageRenderer.MAX_EQUATION_LENGTH;
};