[ID CC2023] findTextPreferences, как задать цвет для поиска?

Masia

15 лет на форуме
Сообщения
127
Реакции
47
А вы не думали просто перекрасить в нужный цвет все textStyleRange, у которых fillColor не входит в список допустимых цветов? И не мучиться поиском цвета?
Судя по всему, не факт, что надо перекрашивать вообще весь текст, а не определенный, заданный в поиске findWhat.

Ради потренироваться попробовала сделать реализацию через textStyleRange.
Работает. Перекрашивает весь текст с заданным цветом во всем документе.
Мне показалось, что делает он это значительно медленнее, чем поиск/замена. С другой стороны, он же кучу всего перебирает... Не исключаю, что я что-то не оптимизировала или как-то не так все сделала '%)'

JavaScript:
var myDoc = app.activeDocument;
var myTSR = myDoc.stories.everyItem().texts.everyItem().textStyleRanges.everyItem(); // myTextStyleRange

var targetColorValue = '0,100,70,0';
var correctColorValue = myDoc.swatches.itemByName("correctColorSwatch").colorValue;

for (i=0; i<myTSR.fillColor.length; i++){
if (myTSR.fillColor[i].colorValue == targetColorValue) {
    myTSR.fillColor[i].colorValue = correctColorValue;
    }   
}
 

Drawer

Участник
Сообщения
1 795
Реакции
793
в нем надо курсор поставить в текст с искомым цветом
Или так
JavaScript:
#target indesign
var myDoc = app.activeDocument;
var targetColor = "0,100,70,0";
var destSwatch = "correctColorSwatch";

app.doScript(main, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, 'Replace Color To Swatch');

function main () {replaceColorToSwatch (targetColor, destSwatch)};

function replaceColorToSwatch(target, dest) {
    var colors = getColorsByValue(target);
    if (colors) {
        for (var i = 0; i < colors.length; i++) {
            var correctColor = myDoc.swatches.itemByName(dest);
            var correctColorName = myDoc.swatches.lastItem().name;
            app.findTextPreferences = app.changeTextPreferences = null;
            app.findTextPreferences.properties = {
                findWhat: "Test Text",
                fillColor: colors[i]
            };
            app.changeTextPreferences.properties = {
                fillColor: correctColor
            };
            myDoc.changeText();
            if (myDoc.swatches.lastItem().name !== correctColorName) {
                myDoc.swatches.lastItem().remove(dest);
            };
        };
    } else { alert("нет такого цвета в этой букве")};
};


function roundNumArr(Arr, prec) {
    var resArr = [];
    var split = Math.pow(10, prec);
    for (var i = 0; i < Arr.length; i++) {
        resArr[i] = Math.round(Arr[i]*split)/split;
    };
    return resArr;
};

function getColorsByValue(val) {
    var resArr = [];
    for (var i = 0; i < myDoc.colors.length; i++) {
        if (roundNumArr(myDoc.colors[i].colorValue, 2) == val) {
            resArr.push(myDoc.colors[i]);
        };
    };
    return resArr;
}
 

Drawer

Участник
Сообщения
1 795
Реакции
793
Не понятно какого лешего после поиска ID плодит Unnamed Colors, но при повторных запусках скрипта выше их количество растет в геометрической прогрессии :( В результате скрипт начнет дико тормозить. Ничего лучше не придумал, как удалять их к чертям :)

JavaScript:
#target indesign
var myDoc = app.activeDocument;
var targetColor = "0,100,70,0";
var destSwatch = "correctColorSwatch";
var findText = "Test Text";
var allDocColorsID = [];
app.doScript(main, ScriptLanguage.JAVASCRIPT, [], UndoModes.ENTIRE_SCRIPT, 'Replace Color To Swatch');
function main () {replaceColorToSwatch (targetColor, destSwatch)};

function replaceColorToSwatch(target, dest) {
    var colors = getColorsByValue(target);
    if (colors) {
        for (var i = 0; i < colors.length; i++) {
            var correctColor = myDoc.swatches.itemByName(dest);
            var correctColorName = myDoc.swatches.lastItem().name;
            app.findTextPreferences = app.changeTextPreferences = null;
            app.findTextPreferences.properties = {
                findWhat: findText,
                fillColor: colors[i]
            };
            app.changeTextPreferences.properties = {
                fillColor: correctColor
            };
            myDoc.changeText();
            if (myDoc.swatches.lastItem().name !== correctColorName) {
                myDoc.swatches.lastItem().remove(dest);
            };
        };
    } else { alert("нет такого цвета в этой букве")};
    for (var i = myDoc.colors.length-1; i>=0; i--) {
        if (!contains(allDocColorsID, myDoc.colors[i].id)) {
            myDoc.colors[i].remove();
        };
    };
};

function roundNumArr(Arr, prec) {
    var resArr = [];
    var split = Math.pow(10, prec);
    for (var i = 0; i < Arr.length; i++) {
        resArr[i] = Math.round(Arr[i]*split)/split;
    };
    return resArr;
};

function getColorsByValue(val) {
    var resArr = [];
    for (var i = 0; i < myDoc.colors.length; i++) {
        allDocColorsID.push(myDoc.colors[i].id)
        if (roundNumArr(myDoc.colors[i].colorValue, 2) == val) {
            resArr.push(myDoc.colors[i]);
        };
    };
    return resArr;
};

function contains(arr, elem) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] === elem) {
            return true;
        };
    };
    return false;
}
 
Последнее редактирование: