I am trying to write a script for InDesign to find the first character of every line of every paragraph, and change it to another color if it is a vowel. Since it is my very first effort in InDesign scripting, I downloaded Adobe’s Scripting Guide and managed so far to do the following:
createCharacterStyle(); main(); function main() { // I don't check if a document is open for now var myDocument = app.documents.item(0); var myStory = myDocument.stories.item(0); var noOfParas = myStory.paragraphs.length; for ( var theParaCounter = 0 ; theParaCounter < noOfParas ; theParaCounter++) { var currentParaLinesCount = myStory.paragraphs.item(theParaCounter).lines.length; for (var theLineCounter = 0 ; theLineCounter < currentParaLinesCount - 1 ; theLineCounter++ ) { var theCurrentLine = myStory.paragraphs.item(theParaCounter).lines.item(theLineCounter).contents; var theFirstChar = theCurrentLine.charAt(0); if ( theFirstChar == 'a' || theFirstChar == 'e' || theFirstChar == 'i' || theFirstChar == 'o' || theFirstChar == 'u') { theFirstChar.appliedCharacterStyle = 'Highlighted'; } } } } function createCharacterStyle() { var myDocument = app.documents.item(0); // Create the highlight color try { myColor = myDocument.colors.item('Red'); myName = myColor.name; } catch ( myError ) { myColor = myDocument.colors.add({name:'Red', model:ColorModel.process, colorValue:[0,100,100,0]}); } // Create a new Character Style try { myCharStyle = myDocument.characterStyles.item('Highlighted'); myName = myCharStyle.name; } catch ( myError ) { myCharStyle = myDocument.characterStyles.add({name:'Highlighted'}); } myCharStyle.fillColor = myColor; myCharStyle.underline = true; }
At first I create the character style (red underline) and then I loop through the lines. The loop works, and finds the first character. The problem is that the style is never applied. Any help will be appreciated. Thanks!
Advertisement
Answer
As a quick fix you can replace the line:
theFirstChar.appliedCharacterStyle = 'Highlighted';
with:
myStory.paragraphs[theParaCounter].lines[theLineCounter].characters[0].appliedCharacterStyle = 'Highlighted';
The problem is the theFirstChar
in your code is just a string, a text. It has no the property appliedCharacterStyle
. You have to get the object character
from the story/paragraph/line: stories[0].paragraphs[counter].lines[counter].character[0]
if you want to apply a character style on it.
Note: the paragraphs.item(theParaCounter)
is the same as paragraphs[theParaCounter]
, lines.item(theLineCounter)
is the same as lines[theLineCounter]
.
Additionally the condition can be shortened:
if ('aeiou'.indexOf(theFirstChar.toLowerCase()) > -1) {
instead of:
if ( theFirstChar == 'a' || theFirstChar == 'e' || theFirstChar == 'i' || theFirstChar == 'o' || theFirstChar == 'u') {
.toLowerCase()
makes the condition case insensitive. If you need it.
The main()
function can be boiled down to this:
function main() { var doc = app.activeDocument; var story = doc.stories[0]; var paragraphs = story.paragraphs.everyItem().getElements(); while (paragraphs.length) { var lines = paragraphs.shift().lines.everyItem().getElements(); while (lines.length) { var character = lines.shift().characters[0]; if ('aeiou'.indexOf(character.contents.toLowerCase()) < 0) continue; character.appliedCharacterStyle = 'Highlighted'; } } }