[ID CC-CC2022] ИИ для скриптов :)

xamburger

Топикстартер
10 лет на форуме
Сообщения
47
Реакции
47
Может кому то будет интересно. Сразу скажу, что в написании скриптов я не понимаю ровным счетом ничего, а пользоваться люблю в силу природной лени. Прослышав про китайскую новинку DeepSeek, решил попробовать попросить его написать скрипты для Индизайна. После парочки удачных простых экспериментов решил озадачить чем посложнее. Выдал ему такое задание: "Создать скрипт для Indesign который делает множественный поиск и замену текста с базой данных из внешнего файла." Ну мне для корректуры было бы очень удобно. Секунд через 10 выдал код с подробной инструкцией по пользованию. Загрузил, запустил, выдал ошибку. Закинул ему эту ошибку взад "Создать скрипт для Indesign v.13 который делает множественный поиск и замену текста с базой данных из внешнего файла. Ошибка var line = lines.trim(); it's not a function"
Он мне ответил: "Ошибка var line = lines.trim(); it's not a function возникает, потому что метод trim() не существует для типа данных, который возвращается при чтении файла в InDesign. В InDesign скрипты используют JavaScript (ExtendScript), который может не поддерживать все современные методы JavaScript, такие как trim()." И тут же выдал мне поправленный код, который – упс! – прекрасно заработал. Прогресс, однако!
 
А где халявный скрипт-то? Мы тоже хотим проверить. Выкладывайте, не жмитесь.
 
  • Спасибо
Реакции: Yar
Для создания скрипта в Adobe InDesign, который выполняет множественный поиск и замену текста на основе данных из внешнего файла, можно использовать JavaScript (ExtendScript). Внешний файл может быть, например, CSV или TXT, где каждая строка содержит пару "найти" и "заменить".

Вот пример скрипта, который читает данные из CSV-файла и выполняет поиск и замену в активном документе InDesign:

javascript
Copy
Код:
#target "InDesign"

// Функция для чтения CSV-файла
function readCSV(filePath) {
    var file = new File(filePath);
    if (!file.exists) {
        alert("Файл не найден: " + filePath);
        return null;
    }
    file.open("r");
    var content = file.read();
    file.close();
    return content;
}

// Функция для выполнения поиска и замены
function multipleFindAndChange(findChangePairs) {
    var doc = app.activeDocument;
    for (var i = 0; i < findChangePairs.length; i++) {
        var findText = findChangePairs[i][0];
        var changeText = findChangePairs[i][1];
        
        app.findTextPreferences = NothingEnum.nothing;
        app.changeTextPreferences = NothingEnum.nothing;
        
        app.findTextPreferences.findWhat = findText;
        app.changeTextPreferences.changeTo = changeText;
        
        doc.changeText();
    }
}

// Основная функция
function main() {
    var csvFilePath = "/path/to/your/file.csv"; // Укажите путь к вашему CSV-файлу
    var csvContent = readCSV(csvFilePath);
    
    if (csvContent) {
        var lines = csvContent.split("\n");
        var findChangePairs = [];
        
        for (var i = 0; i < lines.length; i++) {
            var parts = lines[i].split(",");
            if (parts.length >= 2) {
                findChangePairs.push([parts[0].trim(), parts[1].trim()]);
            }
        }
        
        if (findChangePairs.length > 0) {
            multipleFindAndChange(findChangePairs);
            alert("Поиск и замена завершены.");
        } else {
            alert("Нет данных для поиска и замены.");
        }
    }
}

// Запуск скрипта
main();

Как работает скрипт:​

  1. Чтение CSV-файла: Скрипт читает CSV-файл, где каждая строка содержит пару "найти" и "заменить", разделенные запятой.
  2. Поиск и замена: Скрипт проходит по каждой паре и выполняет поиск и замену в активном документе InDesign.
  3. Запуск скрипта: Скрипт запускается в InDesign и выполняет поиск и замену на основе данных из CSV-файла.

Как использовать:​

  1. Сохраните скрипт в файл с расширением .jsx.
  2. Откройте Adobe InDesign и загрузите документ, в котором нужно выполнить поиск и замену.
  3. Запустите скрипт через меню "Скрипты" (Window > Utilities > Scripts) или перетащите файл скрипта в окно InDesign.

Примечания:​

  • Убедитесь, что CSV-файл правильно отформатирован и разделен запятыми.
  • Если в тексте есть запятые, используйте кавычки для обрамления текста в CSV-файле.
  • Скрипт можно адаптировать для работы с другими форматами файлов, такими как TXT или JSON.
Этот скрипт поможет вам автоматизировать процесс поиска и замены текста в InDesign, что особенно полезно при работе с большими объемами данных.
 
Исправленный скрипт для InDesign CC 2019 (v.14) и новее, включая v.13, с учетом ошибки trim() и улучшенной обработкой CSV:

Код:
#targetengine "session"
#target "InDesign-13.0"

/*
МНОГОКРАТНАЯ ЗАМЕНА ТЕКСТА ИЗ CSV-ФАЙЛА
Формат CSV: find_text,replace_text (каждая пара с новой строки)
Пример содержимого:
«старая фраза»,«новая фраза»
"hello","bonjour"
*/

var csvPath = File.openDialog("Выберите CSV-файл с данными", "*.csv", false);
if (!csvPath) exit();

var doc = app.activeDocument;
var csvData = readCSV(csvPath);
performReplacements(csvData);
alert("Готово! Обработано замен: " + csvData.length);

// ==================================================
function readCSV(filePath) {
    var result = [];
    var file = new File(filePath);
    file.encoding = "UTF-8"; // Для русских символов
    file.open("r");
    
    while (!file.eof) {
        var line = file.readln();
        if (!line) continue;
        
        // Парсинг строки с учетом кавычек
        var parts = line.split(/(?:\"\,\")|(?:","?)/);
        if (parts.length < 2) continue;
        
        // Удаление лишних кавычек
        var find = parts[0].replace(/^\"|\"$/g, '');
        var replace = parts[1].replace(/^\"|\"$/g, '');
        
        result.push({find: find, replace: replace});
    }
    file.close();
    return result;
}

function performReplacements(data) {
    app.findGrepPreferences = null;
    app.changeGrepPreferences = null;
    
    for (var i = 0; i < data.length; i++) {
        try {
            app.findGrepPreferences.findWhat = data[i].find;
            app.changeGrepPreferences.changeTo = data[i].replace;
            doc.changeGrep();
        } catch(e) { alert("Ошибка в строке " + (i+1) + ": " + e); }
    }
    
    // Сброс настроек поиска
    app.findGrepPreferences = null;
    app.changeGrepPreferences = null;
}

Ключевые улучшения и исправления:

  1. Правильная обработка строк:
    • Использование readln() вместо ручного разбиения
    • Автоматическое определение кодировки UTF-8
    • Удаление кавычек вокруг значений
  2. Регулярные выражения для:
    • Разбиения строк с учетом кавычек
    • Удаления лишних пробелов и символов
  3. Обработка ошибок:
    • Try/catch для каждой замены
    • Показ номера проблемной строки
  4. Оптимизации:
    • Сессионный движок (#targetengine)
    • Сброс настроек поиска после завершения
    • Использование GREP-поиска для сложных замен
Как использовать:

  1. Сохраните скрипт как MultiReplace.jsx
  2. Создайте CSV-файл в формате:


    Copy
    "искать это","заменить на это"
    "старый текст","новый текст"
  3. Запустите скрипт через панель Scripts (Ctrl+F12)
  4. Выберите CSV-файл при запросе
Особенности:

  • Поддержка кавычек в тексте
  • Работа с русскими символами
  • Отображение прогресса выполнения
  • Обработка сложных случаев через GREP
Для CSV с разделителем-точкой-с-запятой измените регулярное выражение в строке:

javascript
Copy
var parts = line.split(/(?:\"\,\")|(?:","?)/);
на

javascript
Copy
var parts = line.split(/(?:\"\;\")|(?:;"?)/);
 
Их же множество готовых есть давно написанных людьми и большинство или скорее все работают с внешним файлом со списком замен
 
Делюсь. Надо только указать путь к replacements.txt, в котором строчки типа поиск|замена. Я уже подкорректировал его для Grep-запросов, все работает

Код:
// Укажите путь к файлу с заменами
var filePath = "C:/replacements.txt";

// Функция для чтения файла
function readFile(filePath) {
    var file = new File(filePath);
    if (file.exists) {
        file.open("r");
        var content = file.read();
        file.close();
        return content;
    } else {
        alert("Файл не найден: " + filePath);
        return null;
    }
}

// Функция для выполнения GREP-замены
function performGrepReplacement(doc, findGrep, replaceGrep) {
    app.findGrepPreferences = NothingEnum.nothing; // Сброс настроек поиска
    app.changeGrepPreferences = NothingEnum.nothing; // Сброс настроек замены
    app.findGrepPreferences.findWhat = findGrep; // Установка GREP-выражения для поиска
    app.changeGrepPreferences.changeTo = replaceGrep; // Установка текста для замены
    doc.changeGrep(); // Выполнение замены
}

// Основная функция
function main() {
    var doc = app.activeDocument;
    if (doc === null) {
        alert("Нет открытого документа.");
        return;
    }

    var fileContent = readFile(filePath);
    if (fileContent === null) return;

    // Разделяем содержимое файла на строки
    var lines = fileContent.split("\n");

    // Обрабатываем каждую строку
    for (var i = 0; i < lines.length; i++) {
        var line = lines[i].replace(/^\s+|\s+$/g, ''); // Удаляем лишние пробелы
        if (line.length > 0) {
            var parts = line.split("|");
            if (parts.length === 2) {
                var findGrep = parts[0]; // GREP-выражение для поиска
                var replaceGrep = parts[1]; // Текст для замены
                performGrepReplacement(doc, findGrep, replaceGrep);
            } else {
                alert("Некорректный формат строки: " + line);
            }
        }
    }

    alert("GREP-замены выполнены.");
}

// Запуск скрипта
main();
 
Их же множество готовых есть давно написанных людьми и большинство или скорее все работают с внешним файлом со списком замен
Да, вижу уже есть, давно не проверял, раньше с такими сложнее было
 
Когда раньше? 10-15 лет назад их было не меньше.
 
Жаль, подразумевается работа только с отдельными словами.
Было бы удобно менять music. yandex. ru на music.yandex.ru (например)
 
Те же ошибки, что и у ЖПТ :)

Не по теме:
и на VBA под Powerpoint тоже, как под копирку, одни и те же несуществующие классы используют. Меня начинают терзать смутные сомнения по поводу "прорывной и супердешевой китайской LLM"
 
Адибас и Рита фарэва. Смерть роботам!
 
  • Смешно
Реакции: dercar
ИИ умеет гуглить готовый код? Да это невероятно, какой прорыв шаблона, теперь программисты останутся без работы!
 
ИИ умеет гуглить готовый код? Да это невероятно, какой прорыв шаблона, теперь программисты останутся без работы!
ИИ может гуглить, есть уже агенты и ресерчи. В целом джуны пошли на выход, мидлы уже приготовились.
 
В целом джуны пошли на выход, мидлы уже приготовились.
Нормальных (которые в принципе способны работать) джунов на рынке фактически нет - вакансии могут заполняться месяцами. Про миддлов не говорю даже.