テキストの幅に応じて自動改行する – GeoGebra
上記リンク先のアプレットは、下図のように、テキストの幅を指定して、それに応じてテキストを自動的に改行します。
function getTextWidth(textToMeasure){
ggbApplet.evalCommand('USITEXT=\"'+textToMeasure+'\"');
var actualWidth = ggbApplet.getValue('x(Corner[USITEXT, 2]) - x(Corner[USITEXT, 1])');
var ratio = ggbApplet.getValue('(x(Corner[5]) + 2) / (x(Corner[2]) - x(Corner[1]))');
var textWidth = Math.round(actualWidth*ratio);
ggbApplet.deleteObject('USITEXT');
return textWidth;
}
function getTextObjWidth(textObjName){
var actualWidth = ggbApplet.getValue('x(Corner['+textObjName+', 2]) - x(Corner['+textObjName+', 1])');
var ratio = ggbApplet.getValue('(x(Corner[5]) + 2) / (x(Corner[2]) - x(Corner[1]))');
var textWidth = Math.round(actualWidth*ratio);
return textWidth;
}
function widthCappedText(textObjName, maxWidth){
ggbApplet.deleteObject(textObjName+'Capped');
ggbApplet.evalCommand(textObjName+'Capped=CopyFreeObject['+textObjName+']');
var currentData = ggbApplet.getValueString(textObjName+'Capped');
var textSimplified = currentData;
var arr = textSimplified.split('');
var textVert = arr.join('\n');
ggbApplet.setTextValue(textObjName+'Capped', textVert);
var minWidth = getTextObjWidth(textObjName+'Capped');
if(minWidth > maxWidth){return 'これ以上幅を狭く出来ませんので、処理を停止しました。';}
ggbApplet.setTextValue(textObjName+'Capped', currentData);
var totalWidth = getTextObjWidth(textObjName+'Capped');
if(totalWidth <= maxWidth){return 'テキスト幅が指定の値を下回っているので、処理を停止しました。';}
var sliceIndex = 0;
var currentWidth = totalWidth;
do{
do{
sliceIndex++;
if(sliceIndex > textVert.length){return 'ループを終了しました。現在のsliceIndexは、'+sliceIndex+'です。';}
ggbApplet.setTextValue(textObjName+'Capped', currentData.slice(0,sliceIndex));
currentWidth = getTextObjWidth(textObjName+'Capped');
}while (currentWidth <= maxWidth);
currentData = currentData.slice(0,sliceIndex-1)+'\n'+currentData.slice(sliceIndex-1);
ggbApplet.setTextValue(textObjName+'Capped', currentData);
totalWidth = getTextObjWidth(textObjName+'Capped');
}while (totalWidth >= maxWidth);
return true;
}