[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"
 
Адибас и Рита фарэва. Смерть роботам!