JavaScript и CxF (Color Exchange Format)

  • Автор темы Автор темы mihas
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

mihas

Топикстартер
15 лет на форуме
Сообщения
4 860
Реакции
2 886
Тут на форуме сильный раздел скриптинга для адобовских продуктов на яваскрипт, может и мой вопрос найдет свой ответ.
CxF как следует из заголовка файлов основан на xml. За 10 минут я разобрался с обработчиком xml и его тегов на яваскрипт, но вот с тэгами CxF непосредственно встал в ступор. Тэги несут в себе информацию кроме названия, уникальны вместо однотипности, не могу понять как писать их обработчик. Нужно просто выдирать данные из CxF для дальнейшей с ними работы, ну условно выдрать все содержимое между тегами, обрамляющими строчки спектров. Как выдрать эти строчки спектров, если каждая из них имеет в имени тэга какой-нибудь уникальный маркер, тэги подменяют собой содержание внутри тегов и мне это что-то не нравится совсем.
У вопроса есть практическая сторона, я обсчитываю легко колориметрические и спектральные таблицы в формате CGATS на яваскрипте, но впадаю в полный ступор при попытке передать значения в массивы из формата CxF. А хотелось бы и эти данные тоже обрабатывать.
 
Может глянуть CxF
Вроде все более менее вменяемо расписано, ну или можно попробовать попросить SDK
 
  • Спасибо
Реакции: mihas
Да посмотрю.
 
дело в том, что в ExtendScript от Adobe есть класс XML. В обычном JS его же нет?
 
Вроде бы есть. Я опробовал примеры работы с xml яваскрипта - все работает: XML Applications
Но если вы глянете на эти примеры xml - увидите, что теги совсем не такие как в cxf - здесь теги просто теги, а в cxf они несут информационную нагрузку и уникальны. Ну условно нет тега <spectr> ... </spectr> по которому можно было бы сформировть массив данных спектров, а что-то типа <cc:Object ObjectType="Measurement" Name="Measurement1" Id="c1"><cc:EmissiveSpectrum StartWL="380" ColorSpecification="XRitePrismDefault">
где содержимое этого тега - id - меняется для каждой строчки измерений.
 
Насколько понимаю, xml-файлы удобнее всего парсить используя файл schema.
CxF
Один из вариантов запроса для поиска:
parsing xml with schema in javascript
 
  • Спасибо
Реакции: mihas
Дмитрий, @DimB, честно говоря не очень понимаю как это делать, схему видел вчера - не понял... Если потом как-нибудь будет настроение помогите мне с этим программированием - передать содержимое тегов CxF в массивы. Хоть бы пример где был какой.
 
кинь любой файл, посмотрю на досуге.
 
  • Спасибо
Реакции: mihas
  • Спасибо
Реакции: mihas
где содержимое этого тега - id - меняется для каждой строчки измерений.
В этом случае id - не тег, а атрибут.
Получить список атрибутов для элемента, полагаю, можно через свойство Element.attributes, которое содержит массив атрибутов. У каждого атрибута есть свойства name и value.
 
  • Спасибо
Реакции: mihas
В принципе проблем не увидел, парсить "cc:Object ObjectType" и скидывать в массив, связывать по SampleID.
 

Вложения

  • target.JPG
    target.JPG
    104.4 КБ · Просм.: 785
  • Спасибо
Реакции: mihas
Коллеги, спасибо что не бросаете меня с этой моей личной загвоздкой, мне @DimB образец прислал как можно парсить CxF, начало положено, дальше дело пойдет чувствую! Если помучаю потом кусочками кода капельку?
 
Выбор в качестве инструмента JavaScript имеет какое-то принципиальное значение?
 
Выбор в качестве инструмента JavaScript имеет какое-то принципиальное значение?
Да, вычисления ориентированы на работу в любом браузере на WEB. Из инструментов WEB мне знаком и всеми браузерами поддерживается на клиентских компах javascript, если что-то в нем сделать невозможно - пишу на серверной стороне на PHP. Но сервер я стараюсь не нагружать лишними вычислениями без причины, все что может сделать клиентский компьютер - пусть делает.

Ковыряю пример от @DimB - когда перед глазами пример работающего сценария обработки аргументов тегов CxF - сразу у меня лично в сотни раз упрощается дело, по анологии что угодно можно дописать!-)

Вобщем спасибо, сдвинулся с мертвой точки. Пока идея такая - чтобы не делать исправлений в тысячах строк имеющегося кода, заточенного под CGATS, просто конверчу CxF в CGATS и все в нем как и раньше обсчитываю. Если бы писал с нуля - так бы наверное не делал.
 
Последнее редактирование:
Набросал черновик преобразования CxF to CGATS для CMYK (пока только для CMYK), пока работает только в Mozilla Firefox, в Google Chrome какие только варианты синтаксиса не перебирал - что-то никак не заведется.
В режиме теста уже доступно здесь R U D T P . P P . R U • Спектральный калькулятор на JavaScript (вводить руками данные в поле Input, загрузку файла пока не смотрел для CxF).
Сам скрипт CxF to CGATS здесь http://rudtp.pp.ru/spectral_CxFtoCGATS.js
Функция CxFtoCGATS вызывается из функции input() отсюда http://rudtp.pp.ru/spectralcalc33.js (временное имя скрипта, потом будет без 33 на конце).
Куча закомментированных строк //var Creationdate... - это мои тщетные попытки подобрать ключик к Хрому.
То есть строка:
var Creationdate = CxFdoc.getElementsByTagName("cc:CreationDate")[0].childNodes[0].nodeValue;
работает в Mozilla Firefox но не работает Google Chrome: "Cannot read property 'childNodes' of undefined".
Ну и так далее.
Если есть идеи - подскажите!
 
Последнее редактирование:
  • Спасибо
Реакции: ch_alex
PHP:
function smartGetElementsByTagName(item, tagname) {
   
    var knowNameSpaces = {
        cc: 'http://colorexchangeformat.com/CxF3-core',
    }

    var fname = tagname.split(':');
    var nsn = fname[0]; //namespace name
    var tag = fname[1]; //tag name
   
    var res = item.getElementsByTagName(tagname); //full name with namespace

    if (!res || res == null) {
        var res = item.getElementsByTagName(tag); //tag name only
    }

    if (!res || res == null) {
        var namespace = knowNameSpaces[nsn];
        if (namespace) {
            var res = item.getElementsByTagNameNS(namespace, tag); //tag name with full namespace 
        }
    }

    return res;

}

Вот как-то так должно работать во всех браузерах.
Переменная tagname должна быть вида: 'cc:xxxxxx' без пробелов.
 
  • Спасибо
Реакции: mihas
@Oleg Butrin, спасибо! Я как-то догадывался, что надо схему CxF3-core явно подгрузить. Она прописана в самом клиентском файле CxF но у меня такое впечатление, что там линк надо чуть иначе оформить для разных браузеров. Ладно, буду ковыряться дальше потихоньку.
 
Перебором вариантов синтаксиса и углубленным поиском дошел-таки до решения с Хромом на яваскрипте. Вот в CxF встречаем например теги:
<cc:Magenta>100</cc:Magenta>

в Mozilla Firefox надо разбирать объект CxF с тегами так:
var Mdata = CxF.getElementsByTagName("cc:Magenta");​

в Google Chrome надо разбирать объект CxF с тегами так:
var Mdata = CxF.getElementsByTagName("Magenta");​

То есть я уж и так и сяк парсил, а оказалось просто данные XML CxF с тегами, начинающимися с любых букв и двоеточия по-разному в браузерах надо определять в обработчике объекта getElementsByTagName. Не очевидно как-то, но вот так, что в других браузерах - потом буду смотреть, главная идея ясна.
 
Статус
Закрыто для дальнейших ответов.