diff --git a/TextBlock/textBlock.jsx b/TextBlock/textBlock.jsx new file mode 100644 index 0000000..71b9e30 --- /dev/null +++ b/TextBlock/textBlock.jsx @@ -0,0 +1,103 @@ +//@target Illustrator + +// script.name = textBlockLive.jsx; +// script.description = converts selected point textFrames into a Block of Text; +// script.required = one document with at least two selected Point Text frames; +// script.parent = carlos canto // 12/4/11; Update 03/15/205 added User Defined Units, cosmetics +// script.modification = sergey osokin // 08/12/23; keep text editable, sort texts by Y, cosmetics +// script.elegant = false; + +function main() { + if (!app.documents.length) { + alert("There are no open documents"); + return; + } + + var sel = app.selection; + var tfs = getTextFrames(selection); + if (tfs.length < 2) { + alert("Select at least 2 Point Text Frames before running"); + return; + } + + // Sort array by Y and X positions + tfs.sort(function (a, b) { + return comparePosition(b.top, a.top, a.left, b.left) + }); + + var width = prompt("Enter desired Text Block width including Units", '300 pt', "Text Block"); + if (width == null) return; + + var widthUV = new UnitValue(width); + if (widthUV.type == '?') { + alert('Units were not provided, try again...'); + return; + } + var widthPts = widthUV.as("pt") // convert to points + + var spacing = prompt("Enter spacing including Units", '3 mm', "Text Block"); // text lines spacing in mm + if (spacing == null) return; + + var spcingUV = new UnitValue(spacing); + if (spcingUV.type == '?') { + alert('Units were not provided, try again...'); + return; + } + var spacingPts = spcingUV.as("pt") // convert to points + + var blockGrp = selection[0].layer.groupItems.add(); // add a group to final output + blockGrp.name = "Text Block"; + + var left = 0; + var top = 0; + var firstTop = 0; + + for (var i = tfs.length - 1; i >= 0; i--) { // loop thru selection + var tf = tfs[i]; + var iText = tf.duplicate(blockGrp, ElementPlacement.PLACEATEND); // duplicate text + iText.selected = false; // deselect it + var iOutlined = iText.createOutline(); // create outlines + + var perCent = widthPts / iOutlined.width * 100; // get scaling percentage, based on desired width of block + var scaleMatrix = app.getScaleMatrix(perCent, perCent); + + iOutlined.remove(); + iText = tf.duplicate(blockGrp, ElementPlacement.PLACEATEND); + iText.selected = false; + iText.transform(scaleMatrix); + + iOutlined = iText.duplicate().createOutline(); + var deltaX = iText.left - iOutlined.left; + var deltaY = iText.geometricBounds[1] - iOutlined.geometricBounds[1]; + + iText.left = left + deltaX; + iText.top = top + deltaY + iOutlined.height + spacingPts; + top = iText.top - deltaY; + if (i == 0) firstTop = tf.top + deltaY; + + iOutlined.remove(); + } + + blockGrp.position = [tf.left + tf.width + 40, firstTop]; +} + +// Get TextFrames array from collection +function getTextFrames(coll) { + var tfs = []; + for (var i = 0, len = coll.length; i < len; i++) { + if (/text/i.test(coll[i].typename)) + tfs.push(coll[i]); + else if (/group/i.test(coll[i].typename)) + tfs = tfs.concat(getTextFrames(coll[i].pageItems)); + } + return tfs; +} + +// Compare position of two objects +function comparePosition(a1, b1, a2, b2) { + return a1 == b1 ? a2 - b2 : a1 - b1; +} + +try { + main(); +} catch (e) {} \ No newline at end of file