I made some newspaper mock-ups and needed to change the text of existing pages into lorem-ipsum nonsense, while keeping the formatting and amount of text the same. So I made this scripts. It will change any words in the current selection into nonsense.
It's a bit slow because it loops through every single word in the selection and changes it into latin-sounding words with the same number of characters, and then adds or subtracts some letters to make sure the text is pretty much the same number of lines in the end.
I have only tested it with CS3.
for (var n=0; n<app.selection.length; n++){ loremIpsumize(app.selection[n]); } function loremIpsumize(myText){ // myText could be a TextFrame, Story, InsertionPoint, Word, Text etc... var loremIpsumDictionary = [[""], // this is the dictionary of words sorted by number of letters. The words are taken from InDesigns "fill with placeholder text"-feature ["a","e","y"], ["el","si","em","se","an","er","do","re","te","at","os","od","to","et","eu","ud","na","ex","ed","ut","ad","il","in","la","it","is","ip","am","ea"], ["ing","lam","vel","lan","lis","lor","ute","ver","con","lum","lut","ibh","del","unt","min","mod","feu","nim","nis","nit","non","nos","bla","eum","eui","num","aut","dio","odo","wis","tis","tio","pis","pit","qui","ate","tin","tie","ese","tet","tem","dip","rat","ero","ril","rit","ros","dit"], ["duis","alit","dunt","ecte","sisi","elis","elit","enim","enis","enit","sent","wisl","erat","amet","tate","alis","erci","erit","wisi","eros","esed","esse","essi","dion","atem","atet","acil","esto","atio","quis","atue","etue","quip","ting","etum","atum","quat","quam","diat","euip","prat"], ["lorem","ispum","magna","ulput","lutem","minci","minis","lummy","commy","adiat","minit","conse","lorer","lorem","ullum","adiam","lobor","modip","modit","lenit","lenim","laore","cipit","molor","utpat","velis","iusto","iusci","iurem","molum","velit","ullan","ullam","nisci"], ["mconse","magnit","mincip","magnis","magnim","minisi","minisl","lutpat","wissis","wissim","acidui","modiat","commod","luptat","wiscip","wiscin","lumsan","wiscil","molent","cinibh","lortio","vulput","molore","lortin","lortie","vullut","vullan","vullam","ncidui","volute","lorper"], ["feuisci","sustrud","ationse","feuisis","feuisit","feuguer","feuismo","feugiat","feummod","feugiam","hendiam","feugait","dolorem","andreet","suscipi","hendrem","hendrer","facipit","heniamc","amconul","atuerat","facipis","dolorer","facinim","tetummy","facinim","delesto"], ["dolortis","vendreet","vullutat","consequi","niatuero","eugiamet","nismodit","adignibh","eugiatet","zzriusto","doluptat","veliquat","nonsecte","veliquam","velestis","dolortio","nonsenim","velessim","dolortin","dolortie","velenibh","nonsequi","veleniat","conullam","eraessit"], ["iriliquis","blandipis","quismolor","irillamet","consequis","iriuscing","blaorerit","iriustrud","etuerosto","nissectet","vendiamet","volestisl","dionsenim","digniamet","eniatisit","quamcommy","iurerosto","ionsequat","ptatueros","consequat","duiscipit","scillummy","veliquisl"], ["loremipsum","exeriurero","nummodolor","ullamcommy","veriliquat","conulputat","uismodolor","exeraessit","exerostrud","nullaortis","tisiscipis","nullaoreet","nullandrem","odigniamet","nullandiat","verciduisi","erciduisit","faciduisim","lummolessi","facincipit","voloreetum"], ["dolortionum","veliquiscil","euguerostie","veliquamcon","aciliquisim","eummolestin","adionsequat","adipsustrud","vercincinis","dolorpercin","exeraestrud","ullaorperit","wismolobore","amconsequis","essequating","facipsustio","doloreetuer","elesequisim","augiametuer"], ["dolutatueros","adigniamcore","velesequipit","adigniscipis","eummolortion","dolorperiure","dolorpercing","ulputpatetue","uipsuscidunt","aliquipsusci","tumsandionse","tionsequisim","facilismolut","facillametum","atueraestrud","sustionsenim","iliquatiniat","dolenismodit"]]; var myStory; // the parent Story of myText if (myText instanceof Story){ myStory = myText; } else if (myText instanceof InsertionPoint){ myText = myStory = myText.parentStory; } else if (myText.hasOwnProperty("parentStory")){ // myText instanceof Word, TextFrame, Character, TextColumn or Paragraph myStory = myText.parentStory; } else { // myText is not text, but some other object return; } if (myText.hasOwnProperty("paragraphs") && !(myText instanceof Paragraph)){ // The script returns better looking results when one Paragraph is processed at a time var myParagraphs = myText.paragraphs.everyItem().getElements(); for (var n=myParagraphs.length-1; n>=0 ; n--){ loremIpsumize(myParagraphs[n]); // clever recurson } } else if (myText.contents!=""){ app.findGrepPreferences = NothingEnum.nothing; app.changeGrepPreferences = NothingEnum.nothing; app.findGrepPreferences.findWhat = "[\\u\\l'@\u00E6\u00C6]{1,"+loremIpsumDictionary.length+"}"; // only looks for word-characters and leave punctuation, spaces as they are var storyLineNumber = myStory.lines.length; // remembers how many lines the story has, and tries to make the new text the same number of lines var myWordMatches = myText.findGrep(); // an array of Word references that fit the grep for (var i=myWordMatches.length-1; i>=0; i--){ myWordMatches[i].contents = loremipsumWord(myWordMatches[i].contents); // changes the word into a random latin-sounding one } fineTuneText(storyLineNumber); } function fineTuneText(targetNumberOfLines){ // tries to make the text the correct number of lines by adding or subtracting one letter at a time var myNumberOfCharacters; var newWord; var myWord; while (targetNumberOfLines != myStory.lines.length) { myNumberOfCharacters = myText.characters.length; for (var changeWord = myWordMatches.length-1; changeWord>=0; changeWord--){ myWord = myWordMatches[changeWord]; if (targetNumberOfLines>myStory.lines.length){ newWord = loremipsumWord(myWord.contents+"a"); // adds a letter }else if (targetNumberOfLines<myStory.lines.length){ newWord = myWord.contents.length>1? loremipsumWord(myWord.contents.slice(0,-1)): myWord.contents; // removes a letter } else { return true; // targetNumberOfLines == myStory.lines.length } myWord.contents = newWord; } if (myNumberOfCharacters == myText.characters.length){ return false; // Every word in the text has been reduced to a single character, and the text is still too long.... Give up. } else { myWordMatches = myText.findGrep(); // Need to do a new search, since the text has been changed } } } function loremipsumWord(myWord){ // takes a string and returns a random word with same number of letters, and the same capitalization var replacementWord = ""; var correctCaseWord= ""; var wordLength = myWord.length; if (wordLength >= loremIpsumDictionary.length){ // in case myWord is longer than the longest words in the dictionary replacementWord = loremipsumWord(myWord.substr(0,loremIpsumDictionary.length-1))+loremipsumWord(myWord.substr(loremIpsumDictionary.length-1)); // The word is longer than the longest words in the dictionary. So it's split in two. } else { replacementWord = loremIpsumDictionary[wordLength][Math.floor(Math.random()*loremIpsumDictionary[wordLength].length)]; // finds a random word of the same length if (myWord.toLowerCase()!=myWord){ // the word contains uppercase characters correctCaseWord = ""; for (var n=0; n<wordLength; n++){ // loops through each character in the original word, checking if it's upper or lower case. correctCaseWord += myWord.charAt(n).toUpperCase()==myWord.charAt(n)? replacementWord.charAt(n).toUpperCase(): replacementWord.charAt(n); // makes the character the correct case } replacementWord = correctCaseWord; } } return replacementWord; } }