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;
}
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
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 = '@@@';
}
}
}
}
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 !!(???)
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);
}
}
}
}
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));
}
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 () );
}
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));
}
Copy link to clipboard
Copied
Yeah, I think your bottleneck was passing
lesRecherches[i].contents.replace(/[^\w]/g,""
to the
laCreationAncre (leName, laSelectionFind)
function without doing the replace first.