10 Replies Latest reply on Apr 28, 2015 12:38 PM by Obi-wan Kenobi

    Tomorrow date with text variable

    Stan781003

      Hi folks, I need way to create a text variable that has tomorrow date. Actually, I need few text variable: tomorrow date, today date + 6, 7, 8 days. How do I make them update after saving, like the modification date updates when I push "Ctrl+S"? From Russia with love!

        • 1. Re: Tomorrow date with text variable
          Obi-wan Kenobi Adobe Community Professional

          Curious too! 

          • 2. Re: Tomorrow date with text variable
            Marc Autret Level 4

            Hi stan,

             

            A day is 86,400,000 milliseconds, so considering the today Date object timestamp and adding N×864e5 will give you the timestamp of today+N.

             

            E.g.

            var N = 1; // 1 for tomorrow, etc
            
            // Show me today+N
            // ---
            alert( new Date(N*864e5 + (+new Date)) );
            
            

             

            Now, what you probably have to do is to manage your text variable through a Document.BEFORE_SAVE event or something. This topic has been already addressed, I suppose.

             

            @+

            Marc

            • 3. Re: Tomorrow date with text variable
              Obi-wan Kenobi Adobe Community Professional

              Bonsoir Marc (en français, parce que je ne suis pas un spécialiste de JavaScript),

               

              Est-il envisageable de créer une variable du genre "date du lendemain" en utilisant la syntaxe :

               

              createTextVariable(doc, ......, ......)

               

              et ce, de telle façon que l'on puisse la modifier simplement dans InDesign pour qu'elle devienne "date du surlendemain" ?

               

              [ par curiosité, qui devient légendaire ! ]

              • 4. Re: Tomorrow date with text variable
                Marc Autret Level 4

                Bonsoir Obi-wan,

                 

                Non, il convient de ne se faire aucune illusion sur l'objet TextVariable tel qu'il est implémenté aujourd'hui dans InDesign.

                 

                On ne peut pas « injecter du code » dans cet objet pour en faire un vrai champ dynamique. À part quelques types prédéfinis (numéro de chapitre, date de création, nom de fichier, dernier numéro de page, etc.), une variable de texte n'est rien de plus qu'un champ statique mis à jour par l'utilisateur. Même par la magie du scripting on ne peut pas créer une variable intelligente qui refléterait automatiquement la date du surlendemain, le nombre de chapitres du document ou le volume de café que j'ai bu aujourd'hui. C'est d'ailleurs, personnellement, ce que je reproche à cet objet. Les développeurs d'InDesign en auraient fait un truc génial si on avait pu effectivement attacher un code quelconque — du type gestionnaire d'événement. Mais ce n'est nullement le cas.

                 

                Pour répondre plus techniquement : le scripting ne permet pas de créer un nouveau « type » de variable. Tout ce qui est faisable — sauf à passer peut-être par le SDK — est de contrôler une variable de texte à travers des événements utilisateurs (ouverture, fermeture, enregistrement de document, etc.) de telle sorte que ladite variable reçoive une nouvelle valeur actualisée. Ce n'est pas un processus natif, il faut le coder. La variable en elle-même reste une coquille vide. C'est le script de gestion d'événements qui pourra éventuellement lui donner la nature, postiche, d'un champ automatisé.

                 

                @+

                Marc

                • 5. Re: Tomorrow date with text variable
                  Obi-wan Kenobi Adobe Community Professional

                  Marc,

                   

                  Merci pour ta réponse !

                   

                  Je ne reviendrai pas sur le nombre de tasses de café que tu as pu boire aujourd'hui, pas plus que les autres jours ! Nous devons friser les mêmes sommets, ce qui devrait ceci dit nous permettre de concevoir une variable "Café" assez fiable, voire universelle ! 

                   

                  Je reprécise ma question :

                  Qu'est-ce qui rendrait rédhibitoire la création d'une variable statique basée sur une date dd/mm/yyyy, du genre (dd/mm/yyyy)+1 mise à jour à l'ouverture du fichier ID ?

                   

                  Merci encore ! 

                  • 6. Re: Tomorrow date with text variable
                    Marc Autret Level 4

                    Obi-wan Kenobi a écrit:

                     

                    Je reprécise ma question :

                    Qu'est-ce qui rendrait rédhibitoire la création d'une variable statique basée sur une date dd/mm/yyyy, du genre (dd/mm/yyyy)+1 mise à jour à l'ouverture du fichier ID ?

                     

                     

                    Je reprécise ma réponse : il n'y a absolument rien qui s'y oppose ! On peut tout à fait concevoir — via un script de démarrage — un processus mettant à jour une variable de texte à la valeur J+1. De même qu'on peut concevoir un processus mettant à jour n'importe quoi d'autre dans le document cible (gabarit, titrages, métadonnées, etc.). Ce que je voulais souligner, c'est qu'il n'y a rien dans cette affaire qui soit propre aux variables de texte, ces dernières n'apportent aucune valeur ajoutée en termes d'automatisation (exception faite des champs dynamiques prédéfinis). Le process recherché implique la gestion d'événements à titre essentiel, alors qu'il n'implique la gestion de variables qu'à titre accessoire. Mais il n'y a aucune difficulté à modifier via un script la valeur d'une variable*, pas plus qu'il n'y a de difficulté à calculer J+1 (comme démontré plus haut).

                     

                    * C'est un code du genre myTextVariable.variableOptions.contents = "Nouvelle valeur" (pour les variables de type « texte personnalisé »).

                     

                    En conclusion, soyez assuré que quelqu'un postera ici-même un script qui fera le job. (Même que ça pourrait être moi, si j'arrêtais un peu de discutailler ;-)

                     

                    @+

                    Marc

                    • 7. Re: Tomorrow date with text variable
                      Obi-wan Kenobi Adobe Community Professional

                      Bonjour Marc,

                       

                      J'ai retrouvé dans un dossier "Fourre-Tout_DomainePublic" un bout de code dont j'ignore totalement l'auteur, la date et la version d'ID ciblée et je m'en excuse totalement auprès de son auteur qui, je l'espère, se reconnaîtra et nous fera signe.

                       

                      Serait-ce un point de départ utilisable ?

                       

                      Code :

                       

                      #targetengine 'usernameVariable'

                      function addVariables(openEvent){

                      var doc = openEvent.parent;

                      while ( doc.constructor.name != "Document" )

                      {

                      if ( doc.constructor.name == "Application" ){ return; }

                      doc = doc.parent;

                      }

                      createTextVariable(doc, "Jour+1", ..............................);

                      }

                      function createTextVariable(target, variableName, variableContents){

                      var usernameVariable = target.textVariables.itemByName(variableName);

                      if(!usernameVariable.isValid){

                      usernameVariable = target.textVariables.add();

                      usernameVariable.variableType = VariableTypes.CUSTOM_TEXT_TYPE;

                      usernameVariable.name = variableName;

                      }

                      usernameVariable.variableOptions.contents = variableContents;

                      }

                      app.addEventListener('afterOpen', addVariables);

                      • 8. Re: Tomorrow date with text variable
                        [Jongware] Most Valuable Participant

                        Obi-wan, mais certain mon ami! It's basically as simple as getting the current date, adding 1 day, and converting it to a string. I see only one single problem: how do you want to format this date?

                         

                        Default conversion to a full date seems to be "Tuesday, April 28 2015 00:07:12", which may or may not be what the OP wants (and I'm guessing it's not). The built-in Date variables allow you to build a conversion string manually, by specifying the order and display type of information; but you cannot use this inside a Custom Text variable because as soon as you change its contents, the formatting string will be lost.

                        The best way would be to do this in the Javascript itself, by not using "toLocaleString" but getFullYear, getDay, and getMonth, and pasting all together as desired.

                         

                        By the way: "... make them update after saving", well, it makes more sense on opening a existing document (which is why Obi-wan suggests 'afterOpen'). That way you will see the correct value in your document right away.

                         

                        #targetengine 'usernameVariable'
                        function addVariables(openEvent)
                        {
                          var doc = openEvent.parent;
                          while ( doc.constructor.name != "Document" )
                          {
                            if ( doc.constructor.name == "Application" ){ return; }
                            doc = doc.parent;
                          }
                          // from http://stackoverflow.com/questions/563406/add-days-to-datetime
                          var today = new Date();
                          var tomorrow = new Date(today);
                          tomorrow.setDate(today.getDate()+1);
                        
                          createTextVariable(doc, "Jour+1", tomorrow.toLocaleString());
                        }
                        
                        function createTextVariable(target, variableName, variableContents)
                        {
                          var usernameVariable = target.textVariables.itemByName(variableName);
                          if (!usernameVariable.isValid)
                          {
                            usernameVariable = target.textVariables.add();
                            usernameVariable.variableType = VariableTypes.CUSTOM_TEXT_TYPE;
                            usernameVariable.name = variableName;
                          }
                          usernameVariable.variableOptions.contents = variableContents;
                        }
                        
                        app.addEventListener('afterOpen', addVariables);
                        
                        
                        • 9. Re: Tomorrow date with text variable
                          Marc Autret Level 4

                          Here it is ;-)

                          cc Obi-wan

                           

                          @+

                          M

                          • 10. Re: Tomorrow date with text variable
                            Obi-wan Kenobi Adobe Community Professional

                            Merci Jongware ! C'est assez cool de voir fonctionner cette variable !    [ Marc, bien vu ! ]

                             

                            Je m'interroge sur une extension de cette approche, disons plus intéressante : Imaginons un document comportant beaucoup de dates … mais calculées sur une date "de référence" : par ex. le 1er Janvier 2015 ! on trouvera dès lors des dates calculées à partir de cette date [1er Janvier 2015] comme 3 janvier 2015, 31 juillet 2015, 24 décembre 2015, 17 janvier 2016, …

                            Ce document est mise à jour et le 1er Janvier 2015 devient le 28 avril 2015 !!!!! Comme on dit en France, cela va devenir un beau bordel ! 

                             

                            Peut-on dès lors envisager, sur la base d'une variable de référence [Jour J], la création/calcul de toute variable du style "J + 2", "J + 211" … ?

                            [ Variables, tant la variable "J" que ses variables-filles, bien évidemment définies par l'Op dans le script ! ]

                             

                            Merci d'avance !