• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

[JS] Script optimization / optimisation de Script

Enthusiast ,
Nov 25, 2020 Nov 25, 2020

Copy link to clipboard

Copied

Good morning all, I realize a new sccript which runs on Indesgn 2021 (16), but I find it very lang, I wish to make apple to you to achieve the optimized, for my part I noticed that the script torn very well on the version 2019 and very slowly into 2020 and 2021, I guess I don't have a very good schedule for these versions!

This script is in progress, it is not finished, there are still errors in the senario but it is already doing the basic work.

thank you to all of you

/-------------

Bonjour à tous,

Je réalise un nouveau sccript qui tourne su Indesgn 2021 (16), mais je le trouve très lang, je souhate faire apple à vous pour parvenir à l'optimisé, pour ma part j'ai constaté que des scripte torné très bien sur la version 2019 et très lentement sur 2020 et 2021, je supose que je ne dois pas très bien programmé pour ces version !

Se script est en chantier, il n'est pas fini, il reste des erreure dans le senario mais il fait déjà le travail basique.

 

Merci à vous tous

 

 

 

// ---------------------------------------------
//  Creation d'une ncre de text sur la section active
//  
//  © Philippe Ruelle
//  
//  --------------------------------------------- 

// 1 selection la phrase
// 2 faire une recheche sur les styles bien presi et compare les contenus





// test sur la selection 

if (app.documents.length > 0){ // IF 01 
        
    var laSelection = app.selection[0];
    
       
      
    for (var y = 0; y < laSelection.paragraphs.length; y++) {
            
           
            var newText = laSelection.paragraphs[y].contents.replace(/[^\w]/g,"");
                  
       
             laRecherchez(newText,laSelection.paragraphs[y].appliedParagraphStyle.name,laSelection.paragraphs[y]);
             //laSelection.paragraphs[y].fillColor = "Hyper";
        }

} else {
        alert("Ouvrir un document et selectioné votre text."); 

} // fin du IF 01       

// nettyage

// les fonctions Générals 
// recheche sur les titre 

function laRecherchez(leTitre, leStyle, leDepart) {
    // recheche ou test sur les paragraphe ???? on va test la recheche
       
        // corespondance des Style du plan avec les style de la mise en page  a COMPLETE !!!
        var lesStyle = {'PLAN-a-Section':'Titre Section', 'PLAN-b-Para':'Titre para','PLAN-c-A':'Titre 01 Autre','PLAN-d-i':'Titre 02','PLAN-e-a':'Titre 03','PLAN-f-1':'Titre 04'}; // Problème sur les AT  ex : 'Titre 02 AT'
        var laDestination;
        
       // $.writeln(lesStyle['PLAN-a-Section']);
        
        app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
    
        with (app.findGrepPreferences){
            //findWhat = ""; // la commande de la recheche
            //fillColor = "Liens"; // sur la couleur
            appliedParagraphStyle = lesStyle[leStyle];   // sur le stile de paragraphe (voir sur les style de titres)
        } // fin 

        var lesRecherches = app.activeDocument.findGrep();
        //$.writeln('lesRecherche : ' + lesRecherches.length))
        for (var i = 0; i < lesRecherches.length; i++) {
            // ICI faire boucles ... pour tous les para de la selection
            //$.writeln('lesRecherche : ' + lesRecherches[i].contents.replace(/[^\w]/g,""))
            if (lesRecherches[i].contents.replace(/[^\w]/g,"") == leTitre){
                laDestination = laCreationAncre(lesRecherches[i].contents.replace(/[^\w]/g,""), lesRecherches[i]);
                var source = app.activeDocument.hyperlinkTextSources.add(leDepart); /// creation 
                app.activeDocument.hyperlinks.add(source, laDestination).name = leTitre; // problème de titre identique retrava
                i = lesRecherches.length;    
                leDepart.fillColor = "Hyper";
            } else {
                leDepart.fillColor = "DOUTE";
            }
        }
        // test coparatif et creation de l'ancre
}

function laCreationAncre (leName, laSelectionFind) {
   // 
   //   ATTENTION peut-être reduire le nom de hyperlinkTextDestinations et ajouté une numero unique 
   //   
   //   Retourné le nom de l'ancre pour cree le lien
   //
    try {
        if (!app.activeDocument.hyperlinkTextDestinations.itemByName(leName).isValid) {
            var hypTextDest = app.activeDocument.hyperlinkTextDestinations.add(laSelectionFind);
            hypTextDest.name = leName;
        }
    }
    catch(e) {
        $.writeln('erreur Ancre')
    }
    return hypTextDest;    
}

 

 

 

TOPICS
Scripting

Views

355

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 25, 2020 Nov 25, 2020

Copy link to clipboard

Copied

Not exactly sure why you would be experiencing a slowdown between versions, but in general, you want to limit your calls to Regex and the InDesign DOM as much as possible by defining variables outside for loops as much as possible. I also find using GetElements on a collection works much faster. Looking at the top few lines of code, here is how I would optimize: 

 

 

if (app.documents.length > 0){ // IF 01 
        
    var laParagraphs = app.selection[0].paragraphs.everyItem().getElements();
    var numParagraphs = laParagraphs.length;
    var repRegex = /[^\w]/g;
    var newText, y, laPara, applyName;  
    for (y = 0; y < numParagraphs; y++) {
        laPara = laParagraphs[y];   
        newText = laPara.contents.replace(repRegex,"");
        applyName = laPara.appliedParagraphStyle.name;
        laRecherchez(newText, applyName, laPara);
             //laSelection.paragraphs[y].fillColor = "Hyper";
    }

} else {
        alert("Ouvrir un document et selectioné votre text."); 

} // fin du IF 01

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 28, 2020 Nov 28, 2020

Copy link to clipboard

Copied

Thank you Brianp311,

This is better written, unfortunately it does not solve the problem, my problem must be located in the search with the function with the Find

 

Merci Brianp311,

Cela est meiux écrit, malheureusement ca ne solutione pas le problème, mon problème dois se situé dans le recheche avec la fonction avec le Find

 

 

function laRecherchez(leTitre, leStyle, leDepart) {
        var lesStyle = {'PLAN-a-Section':'Titre Section', 'PLAN-b-Para':'Titre para','PLAN-c-A':'Titre 01 Autre','PLAN-d-i':'Titre 02','PLAN-e-a':'Titre 03','PLAN-f-1':'Titre 04'}; // Problème sur les AT  ex : 'Titre 02 AT'
        
var laDestination;
        
        
        app.findGrepPreferences = app.changeGrepPreferences = NothingEnum.nothing;
    
        with (app.findGrepPreferences){
            appliedParagraphStyle = lesStyle[leStyle];   
        }
        var lesRecherches = app.activeDocument.findGrep();
        for (var i = 0; i < lesRecherches.length; i++) {
            
            if (lesRecherches[i].contents.replace(/[^\w]/g,"") == leTitre){
                laDestination = laCreationAncre(lesRecherches[i].contents.replace(/[^\w]/g,""), lesRecherches[i]);
                var source = app.activeDocument.hyperlinkTextSources.add(leDepart); /// creation 
                app.activeDocument.hyperlinks.add(source, laDestination).name = leTitre; // problème de titre identique a retravallier
                i = lesRecherches.length;    
                leDepart.fillColor = "Hyper";

            } else {
                leDepart.fillColor = "DOUTE";
            }
        
        }

    

 

 

 

I have exactly the same problem in another script, and I located the problem in a "find" function which is 6 sec. on a 2018 Indesign and on a 2021 Indesign ... I had to shut down after 1 hour it moved forward, some of the add of "@@@" ...

and the problem is there:

 

 

J’ai exctement le même problème dans un autre script, et j’ai localisé le problème dans une fonction "find" qui m’est 6 sec. sur un Indesign 2018 et sur un Indesign 2021 ... j'ai du l’arreté après 1 heure il avanit fait une partie des ajoute de "@@@"... 

 

et le problème est là :

 

 

 

function notesVersBlocs() {
   
               //
$.writeln("notesVersBlocs" + logHeure () );
       var monDoc = app.activeDocument;
// traiter tous les articles
        for( var i = 0; i < monDoc.stories.length; i++ ) {
        // obtenir une référence aux notes d’un article
                var mesNotes = monDoc.stories[i].footnotes;
                //$.writeln(mesNotes.length);
                for( var j = 0; j < mesNotes.length; j++ ) {
                    
                    if (mesNotes[j].paragraphs.length == 1){
                        mesNotes[j].insertionPoints[-1].contents = '@@@';
                    }  
                }
            }
}

 

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 28, 2020 Nov 28, 2020

Copy link to clipboard

Copied

I think I am closer to a problem of refreshing or placing texts by indesign, than a problem with the script !! (???)

 

Je pense être plus proche d'un problème de rafraichissement ou de placement de textes par indesign, que d'un problème de script !!(???)

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 28, 2020 Nov 28, 2020

Copy link to clipboard

Copied

Here is that function refactored. Also, making the insertion could be causing unforeseen problems. I've added a try/catch block to see if you can pinpoint it. It coulds also be that mesNotes.paragraphs is throwing an error if the footnote is not defined properly *(ie empty). Maybe try an 'mesNotes[i].isValid' check too?

 

function notesVersBlocs() {
   
               //
$.writeln("notesVersBlocs" + logHeure () );
       var monDoc = app.activeDocument;
       var monStories = monDoc.stories.everyItem().getElements();
       var numStories = monStories.length;
       var mesNotes, numNotes, footPars;
// traiter tous les articles
        for( var i = 0; i < numStories; i++ ) {
        // obtenir une référence aux notes d’un article
                mesNotes = monStories[i].footnotes.everyItem().getElements();
                numNotes = mesNotes.length;
                //$.writeln(mesNotes.length);
                for( var j = 0; j < numNotes; j++ ) {
                    try {
                        if (mesNotes[j].paragraphs.length == 1){
                            mesNotes[j].insertionPoints[-1].contents = '@@@';
                        }
                    } catch(e) { 
                        $.writeln("Could not insert @@@ for footnote: " + mesNotes[j].contents + ". " + e);
                    }  
                }
            }
}

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 29, 2020 Nov 29, 2020

Copy link to clipboard

Copied

Thank you very much, for the function "function notesVersBlocs ()" indeed it brings a gain of speed with a better management of errors, but indeed Indisegn has trouble with this file 450 pages and 900 footnotes, it's not no more extraordinary.

For the script at the beginning of the message I made some modification, it's still not a gas machine but I'm working on it (it's still the same 450-page doc).

I put the script back:

//----------------------

Merci beaucoup, pour la fonction "function notesVersBlocs()" effectivement cela apporte un gain de rapidité avec une mellieur gétion des erreurs, mais effectivement Indisegn a du mal avec ce fichier 450 pages et 900 notes de bas de page, c'est pas non plus extraordinaire.

 

Pour le script du début de message j'ai apporté quelque modification c'est toujours pas une machine à gaz mais j'y travail (c'est tooujours le même doc de 450 pages).

je remet le script :

 

// ---------------------------------------------
//  Creation d'une ncre de text sur la section active
//  
//  © Philippe Ruelle
//  
//  --------------------------------------------- 

// 1 selection la phrase
// 2 faire une recheche sur les styles bien presi et compare les contenus


// test sur la selection 

if (app.documents.length > 0){ // IF 01 
        // creation de variable 
        //var laSelection = app.selection[0];
    var laParagraphs = app.selection[0].paragraphs.everyItem().getElements();
    var numParagraphs = laParagraphs.length;
    var repRegex = /[^\w]/g;
    var monDoc = app.activeDocument;
    var newText, y, laPara, applyName; 
       
    
    for (y = 0; y < numParagraphs; y++) {
        laPara = laParagraphs[y];   
        newText = laPara.contents.replace(repRegex,"");
        applyName = laPara.appliedParagraphStyle.name;
        
        laRecherchez(newText, applyName, laPara, monDoc);
        //laSelection.paragraphs[y].fillColor = "Hyper";
    }


} else {
        alert("Ouvrir un document et selectioné votre text."); 

} // fin du IF 01       

// nettyage

// les fonctions Générals 
// recheche sur les titre 

function laRecherchez(leTitre, leStyle, leDepart, leDoc) {
    $.writeln("laRecherchez (D): " + logHeure () );
    $.writeln("laRecherchez (leTitre): " + leTitre );
    // recheche ou test sur les paragraphe ???? on va test la recheche
       
        // corespondance des Style du plan avec les style de la mise en page  a COMPLETE !!!
        var lesStyle = {'PLAN-a-Section':'Titre Section', 'PLAN-b-Para':'Titre para','PLAN-c-A':'Titre 01 Autre','PLAN-d-i':'Titre 02','PLAN-e-a':'Titre 03','PLAN-f-1':'Titre 04'}; // Problème sur les AT  ex : 'Titre 02 AT'
        var laDestination, source;
        
        
        app.findGrepPreferences = NothingEnum.nothing;
        app.changeGrepPreferences = NothingEnum.nothing;
    
        with (app.findGrepPreferences){
            //findWhat = ""; // la commande de la recheche
            //fillColor = "Liens"; // sur la couleur
            appliedParagraphStyle = lesStyle[leStyle];   // sur le stile de paragraphe (voir sur les style de titres)
        } // fin 

        var lesRecherches = leDoc.findGrep();
        var numlesRecherches = lesRecherches.length;
        
        //$.writeln('lesRecherche : ' + lesRecherches.length))
        for (var i = 0; i < numlesRecherches; i++) {
            // ICI faire boucles ... pour tous les para de la selection
            //$.writeln('lesRecherche : ' + lesRecherches[i].contents.replace(/[^\w]/g,""))
            
            if (lesRecherches[i].contents.replace(repRegex,"") == leTitre){
                laDestination = laCreationAncre(lesRecherches[i].contents.replace(repRegex,""), lesRecherches[i]);
                source = leDoc.hyperlinkTextSources.add(leDepart); /// creation 
                leDoc.hyperlinks.add(source, laDestination).name = leTitre; // problème de titre identique retrava
                i = numlesRecherches;    
                leDepart.fillColor = "Hyper";

            } else {
                leDepart.fillColor = "DOUTE";
            }
        
        }

        // test coparatif et creation de l'ancre
        $.writeln("laRecherchez (F): " + logHeure () );

}

function laCreationAncre (leName, laSelectionFind) {
   // 
   //   ATTENTION peut-être reduire le nom de hyperlinkTextDestinations et ajouté une numero unique 
   //   
   //   Retourné le nom de l'ancre pour cree le lien
   //
   $.writeln("laCreationAncre (D): " + logHeure () );
    try {
            if (!app.activeDocument.hyperlinkTextDestinations.itemByName(leName).isValid) {
                    var hypTextDest = app.activeDocument.hyperlinkTextDestinations.add(laSelectionFind);
                hypTextDest.name = leName;
            }
     }
    catch(e) {
        $.writeln('erreur Ancre. ' + e)
    }
    $.writeln("laCreationAncre (F): " + logHeure () );
    return hypTextDest;    
}
function logHeure () {
    // Recupération de l'heure pour le Log. 
        var ladate=new Date();
        var h = ladate.getHours();
        var m = ladate.getMinutes();
        var s = ladate.getSeconds();
        var mi = ladate.getMilliseconds();
            return (" "+ ((h<10) ?  "0" + h : h) +":"+ ((m<10) ?  "0" + m : m )+":"+ ((s<10) ? "0" + s : s)+":"+ ((s<100) ? "0" + mi : mi));
}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 29, 2020 Nov 29, 2020

Copy link to clipboard

Copied

Again, not sure what's going on, but replacing the string twice could be slowing it down. Here it is refactored. Also, I don't know the purpose of the line i = numlesRecherches; . A simple break; statement might be more efficient. You could also NothingEnum the app find/change preferences at the start of the script, since they'll be replaced through each iteration. 

 

function laRecherchez(leTitre, leStyle, leDepart, leDoc) {
    $.writeln("laRecherchez (D): " + logHeure () );
    $.writeln("laRecherchez (leTitre): " + leTitre );
    // recheche ou test sur les paragraphe ???? on va test la recheche     
    // corespondance des Style du plan avec les style de la mise en page  a COMPLETE !!!
    var lesStyle = {'PLAN-a-Section':'Titre Section', 'PLAN-b-Para':'Titre para','PLAN-c-A':'Titre 01 Autre','PLAN-d-i':'Titre 02','PLAN-e-a':'Titre 03','PLAN-f-1':'Titre 04'}; // Problème sur les AT  ex : 'Titre 02 AT'
    var laDestination, source;
    app.findGrepPreferences = NothingEnum.nothing;
    app.changeGrepPreferences = NothingEnum.nothing;
    
    with (app.findGrepPreferences){
        //findWhat = ""; // la commande de la recheche
        //fillColor = "Liens"; // sur la couleur
        appliedParagraphStyle = lesStyle[leStyle];   // sur le stile de paragraphe (voir sur les style de titres)
    } // fin 

    var lesRecherches = leDoc.findGrep();
    var numlesRecherches = lesRecherches.length;
    var leReplace; 
    //$.writeln('lesRecherche : ' + lesRecherches.length))
    for (var i = 0; i < numlesRecherches; i++) {
        leReplace = lesRecherches[i].contents.replace(/[^\w]/g,"");     
        // ICI faire boucles ... pour tous les para de la selection
        //$.writeln('lesRecherche : ' + )
            
        if (leReplace == leTitre){
            laDestination = laCreationAncre(leReplace, lesRecherches[i]);
            source = leDoc.hyperlinkTextSources.add(leDepart); /// creation 
            leDoc.hyperlinks.add(source, laDestination).name = leTitre; // problème de titre identique retrava
            i = numlesRecherches;    
            leDepart.fillColor = "Hyper";

        } else {
            leDepart.fillColor = "DOUTE";
        }
        
        }

        // test coparatif et creation de l'ancre
        $.writeln("laRecherchez (F): " + logHeure () );

}

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Enthusiast ,
Nov 30, 2020 Nov 30, 2020

Copy link to clipboard

Copied

thank you very much for your help This allowed me to correct the script.

He does a total of 640 tests on the titles in 13 sec.

//------------------------------

Merci beaucoup pour ton aide

ca ma permis de corrigé le script.

Il fais en totale quand même 640 tests de comparaisson sur les titres en 13 sec.

 

 

// ---------------------------------------------
//  Creation d'une ncre de text sur la section active
//  
//  © Philippe Ruelle
//  
//  --------------------------------------------- 

// 1 selection la phrase
// 2 faire une recheche sur les styles bien presi et compare les contenus

// test sur la selection 
        //
        $.writeln("Debut du script: " + logHeure () );

if (app.documents.length > 0){ // IF 01 
        // creation de variable 
        //var laSelection = app.selection[0];
    var laParagraphs = app.selection[0].paragraphs.everyItem().getElements();
    var numParagraphs = laParagraphs.length;
    var repRegex = /[^\w]/g;
    var monDoc = app.activeDocument;
    var newText, y, laPara, applyName;
    app.findGrepPreferences = NothingEnum.nothing; 
       
    
    for (y = 0; y < numParagraphs; y++) {
        laPara = laParagraphs[y];   
        newText = laPara.contents.replace(repRegex,"").slice(0,40);
        applyName = laPara.appliedParagraphStyle.name;
        laRecherchez(newText, applyName, laPara, monDoc);
    }


} else {
        alert("Ouvrir un document et selectioné votre text."); 

} // fin du IF 01       
$.writeln("Fins du script : " + logHeure () );

// nettyage

// les fonctions Générals 
// recheche sur les titre 

function laRecherchez(leTitre, leStyle, leDepart, leDoc) {
    
    // recheche ou test sur les paragraphe ???? on va test la recheche
       
        // corespondance des Style du plan avec les style de la mise en page  a COMPLETE !!!
        var lesStyle = {'PLAN-a-Section':'Titre Section', 'PLAN-b-Para':'Titre para','PLAN-c-A':'Titre 01 Autre','PLAN-d-i':'Titre 02','PLAN-e-a':'Titre 03','PLAN-f-1':'Titre 04'}; // Problème sur les AT  ex : 'Titre 02 AT'
        var laDestination, source, laFindTitre;
       
            app.findGrepPreferences.appliedParagraphStyle = lesStyle[leStyle];

        var lesRecherches = leDoc.findGrep();
        var numlesRecherches = lesRecherches.length;
       
            //$.writeln('lesRecherche : ' + lesRecherches.length))
        for (var i = 0; i < numlesRecherches; i++) {
            // ICI faire boucles ... pour tous les para de la selection
            laFindTitre = lesRecherches[i].contents.replace(repRegex,"").slice(0,40);
            if (laFindTitre == leTitre){
                laDestination = laCreationAncre(laFindTitre, lesRecherches[i]);
                
                source = leDoc.hyperlinkTextSources.add(leDepart); /// creation 
                
                try {
                        leDoc.hyperlinks.add(source, laDestination).name = leTitre; // problème de titre identique retrava
                    }
                    catch(e) {
                        $.writeln('erreur Ancre. ' + e)
                        leDoc.hyperlinks.add(source, laDestination).name = leTitre + logHeure();
                }
                
                leDepart.fillColor = "Hyper";
                break; 
            } 
        }

     

}

function laCreationAncre (leName, laSelectionFind) {
   // 
   //   ATTENTION peut-être reduire le nom de hyperlinkTextDestinations et ajouté une numero unique 
   //   
   //   Retourné le nom de l'ancre pour cree le lien
   //
   //$.writeln("laCreationAncre (D): " + logHeure () );
    try {
            if (!app.activeDocument.hyperlinkTextDestinations.itemByName(leName.slice(0,40)).isValid) {
                var hypTextDest = app.activeDocument.hyperlinkTextDestinations.add(laSelectionFind);
                    hypTextDest.name = leName;
            }           
     }
    catch(e) {
        $.writeln('laCreationAncre erreur Ancre. ' + e)
    }
    //$.writeln("laCreationAncre (F): " + logHeure () );
    return hypTextDest;    
}
function logHeure () {
    // Recupération de l'heure pour le Log. 
        var ladate=new Date();
        var h = ladate.getHours();
        var m = ladate.getMinutes();
        var s = ladate.getSeconds();
        var mi = ladate.getMilliseconds();
            return (" "+ ((h<10) ?  "0" + h : h) +":"+ ((m<10) ?  "0" + m : m )+":"+ ((s<10) ? "0" + s : s)+":"+ ((s<100) ? "0" + mi : mi));
}

 

 

 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Nov 30, 2020 Nov 30, 2020

Copy link to clipboard

Copied

LATEST

Yeah, I think your bottleneck was passing 

lesRecherches[i].contents.replace(/[^\w]/g,""

to the  

laCreationAncre (leName, laSelectionFind)

function without doing the replace first. 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines