Skip to main content
LynxKx
Inspiring
October 17, 2023
Question

Adjust Export All Stories to ignore locked text frames

  • October 17, 2023
  • 1 reply
  • 378 views

InDesign has this built-in script ... wondering if someone can help me adjsut it and add a condition to it to ignore text frames that are locked OR on a layer thats locked

//ExportAllStories.jsx
//An InDesign JavaScript
/*  
@@@BUILDINFO@@@ "ExportAllStories.jsx" 3.0.0 15 December 2009
*/
//Exports all stories in an InDesign document in a specified text format.
//
//For more on InDesign/InCopy scripting see the documentation included in the Scripting SDK 
//available at http://www.adobe.com/devnet/indesign/sdk.html
//or visit the InDesign Scripting User to User forum at http://www.adobeforums.com
//
main();
function main(){
	//Make certain that user interaction (display of dialogs, etc.) is turned on.
	app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
	if(app.documents.length != 0){
		if (app.activeDocument.stories.length != 0){
			myDisplayDialog();
		}
		else{
			alert("The document does not contain any text. Please open a document containing text and try again.");
		}
	}
	else{
		alert("No documents are open. Please open a document and try again.");
	}
}
function myDisplayDialog(){
	with(myDialog = app.dialogs.add({name:"ExportAllStories"})){
		//Add a dialog column.
		myDialogColumn = dialogColumns.add()	
		with(myDialogColumn){
			with(borderPanels.add()){
				staticTexts.add({staticLabel:"Export as:"});
				with(myExportFormatButtons = radiobuttonGroups.add()){
					radiobuttonControls.add({staticLabel:"Text Only", checkedState:true});
					radiobuttonControls.add({staticLabel:"RTF"});
					radiobuttonControls.add({staticLabel:"InDesign Tagged Text"});
				}
			}
		}
		myReturn = myDialog.show();
		if (myReturn == true){
			//Get the values from the dialog box.
			myExportFormat = myExportFormatButtons.selectedButton;
			myDialog.destroy;
			myFolder= Folder.selectDialog ("Choose a Folder");
			if((myFolder != null)&&(app.activeDocument.stories.length !=0)){
				myExportAllStories(myExportFormat, myFolder);
			}
		}
		else{
			myDialog.destroy();
		}
	}
}
//myExportStories function takes care of exporting the stories.
//myExportFormat is a number from 0-2, where 0 = text only, 1 = rtf, and 3 = tagged text.
//myFolder is a reference to the folder in which you want to save your files.
function myExportAllStories(myExportFormat, myFolder){
	for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
		myStory = app.activeDocument.stories.item(myCounter);
		myID = myStory.id;
		switch(myExportFormat){
			case 0:
				myFormat = ExportFormat.textType;
				myExtension = ".txt"
				break;
			case 1:
				myFormat = ExportFormat.RTF;
				myExtension = ".rtf"
				break;
			case 2:
				myFormat = ExportFormat.taggedText;
				myExtension = ".txt"
				break;
		}
		myFileName = "StoryID" + myID + myExtension;
		myFilePath = myFolder + "/" + myFileName;
		myFile = new File(myFilePath);
		myStory.exportFile(myFormat, myFile);
	}
}
This topic has been closed for replies.

1 reply

Community Expert
October 27, 2023

Haven't tested it cos not sure how to test it for your scenario

 

//ExportAllStories.jsx
//An InDesign JavaScript

main();

function main(){
    //Make certain that user interaction (display of dialogs, etc.) is turned on.
    app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
    if(app.documents.length != 0){
        if (app.activeDocument.stories.length != 0){
            myDisplayDialog();
        }
        else{
            alert("The document does not contain any text. Please open a document containing text and try again.");
        }
    }
    else{
        alert("No documents are open. Please open a document and try again.");
    }
}

function myDisplayDialog(){
    with(myDialog = app.dialogs.add({name:"ExportAllStories"})){
        //Add a dialog column.
        myDialogColumn = dialogColumns.add();	
        with(myDialogColumn){
            with(borderPanels.add()){
                staticTexts.add({staticLabel:"Export as:"});
                with(myExportFormatButtons = radiobuttonGroups.add()){
                    radiobuttonControls.add({staticLabel:"Text Only", checkedState:true});
                    radiobuttonControls.add({staticLabel:"RTF"});
                    radiobuttonControls.add({staticLabel:"InDesign Tagged Text"});
                }
            }
        }
        myReturn = myDialog.show();
        if (myReturn == true){
            //Get the values from the dialog box.
            myExportFormat = myExportFormatButtons.selectedButton;
            myDialog.destroy;
            myFolder= Folder.selectDialog ("Choose a Folder");
            if((myFolder != null)&&(app.activeDocument.stories.length !=0)){
                myExportAllStories(myExportFormat, myFolder);
            }
        }
        else{
            myDialog.destroy();
        }
    }
}

//myExportStories function takes care of exporting the stories.
//myExportFormat is a number from 0-2, where 0 = text only, 1 = rtf, and 3 = tagged text.
//myFolder is a reference to the folder in which you want to save your files.
function myExportAllStories(myExportFormat, myFolder){
    for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
        myStory = app.activeDocument.stories.item(myCounter);
        // Check if the story's text frame or its layer is locked, if so, skip exporting.
        if (!isTextFrameOrLayerLocked(myStory.parentTextFrames[0]) && !isLayerLocked(myStory.parentTextFrames[0].parent)){
            myID = myStory.id;
            switch(myExportFormat){
                case 0:
                    myFormat = ExportFormat.textType;
                    myExtension = ".txt";
                    break;
                case 1:
                    myFormat = ExportFormat.RTF;
                    myExtension = ".rtf";
                    break;
                case 2:
                    myFormat = ExportFormat.taggedText;
                    myExtension = ".txt";
                    break;
            }
            myFileName = "StoryID" + myID + myExtension;
            myFilePath = myFolder + "/" + myFileName;
            myFile = new File(myFilePath);
            myStory.exportFile(myFormat, myFile);
        }
    }
}

// Function to check if a text frame is locked
function is

 

 

Community Expert
October 27, 2023

@Eugene Tyson you did not share the definition for the methods isLayerLocked and isTextFrameOrLayerLocked. Also, the parent of a pageItem would not be layer but spread in case of a non anchored frame, we can use the itemLayer property.

The following code can be tried.

//ExportAllStories.jsx
//An InDesign JavaScript
/*  
@@@BUILDINFO@@@ "ExportAllStories.jsx" 3.0.0 15 December 2009
*/
//Exports all stories in an InDesign document in a specified text format.
//
//For more on InDesign/InCopy scripting see the documentation included in the Scripting SDK 
//available at http://www.adobe.com/devnet/indesign/sdk.html
//or visit the InDesign Scripting User to User forum at http://www.adobeforums.com
//
main();
function main(){
	//Make certain that user interaction (display of dialogs, etc.) is turned on.
	app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;
	if(app.documents.length != 0){
		if (app.activeDocument.stories.length != 0){
			myDisplayDialog();
		}
		else{
			alert("The document does not contain any text. Please open a document containing text and try again.");
		}
	}
	else{
		alert("No documents are open. Please open a document and try again.");
	}
}
function myDisplayDialog(){
	with(myDialog = app.dialogs.add({name:"ExportAllStories"})){
		//Add a dialog column.
		myDialogColumn = dialogColumns.add()	
		with(myDialogColumn){
			with(borderPanels.add()){
				staticTexts.add({staticLabel:"Export as:"});
				with(myExportFormatButtons = radiobuttonGroups.add()){
					radiobuttonControls.add({staticLabel:"Text Only", checkedState:true});
					radiobuttonControls.add({staticLabel:"RTF"});
					radiobuttonControls.add({staticLabel:"InDesign Tagged Text"});
				}
			}
		}
		myReturn = myDialog.show();
		if (myReturn == true){
			//Get the values from the dialog box.
			myExportFormat = myExportFormatButtons.selectedButton;
			myDialog.destroy;
			myFolder= Folder.selectDialog ("Choose a Folder");
			if((myFolder != null)&&(app.activeDocument.stories.length !=0)){
				myExportAllStories(myExportFormat, myFolder);
			}
		}
		else{
			myDialog.destroy();
		}
	}
}
//myExportStories function takes care of exporting the stories.
//myExportFormat is a number from 0-2, where 0 = text only, 1 = rtf, and 3 = tagged text.
//myFolder is a reference to the folder in which you want to save your files.
function myExportAllStories(myExportFormat, myFolder){
	for(myCounter = 0; myCounter < app.activeDocument.stories.length; myCounter++){
		myStory = app.activeDocument.stories.item(myCounter);
		if (myStory.parentTextFrames[0].locked)
    		continue;

		if(myStory.parentTextFrames[0].itemLayer.locked)
    		continue;

		myID = myStory.id;
		switch(myExportFormat){
			case 0:
				myFormat = ExportFormat.textType;
				myExtension = ".txt"
				break;
			case 1:
				myFormat = ExportFormat.RTF;
				myExtension = ".rtf"
				break;
			case 2:
				myFormat = ExportFormat.taggedText;
				myExtension = ".txt"
				break;
		}
		myFileName = "StoryID" + myID + myExtension;
		myFilePath = myFolder + "/" + myFileName;
		myFile = new File(myFilePath);
		myStory.exportFile(myFormat, myFile);
	}
}

P.S. :- Note the following points as well

  • Anchored frames or frames within a cell are not catered to
  • The first frame of a thread is considered to check for the condition of locking

-Manan

-Manan
Community Expert
October 27, 2023

Ah I see - thanks for the additional info! Good to know 🙂