Math/modules/MathJax/jax/output/HTML-CSS/autoload/multiline.js

97 lines
4.6 KiB
JavaScript
Raw Normal View History

/*************************************************************
*
* MathJax/jax/output/HTML-CSS/autoload/multiline.js
*
* Implements the HTML-CSS output <mrow>'s that contain line breaks.
*
* ---------------------------------------------------------------------
*
* Copyright (c) 2010-2011 Design Science, Inc.
*
* 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.
*/
MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
var VERSION = "1.1";
var MML = MathJax.ElementJax.mml,
HTMLCSS = MathJax.OutputJax["HTML-CSS"];
MML.mbase.Augment({
toHTMLmultiline: function (span,split) {
span = this.HTMLcreateSpan(span); if (!this.type !== "mrow") {span = this.HTMLhandleSize(span)}
var stack = HTMLCSS.createStack(span);
var box = [], stretchy = [], H = -HTMLCSS.BIGDIMEN, D = -HTMLCSS.BIGDIMEN, i, j, m, M;
for (j = 0, M = split.length-1; j < M; j++) {
box[j] = HTMLCSS.createBox(stack);
for (i = split[j][0], m = split[j+1][0]; i < m; i++)
{if (this.data[i]) {this.data[i].toHTML(box[j])}}
// remove inter-object spacing
if (this.data[split[j][0]]) {this.data[split[j][0]].HTMLspanElement().style.paddingLeft = ""}
if (this.data[split[j][m-1]]) {this.data[split[j][m-1]].HTMLspanElement().style.paddingRight = ""}
//
stretchy[j] = this.HTMLcomputeBBox(box[j],null,split[j][0],split[j+1][0]);
if (box[j].bbox.h > H) {H = box[j].bbox.h}
if (box[j].bbox.d > D) {D = box[j].bbox.d}
}
var y = 0, scale = this.HTMLgetScale(), LHD = HTMLCSS.FONTDATA.baselineskip * scale;
var parent = this, first;
while (parent.inferred || (parent.parent && parent.parent.type === "mrow" &&
parent.parent.data.length === 1)) {parent = parent.parent}
var isTop = (parent.type === "math" || parent.type === "mtd"); parent.isMultiline = true;
for (j = 0, M = split.length-1; j < M; j++) {
for (i = 0, m = stretchy[j].length; i < m; i++) {stretchy[j][i].HTMLstretchV(box[j],H,D)}
if (stretchy[j].length) {this.HTMLcomputeBBox(box[j],true,split[j][0],split[j+1][0])}
var values = split[j][1].getValues("indentalign","indentshift");
values.lineleading = HTMLCSS.length2em(split[j+1][1].Get("lineleading"),.5);
// handle first/last special cases
if (j === 0) {
first = split[j+1][1].getValues("indentalignfirst","indentshiftfirst");
values.ALIGN = first.indentalignfirst; values.SHIFT = first.indentshiftfirst;
} else if (j === M-1) {
first = split[j][1].getValues("indentalignlast","indentshiftlast");
values.ALIGN = first.indentalignlast; values.SHIFT = first.indentshiftlast;
}
if (values.ALIGN && values.ALIGN !== MML.INDENTALIGN.INDENTALIGN)
{values.indentalign = values.ALIGN}
if (values.SHIFT && values.SHIFT !== MML.INDENTSHIFT.INDENTSHIFT)
{values.indentshift = values.SHIFT}
//
if (values.indentalign == MML.INDENTALIGN.AUTO)
{values.indentalign = (isTop ? this.displayAlign : MML.INDENTALIGN.LEFT)}
if (values.indentshift === "auto" || values.indentshift === "")
{values.indentshift = (isTop ? this.displayIndent : "0")}
values.indentshift = HTMLCSS.length2em(values.indentshift,0);
if (values.indentshift && values.indentalign !== MML.INDENTALIGN.CENTER) {
HTMLCSS.createBlank(box[j],values.indentshift,(values.indentalign !== MML.INDENTALIGN.RIGHT));
box[j].bbox.w += values.indentshift; box[j].bbox.rw += values.indentshift;
}
HTMLCSS.alignBox(box[j],values.indentalign,y);
if (j < M-1) {y -= Math.max(LHD,box[j].bbox.d + box[j+1].bbox.h + values.lineleading)}
}
if (isTop) {
stack.style.width = "100%";
if (parent.type === "math") {span.bbox.width = "100%"}
}
this.HTMLhandleSpace(span);
this.HTMLhandleColor(span);
span.bbox.isMultiline = true;
return span;
}
});
MathJax.Hub.Startup.signal.Post("HTML-CSS multiline Ready");
MathJax.Ajax.loadComplete(HTMLCSS.autoloadDir+"/multiline.js");
});