multifilltext
html5 canvas
by jeffchan
HTML
<canvas id="myCanvas">
</canvas>
CSS
#myCanvas {
border: 1px solid black;
}
JavaScript
var canvas = $('myCanvas');
canvas.width = '300';
canvas.height = '600';
var ctx = canvas.getContext('2d');
ctx.font = '14px Helvetica';
ctx.fillStyle = 'black';
ctx.textAlign = 'start';
ctx.textBaseline = 'top';
var cutOff = 210,
DEBUG = true;
var multiFillText = function(text, x, y, lineHeight, fitWidth) {
var draw = x !== null && y !== null;
text = text.replace(/(\r\n|\n\r|\r|\n)/g, "\n");
sections = text.split("\n");
var i, str, wordWidth, words, currentLine = 0,
maxHeight = 0,
maxWidth = 0;
var printNextLine = function(str) {
if (draw) {
ctx.fillText(str, x, y + (lineHeight * currentLine));
}
currentLine++;
wordWidth = ctx.measureText(str).width;
if (wordWidth > maxWidth) {
maxWidth = wordWidth;
}
};
for (i = 0; i < sections.length; i++) {
words = sections[i].split(' ');
index = 1;
while (words.length > 0 && index <= words.length) {
str = words.slice(0, index).join(' ');
wordWidth = ctx.measureText(str).width;
if (wordWidth > fitWidth) {
if (index === 1) {
// Falls to this case if the first word in words[] is bigger than fitWidth
// so we print this word on its own line; index = 2 because slice is
str = words.slice(0, 1).join(' ');
words = words.splice(1);
} else {
str = words.slice(0, index - 1).join(' ');
words = words.splice(index - 1);
}
printNextLine(str);
index = 1;
} else {
index++;
}
}
// The left over words on the last line
if (index > 0) {
printNextLine(words.join(' '));
}
}
maxHeight = lineHeight * (currentLine);
if (DEBUG) {
ctx.strokeRect(x, y, maxWidth,...