Friday, December 22, 2006
Cut Contents
Every now and then a FreeHand user will pine for its Cut Contents command. This allows FreeHand users to select a frame that is serving as a mask by virtue of a previous Paste Into command. InDesign's user interface actually makes this fairly easy to achieve.
The topic came up again this morning on the U2U forum where I posted a simpler version of the script below. See: http://adobeforums.com/cgi-bin/webx?14@@.3bc2a49a/3
As you can see in that posting, I immediately realized there was a problem if the user ran that version of the script with text selected. As the day wore on, I realized that groups and xmlElements also are problematic, so I ended up with this version of the script:
- With the selection tool (black pointer), select the frame.
- In the Control palette, click the Select Contents button.
- Choose Edit/Cut, or use the keyboard shortcut for Cut.
The topic came up again this morning on the U2U forum where I posted a simpler version of the script below. See: http://adobeforums.com/cgi-bin/webx?14@@.3bc2a49a/3
As you can see in that posting, I immediately realized there was a problem if the user ran that version of the script with text selected. As the day wore on, I realized that groups and xmlElements also are problematic, so I ended up with this version of the script:
//DESCRIPTION: Cut ContentsI keep telling myself that one of these days I'll script the equivalent of FreeHand's Attach Type to Path command, particularly the variation where a two-line text is attached to the top and bottom of an ellipse.
Object.prototype.isIneligible = function() {
switch(this.constructor.name){
case "InsertionPoint":
case "Character":
case "Word":
case "TextStyleRange":
case "Line":
case "Paragraph":
case "TextColumn":
case "Text":
case "TextFrame":
case "Group" :
case "XMLElement" :
return true;
default :
return false;
}
}
if (app.documents.length == 0 || app.selection.length != 1 || app.selection[0].isIneligible()) { exit() }
processSelection(app.selection[0]);
function processSelection(sel) {
try {
app.select(sel.pageItems[0])
app.cut(); } catch(e) {
alert("Selected item has no contents")
}
}
Friday, December 08, 2006
Story on Live Pages
I'm working with a document that has a lot of busy master spreads. But what I needed was to identify a particular story on the live pages. The frames are labeled, but so are the original frames on the master pages. So, it occurred to me to wonder if I could easily get a list of all the frames on the live pages of a document, ignoring the ones on the master pages.
Turns out that a double-dose of everyItem() gets the job done:
Speaking of labeling, I used this in a function that records the identity of the story of interest in a document label, so that the story only has to be found once:
Turns out that a double-dose of everyItem() gets the job done:
myFrames = doc.pages.everyItem().textFrames.everyItem().getElements();This produces an array of all the text frames free-standing on the live pages of a document. So, I can examine that list to find the story of interest without having to be concerned about the master frames that have the same label.
Speaking of labeling, I used this in a function that records the identity of the story of interest in a document label, so that the story only has to be found once:
function getMainStory(doc) {I'm not fully convinced that this is the most efficient way of achieving this goal, but it works and after the first time, it is very quick.
var label = doc.extractLabel("Main Story")
if (label != "") {
return doc.stories.itemByID(Number(label));
} else {
var myFrames = doc.pages.everyItem().textFrames.everyItem().getElements();
for (var j = myFrames.length - 1; j >= 0; j--) {
if (myFrames[j].extractLabel("Frame Type") == "Main Story Frame") {
var myStoryID = myFrames[j].parentStory.id;
doc.insertLabel("Main Story", String(myStoryID));
return doc.stories.itemByID(myStoryID)
}
}
}
} // end getMainStory