Есть ли способ получить все цвета в одном текстовом слое?

Я хотел бы написать скрипт для Photoshop CS2 в js, который окрашивает ключевые слова sql внутри TextLayer, например, в синий цвет, а не ключевые слова в черный. Я знаю, что в графическом интерфейсе есть поддержка нескольких цветов в одном TextLayer, но в документации для js ничего не упоминается о нескольких цветах для ArtLayer, а также нет упоминаний в документации по объекту TextItem. Я изменил цвет первой буквы в текстовом слое, и возвращается только ее цвет. Вот мой код:

// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop

// in case we double clicked the file
app.bringToFront();

var doc = app.activeDocument;
var layers = collectAllLayers(doc);

// save all layers
function collectAllLayers (doc){
    var allLayers = [];
    for (var m = 0; m < doc.layers.length; m++){
        var theLayer = doc.layers[m];
        if (theLayer.typename === "ArtLayer"){
            allLayers.push(theLayer);
        }else{
            collectAllLayers(theLayer, allLayers);
        }
    }
    return allLayers;
}

// only use textlayers that contain this string
const sqlMarkerText = "code:sql";

var textLayers = [];
// save all textlayers containing marker
for(var i = 0; i<layers.length; i++){
    var layer = layers[i];
    if(layer.kind == LayerKind.TEXT && layer.name.indexOf(sqlMarkerText) != -1)
        textLayers.push(layer);    
}

После этого я использую следующий метод для получения цвета:

// display color for layer
for(var i = 0; i<textLayers.length; i++){
    var layer = layers[i];
    alert(layer.textItem.color.rgb.hexValue);
}

color возвращает только SolidColor. Как показано на изображении ниже, один TextLayer имеет несколько цветов, но возвращает только RED. only one TextLayerНо я хотел бы иметь список SolidColor или другой способ получить цвета :) Есть ли способ получить все цвета из одного текстового слоя ?


person Oliver Tworkowski    schedule 10.07.2020    source источник
comment
Вы не сможете сделать это с DOM. Вам нужно будет получить дескрипторы диспетчера действий из вашего слоя и проанализировать его.   -  person Sergey Kritskiy    schedule 11.07.2020
comment
@SergeyKritskiy спасибо за ответ, но я не понимаю, что вы имеете в виду. Я новичок в js, html сцене, но где именно я использую DOM здесь. Кроме того, что вы подразумеваете под менеджером действий. Не могли бы вы дать хотя бы ссылку на какую-то документацию?   -  person Oliver Tworkowski    schedule 11.07.2020
comment
app.activeDocument.activeLayer — это DOM Photoshop, и в нем отсутствует много информации. Существует второй более глубокий уровень кода Photoshop (ActionDesriptors), содержащий большую часть того, что происходит в PS. Дополнительные сведения см. в библиотеке ActionManagerHumanizer.   -  person Sergey Kritskiy    schedule 12.07.2020
comment
обратите внимание, что ActionManagerHumanizer можно использовать только с Photoshop CC 2015.5 и выше. Также обратите внимание, что Photoshop CS2 (версия, которую я использую) не имеет надлежащей документации по диспетчеру действий.   -  person Oliver Tworkowski    schedule 26.09.2020
comment
Ну, cs2 уже 15 лет. В нем много вещей, которые не будут работать   -  person Sergey Kritskiy    schedule 26.09.2020


Ответы (1)


Вы можете использовать jQuery .css() для получения свойств CSS элементов html.

В приведенном ниже примере ищется цвет промежутков, но в вашем случае просто примените ту же логику к вашим текстовым слоям, которые вы получаете с помощью var layers = collectAllLayers(doc);

<!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <title>Test</title>
</head>
<body>



    
<div>
    <span style="color: red">Hey, </span>
    <span style="color: green">this </span>
    <span style="color: blue">is</span>
    <span style="color: lightgreen">a </span>
    <span style="color: orange">sentence</span>
</div>

<div id="result"></div>


</body>


<script type="text/javascript">
    
    function getColors(){
        //Store colors in array
        var arr = [];
        
        //Get elements you need the color from
        var elm = document.querySelectorAll('span');

        //Loop through each element and store its color in an array (with jQuery .css())
        elm.forEach(item => {
            console.log($(item).css('color'));
            arr.push($(item).css('color'));
        });

        document.getElementById('result').innerHTML = arr;
    }

getColors();
</script>
</html>

person StrayAnt    schedule 11.07.2020