Zack Lovatt

Behance Bitbucket Dribbble LinkedIn Skype Vimeo
October 20, 2012

split() – SourceText from Comp Name

Posted In: expressions

The Idea

Okay, so. You’re working on some lower thirds, and you’ve got your ass-kickin’, award-contendin’ design and animation all worked out and you’re riding your keyframe high only to realize… shit. You’ve got versioning to do. A dozen names and titles, maybe, or region/time zone splits– whatever. You’ve done your pretty-making, and now the grunt work comes in. Open a comp, change the text layer, change the other text layer, duplicate the comp, open it up, change the text layer, change the other text layer, duplicate the comp… Yeah, I’d get tired of it too.

Instead of opening any comp (past initial setup), you can change all the text from your Project Panel and have it propagate into each comp automagically using a handy expression that simplifies the process. Let’s hit it.

We’re going to turn this:
into this:

The Code

We’re going to rely on a method called split(). What this does is break apart a string (some text) into an array, so we can make use of parts of the string independent of others.

As a nice change from my inflated code with odd twists of logic and comments, here’s the expression in all its entirety and glory. This gets applied to the Source Text field of a Text layer." - ")[0]

The Explanation fetches the name of the comp. That’s it– easy enough, and .split() is what pulls it apart.

Looking in our Project panel, you can see our comp name is set up with the dash separating each component. That is, we’ve got Full Name – Title.

We pass the hyphen through the round brackets of split() so it can identify which character(s) will act to split up the text (actually called a delimiter).

So, split(” – “) would give us: “Full Name,” and “Title”– it’s properly fractured the comp name string, as expected.

In order to address either component, we address them in its array like any other property." - ")[0] // results in "Full Name"" - ")[1] // results in "Title"

The Application

If we slot these expressions into the Source Text fields on both our primary and secondary text layers, they’ll now pull their text from the name of the comp, as determined by the array call. From here, we can duplicate the whole composition, change each comp name and end up with a stack of versions with not so much work after all.

Tagged: ,

  1. David Sikes • October 22, 2012

    This is a brilliant solution to a common task that takes up a lot of my time.

    You have done a beautiful job coming up with this. I can't wait to put it to use tomorrow at work on our weekly changing lower-thirds graphics! Reply

    • zack • October 22, 2012

      Thanks, David! Let me know if you have any questions / come across any issues with it! Reply

  2. Andy • October 24, 2012

    Very nice, thanks for the handy tip. Reply

  3. Brad Brown • November 26, 2013

    thanks for the tips!  I use this one almost on daily basis.  Very useful. Reply

  4. Guru Vaidya • April 8, 2014

    Thanks for the tip! This is huge time-saver! Reply

  5. ale • May 14, 2015

    Very nice expression :D Reply

  6. Bart • June 2, 2016

    Hi, is it possible to split twice in one text layer like this:?

    I put this in my text layer: "*, #"

    text_array = text.sourceText.split("*");

    text_array = text.sourceText.split("#");

    When I try this it only works on the last one, so this will show up like this:

    "*, text_2" Reply

    • zack • June 10, 2016

      So-- you're telling it to output two different things, and as that can't happen, it only follows the very last instruction.

      As an alternative, try something like this and it should result in what you're after.

      text_array1 = text.sourceText.split(“*”);
      text1 = text_array[0]+thisComp.layer(“text_1”).text.sourceText+text_array[1];
      text_array2 = text.sourceText.split(“#”);
      text2 = text_array[0]+thisComp.layer(“text_2”).text.sourceText+text_array[1];
      text1 + ", " + text2;


  7. Brett • July 7, 2016

    Great simple solution there, cheers.

    I have been trawling the web, looking for a simple solution to this....

    I have TEXT layers in multiple comps, and I want to control the actual text content from one master COMPOSITION.

    I have tried everything to try and pull the Text file from a text layer, using expressions to no avail, but I am no java guru by a longshot.

    Any ideas you could share?

    Cheers Reply

    • zack • July 7, 2016


      So you have a master comp (we'll name this composition "MASTER"), and you have child comps (we'll name them "CHILD COMP - 1", "CHILD COMP - 2", "CHILD COMP - 3"). The " - " here is important to do an easy split.

      In your master comp, create a text layer ("TEXT"), and split the text up so that each piece of text per comp is on a separate line; it should be structured like this:

      Now, from each child comp, what we need to do is say "Hey, go into MASTER comp, find layer TEXT, get its source text, and grab the contents from line [whatever comp number this is]." (If this is getting too complex, email me! Otherwise you can find a test AEP here (CC2014+))

      Add this expression to the desired text layer within each CHILD COMP.

      // find the "master" comp
      var masterComp = comp("MASTER");
      // get the "TEXT" controller layer
      var sourceTextInMaster = masterComp.layer("TEXT");
      // look at this comp' name, and get whatever is to the right of the " - " -- this should just be a single number. Because of the way that arrays work in Javascript, we need to subtract 1.
      var thisCompIndex =" - ")[1] - 1;
      // Now, put it all together!
      // From the source text layer in comp Master, split the text up into separate lines, and then get line # (whatever this comp's index is)

      Hopefully this helps! In this way, you can have all of your text in one text layer in a master comp, and each child can pull from it without you having to go in and mess with anything yourself. Again-- if you have any questions, email me! (This comment section is pretty limited). Reply

      • Rob • September 6, 2016

        That's a great/awesome solution to Brett's q. As interesting to read as the article! Reply

  8. Jon • October 5, 2016

    Not sure if this is answered above, but I'm essentially trying to have a 3-line lower third graphic based on comp name. I've messed with all the above expressions and I can't quite get it.

    I understand the array/delimiter concept for the two line one, but is a 3rd line with a separate delimiter possible?

    ie: Comp name: JOHN DOE + District Attorney # 1995 - 2000


    District Attorney
    1995 - 2000

    Thanks! Reply

  9. Jon • October 5, 2016

    Nevermind! Got it.

    Just name comp: John Doe-Title-Date

    Then in source text expression, define array, and for each text layer:;

    Pretty sure you could do this with as many lines as you wanted... Reply

Would you like to share your thoughts?

Leave a Reply