[ID CC-CC2021] Переименование линков с условием

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Посмотреть вложение 125264
ну и так далее.
Мне вот только не понятно, почему (это если без замены последних двух строк) если я выключил слэшами первые три строки с объявлением переменных, то они все равно участвуют в подстановках? Откуда он их берет?

В вашем случае мы избавились от этой строки:
var rep_num = fname.replace(/.+[^\d]+([\d]+$)/gim, '$1');

и он вообще ничего найти не может.

Как я понимаю строку
var rep_name = rep_num + prefix + '.' + ext;
мы просто упростили...
Кстати в ней тоже переменная ext, которая объявляется вверху и которую я как и в первом случае выключил слэшами
Нет неправильно понимаете
Первая строка заменяет начало имени на shutterstock (нам это не надо) а мы вместо нее просто добавляем к имени _BIG собственно список файлов показывает что все добавляется правильно. Или я снова не понимаю вашей хотелки?
 

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
Первая строка заменяет начало имени на shutterstock (нам это не надо) а мы вместо нее просто добавляем к имени _BIG собственно список файлов показывает что все добавляется правильно. Или я снова не понимаю вашей хотелки?
Все правильно поняли. Но после закрытия окна в панели Links ничего не меняется. Может ему для присвоения нового имени линка нужно увидеть и сам файл с таким именем?
Вообще странно, что я тыкаю в тут папку, где файлы с таким именем есть, а он их не видит
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
Конечно.Он и ругается на то что таких файлов нет в каталоге
Но в случае без замены двух строк все работает!
Я показываю папку с переименованными файлами и он их оттуда подтаскивает - и у меня в линках новые названия.
А с заменой - только ошибка
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
ну был файл
12345.jpg
стал
12345_BIG.jpg

Вот без замены получается. Я вместо Шаттерстока забил в переменную "_BIG", а вместо "tif" в третью поставил "jpg" и убрал свои слэши, чтобы три первые объявленные переменные заработали.
JavaScript:
#target indesign
#targetengine 'stock-photo'

var ffname = 'stock-photo';
var prefix = '_BIG';
var ext = 'jpg';

function getLinksByName (doc, name) {
    var res = [];
    for (var i = 0; i < doc.links.length; i++) {
        var link = doc.links[i];
        var file = File(link.filePath);
        res.push(link);
    }
    return res;
}

function main () {
    try {
        var doc = app.activeDocument;
    } catch (error) {
        alert('Нет открытых документов!');
        return false;
    }

    var links = getLinksByName(doc, ffname);
    if (links.length == 0) {
        alert('Не обнаружены связанные файлы, имена которых начинаются на "' + ffname +'"');
        return false;
    }
    var fldr = File(links[0].filePath).parent.selectDlg('Выберите папку с файлами для замены');
    if (!fldr) {
        return false;
    }

    var wrong = [];

    for (var i = 0; i < links.length; i++) {
        var link = links[i];
        var file = File(link.filePath);
        var fname = decodeURI(file.name.toString()).replace(/\.[^\.]+$/gim, '');
        var rep_num = fname.replace(/.+[^\d]+([\d]+$)/gim, '$1');
        var rep_name = rep_num + prefix + '.' + ext;
        var rep_file = File(fldr + '/' + rep_name);
        if (rep_file.exists) {
            link.relink(rep_file);
        } else {
            wrong.push(rep_name);
        }
    }

    if (wrong.length != 0) {
        var str = 'Не нейдены:\n' + '"' + wrong.join('", "') + '"';
        alert(str);
    }
}

main();

Вот только убрал вашу замену. Вот это работает
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
да, правильно. Но в линках это не отображается после работы скрипта
То есть я не смогу потом перелинковать в правильную папку - потому что названия не исправились в панельке
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
да, правильно. Но в линках это не отображается после работы скрипта
Бррр
А вот эта левая конструкция мало того что правильно меняет так еще и в линках отображается? %8
Код:
var rep_num = fname.replace(/.+[^\d]+([\d]+$)/gim, '$1');
var rep_name = rep_num + prefix + '.' + ext;
 

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
ага
Я правда не понимаю, что происходит в первой строке)))
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Выделяет цифры в имени файла
Хорошо, если первую строку заменить на
var rep_num = fname;
работает?
 

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
не-а. Тот же результат, что и при замене этих двух строк.
Та же ошибка с теми же правильными именами файла, а после закрывания ошибки - первозданная панелька Links
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
Значит, наверное, эта конструкция чтото полезное делает, сходу не соображу, я ж говорю я в греповских формулировках не особый спец
 

Douglas

Участник
Топикстартер
Сообщения
41
Реакции
0
вот и я тоже)) одного взгляда на нее хватит для головной боли))
 

Oleg Butrin

20 лет на форуме
Сообщения
1 990
Реакции
1 213
JavaScript:
#target indesign
#targetengine 'big-photo'

var prefix = '_BIG';
var ext = 'jpg';

function main () {
    try {
        var doc = app.activeDocument;
    } catch (error) {
        alert('Нет открытых документов!');
        return false;
    }

    var links = doc.links.everyItem().getElements();
    var fldr = File(links[0].filePath).parent.selectDlg('Выберите папку с файлами для замены');
    if (!fldr) {
        return false;
    }

    var wrong = [];

    for (var i = 0; i < links.length; i++) {
        var link = links[i];
        var file = File(link.filePath);
        var fname = decodeURI(file.name.toString()).replace(/\.[^\.]+$/gim, '');
        var rep_name = fname + prefix + '.' + ext;
        var rep_file = File(fldr + '/' + rep_name);
        if (rep_file.exists) {
            link.relink(rep_file);
        } else {
            wrong.push(rep_name);
        }
    }

    if (wrong.length != 0) {
        var str = 'Не нейдены:\n' + '"' + wrong.join('", "') + '"';
        alert(str);
    }
}

main();
 
  • Спасибо
Реакции: Linxy

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
JavaScript:
var rep_num = fname.replace(/.+[^\d]+([\d]+$)/gim, '$1');
var rep_name = rep_num + prefix + '.' + ext;
левая конструкция
Ничё она не левая)
Это же скрипт из моей темы, отлично помог в своё время. Олегу ещё раз респект.
Если смотреть на изначальную тему, то данная строка делает из:
stock-photo-female-red-shoes-on-white-background-90860315.jpg
вот это:
shutterstock_90860315.tif
Т. е. первая строчка ищет в названии файла любые символы до цифры + группу цифр и после этого оставляет только найденную группу цифр. А вторая строчка собирает новое название: prefix (shutterstock_) + группа цифр из первой строки + расширение.
Для ваших первая замена не нужна.
Миша же правильно подсказывал на прошлой странице.
Меняем эти две строки на:
JavaScript:
var rep_name = fname + 'BIG.jpg';
Это раз.
Но кроме того в начале скрипта стоит проверка, чтобы название файла начиналось с "stock-photo-". Достаточно в этой строке оставить пустое значение:
var ffname = '';
И всё будет гуд)

JavaScript:
#target indesign
#targetengine 'stock-photo'

var ffname = '';

function getLinksByName (doc, name) {
    var res = [];
    for (var i = 0; i < doc.links.length; i++) {
        var link = doc.links[i];
        var file = File(link.filePath);
        if (decodeURI(file.name.toString()).indexOf(name) == 0) {
            res.push(link);
        }
    }
    return res;
}

function main () {
    try {
        var doc = app.activeDocument;
    } catch (error) {
        alert('Нет открытых документов!');
        return false;
    }

    var links = getLinksByName(doc, ffname);
    if (links.length == 0) {
        alert('Не обнаружены связанные файлы, имена которых начинаются на "' + ffname +'"');
        return false;
    }
    var fldr = File(links[0].filePath).parent.selectDlg('Выберите папку с файлами для замены');
    if (!fldr) {
        return false;
    }

    var wrong = [];

    for (var i = 0; i < links.length; i++) {
        var link = links[i];
        var file = File(link.filePath);
        var fname = decodeURI(file.name.toString()).replace(/\.[^\.]+$/gim, '');       
        var rep_name = fname + '_BIG.jpg'
        var rep_file = File(fldr + '/' + rep_name);
        if (rep_file.exists) {
            link.relink(rep_file);
        } else {
            wrong.push(rep_name);
        }
    }

    if (wrong.length != 0) {
        var str = 'Не нейдены:\n' + '"' + wrong.join('", "') + '"';
        alert(str);
    }
}

main();
 
  • Спасибо
Реакции: Douglas

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Ой, не успела)
 

Gad

Сообщения
2 975
Реакции
1 408
Это если подойти с другого бока..
 
  • Спасибо
Реакции: Douglas

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 188
Реакции
10 844
JavaScript:
var rep_num = fname.replace(/.+[^\d]+([\d]+$)/gim, '$1');
var rep_name = rep_num + prefix + '.' + ext;

Ничё она не левая)
Это же скрипт из моей темы, отлично помог в своё время. Олегу ещё раз респект.
Если смотреть на изначальную тему, то данная строка делает из:
stock-photo-female-red-shoes-on-white-background-90860315.jpg
вот это:
shutterstock_90860315.tif
Т. е. первая строчка ищет в названии файла любые символы до цифры + группу цифр и после этого оставляет только найденную группу цифр. А вторая строчка собирает новое название: prefix (shutterstock_) + группа цифр из первой строки + расширение.
Для ваших первая замена не нужна.
Миша же правильно подсказывал на прошлой странице.
Меняем эти две строки на:
JavaScript:
var rep_name = fname + 'BIG.jpg';
Это раз.
Но кроме того в начале скрипта стоит проверка, чтобы название файла начиналось с "stock-photo-". Достаточно в этой строке оставить пустое значение:
var ffname = '';
И всё будет гуд)

JavaScript:
#target indesign
#targetengine 'stock-photo'

var ffname = '';

function getLinksByName (doc, name) {
    var res = [];
    for (var i = 0; i < doc.links.length; i++) {
        var link = doc.links[i];
        var file = File(link.filePath);
        if (decodeURI(file.name.toString()).indexOf(name) == 0) {
            res.push(link);
        }
    }
    return res;
}

function main () {
    try {
        var doc = app.activeDocument;
    } catch (error) {
        alert('Нет открытых документов!');
        return false;
    }

    var links = getLinksByName(doc, ffname);
    if (links.length == 0) {
        alert('Не обнаружены связанные файлы, имена которых начинаются на "' + ffname +'"');
        return false;
    }
    var fldr = File(links[0].filePath).parent.selectDlg('Выберите папку с файлами для замены');
    if (!fldr) {
        return false;
    }

    var wrong = [];

    for (var i = 0; i < links.length; i++) {
        var link = links[i];
        var file = File(link.filePath);
        var fname = decodeURI(file.name.toString()).replace(/\.[^\.]+$/gim, '');      
        var rep_name = fname + '_BIG.jpg'
        var rep_file = File(fldr + '/' + rep_name);
        if (rep_file.exists) {
            link.relink(rep_file);
        } else {
            wrong.push(rep_name);
        }
    }

    if (wrong.length != 0) {
        var str = 'Не нейдены:\n' + '"' + wrong.join('", "') + '"';
        alert(str);
    }
}

main();
Да, но от чего тогда у топикстартера замена не работала?
 

Linxy

Девушка с битой
10 лет на форуме
Сообщения
2 277
Реакции
3 836
Да, но от чего тогда у топикстартера замена не работала?
В каком именно месте? Все три страницы что-то не работало.
И я потерялась в ваших правках скрипта.
Видимо что-то неаккуратно правилось, потому что должно было сработать. Там всего два места достаточно поменять.
Момент с грепзаменой и условия для пуша, а котором ты писал в 22 сообщении. Ну или переменную ffname пустой сделать.