11 Replies Latest reply: Nov 20, 2013 3:57 AM by Peter Stnsz RSS

    Finding the end of line

    Sami Artur Community Member

      Is It possible to find and change a character in the end of each line from a block text?

      I know Indesign GREP can't do this, GREP only finds the end of paragraph, not lines.

      I understand this is a problem because every time the text frame is modified, you have another character being changed.

      Is It possible to do this with a script?

      I have attached an image of what I would like to do.

      The text in the image is Hebrew (R2L language) and the end of line is in the left.

      Any help would be great.

      Sami

      exemple.jpg

        • 1. Re: Finding the end of line
          [Ariel] Community Member

          Well, if you've got some text (paragraphs, story, whatever):

           

          myText.lines.characters[-1]

           

          will get you the last character on the line.

           

          If you want to change what it is,

           

          myText.lines.characters[-1].contents = "Z"

           

          etc.

           

          Ariel

          • 2. Re: Finding the end of line
            Sami Artur Community Member

            Thank you Ariel, but I am receiving this message:

             

            Object does not support the property or method 'characters'

             

            Sami

            • 3. Re: Finding the end of line
              [Ariel] Community Member

              It depends on how you're getting hold of the block of text.

               

              Let's say you select a paragraph in InDesign.

               

              So then  you can say:

               

              myPara = app.selection[0];

               

              then the lines in this paragraph are:

               

              myLines = myPara.lines;

               

              so now you can do a loop:

               

              for (var i =0; i<myLines.length; i++){

               

              now let's say you've set you app.findTextPreferences and app.changeTextPreferences to whatever you want, you can search the line as follows:

               

              myFinds = myLines[i].findText();

               

              and the last find on the line will be:

               

              myFinds[-1]

               

              so you can change that to whatever you want:

               

              myFinds[-1].contents = "Z";

              }

               

              If you want to substitute justification alternatives with regular letters it's obviously a little more complicated (you've got to find the unicode values, etc.) but this is the basic idea.

               

              One thing you've got to be careful about is that if you make a replacement, the lines shouldn't change. If the line breaks change, myLines will no longer be valid and you can get some weird results.

               

              HTH,

              Ariel

              • 4. Re: Finding the end of line
                Sami Artur Community Member

                Thank's again Ariel,

                I am a beginner in Java Script and I don't know what I am doing wrong.

                Please take a look:

                 

                main();

                function main(){

                          mySetup();

                          mySnippet();

                          myTeardown();

                }

                function mySetup(){

                }

                function mySnippet(){

                          if (app.documents.length != 0){

                                    if (app.selection.length == 1){

                                              switch (app.selection[0].constructor.name){

                                                        case "InsertionPoint":

                                                        case "Character":

                                                        case "Word":

                                                        case "TextStyleRange":

                                                        case "Line":

                                                        case "Paragraph":

                                                        case "TextColumn":

                                                        case "Text":

                                                        case "Story":

                                                                  myProcessText(app.selection[0]);

                                                        break;

                                                        case "TextFrame":

                                                                  myProcessText(app.selection[0].texts.item(0));

                                                                  break;

                                                        default:

                                                                  alert("The selected object is not a text object. Select some text and try again.");

                                                                  break;

                                              }

                                    }

                                    else{

                                              alert("Please select some text and try again.");

                                    }

                          }

                }

                function myTeardown(){

                }

                function myProcessText(myTextObject){

                }

                var myDocument = app.documents.item(0);

                var myPage = myDocument.pages.item(0);

                var myTextFrame = myPage.textFrames.item(0);

                var myTextObject = myTextFrame.parentStory.characters.item(0);

                var myStory = myDocument.stories.item(0);

                var myStringArray = myTextFrame.lines.everyItem().contents;

                myPara = app.selection[0];

                myLines = myPara.lines;

                for (var i =0; i<myLines.length; i++){

                    myFinds = myLines[i].findText(ת);

                myFinds[-1].contents = "z";

                }

                Sami

                • 5. Re: Finding the end of line
                  Jump_Over Community Member

                  Hi,

                  Assuming your text is inside one or more text frames which are connected. Select one of them and run this:

                   

                  -------------

                  myLines = app.selection[0].parentStory.lines;

                  for (k=0; k<myLines.length; k++){

                       if(myLines[k].characters[-1] == "\r")                         // if there is an end of paragraph

                            myLines[k].characters[-2].contents = "z";          // change a second last character to "z"

                       else myLines[k].characters[-1].contents = "z";     // otherwise change a last character to "z"

                  }

                   

                  ------------

                   

                  This is just for show the way.

                  Hope you step into

                  • 6. Re: Finding the end of line
                    Sami Artur Community Member

                    Thank you very much Jump_Over!

                    It works!

                    Now I am doing the final adjustments.

                    Sami

                    • 7. Re: Finding the end of line
                      Peter Stnsz Community Member

                      Hi there!

                       

                      I am trying to figure out how to modify the script that can look for last one or two last words (widows/orphans) in the line that starts after the period. Would script be able to add No Break GREP or character style?

                       

                      Peter

                      • 8. Re: Finding the end of line
                        Jump_Over Community Member

                        Hi,

                         

                        It could work with nested Grep which is applying "noBreak" charStyle.

                         

                        expression for the last word: \x{20}\b\w+\b.$

                        expression for two last words: (\x{20}\b\w+\b){2}.$

                         

                        Jarek

                        • 9. Re: Finding the end of line
                          Peter Stnsz Community Member

                          Hi Jarek,

                           

                          Thank you for the answer. Your GREP works, however not the way I wanted. Works quite similar to the solution that I am using at the moment: nested NoBreak style with GREP .{8}$ (so It won't leave any short words at the end of the paragraph).

                           

                          The solution I am looking for is to find a script that will push these words to the next line (within the paragraph, not only at the end of the paragraph), here is what I mean - I would like to move this 'orphan' word to the next line:

                          Screen Shot 2013-10-23 at 08.26.15.png

                          I presume I will be not able to make that with GREP itself?

                           

                          Peter

                          • 10. Re: Finding the end of line
                            Jump_Over Community Member

                            Hi,

                             

                            so maybe try:

                            \b.{2}\b\s

                             

                            Jarek

                            • 11. Re: Finding the end of line
                              Peter Stnsz Community Member

                              Hello Jarek,

                               

                              This will actually work. Thanks!