Как сопоставить все объекты в файле Indesign с XML

КОНЕЧНАЯ ЦЕЛЬ

В конечном итоге мне нужно экспортировать мой файл InDesign в HTML, чтобы каждый элемент уровня блока HTML имел какой-то уникальный идентификатор (неважно, какой он, если он уникален), уникальный идентификатор, который также остается в InDesign и не изменяется, независимо от изменений, внесенных пользователем в содержимое InDesign, и экспортируется в HTML с каждым элементом. Что-то вроде этого:

<p data-id = "4j8w53">My first paragraph</p>
<p data-id = "k39dh2">My second paragraph</p>

И затем, когда пользователь InDesign изменяет контент и повторно экспортирует в HTML, существующие идентификаторы остаются, например:

<p data-id = "4j8w53">My first paragraph is awesome!</p>
<p data-id = "lq09cf">My inserted paragraph</p>
<p data-id = "k39dh2">My second paragraph</p>

Если кто-то знает простой способ сделать это, я бы хотел его услышать.

ПЛАН НОМЕР ПЕРВЫЙ

Пытаясь понять это, я решил сопоставить все в файле InDesign с XML, затем добавить атрибуты моего идентификатора к элементам XML с помощью пользовательского сценария JS, а затем экспортировать XML как HTML с помощью другого пользовательского сценария JS. Поскольку элементы XML фактически сопоставляются с элементами InDesign, идентификаторы останутся с ними по мере изменения текста.

Вот проблема: похоже, я не могу сопоставить весь мой контент InDesign с XML с помощью функции mapStylesToXMLTags(). У меня есть куча stories в файле, и один из них никогда не отображается в XML, когда я его экспортирую. Его просто нет.

Если бы я мог просто заставить весь контент отображаться в экспортированном XML, когда я использую mapStylesToXMLTags(), это, вероятно, решило бы мою проблему.

Или, если есть другой механизм сопоставления, который фактически отображает все мои элементы в XML и сохраняет сопоставления, это также может сработать.

ПЛАН НОМЕР ВТОРОЙ

Если я рекурсивно перебираю allPageItems в app.documents[0] и вручную создаю XML вместо использования mapStylesToXMLTags(), то недостающий объект отображается точно так же, как и все остальное.

Однако тогда идентификаторы, которые я даю XML-элементам, не прикрепляются к элементам InDesign, поскольку эти элементы фактически официально не «отображаются» на XML-элементы. Они не обновляются автоматически при изменении. Мне пришлось бы перезаписать весь XML при внесении изменений в файл InDesign, что исключает согласованность значений идентификаторов данных.

Кроме того, когда я делаю это таким образом, все не в порядке и не соответствует тому, как это было выложено в файле InDesign.

План номер один по-прежнему кажется наиболее многообещающим, если бы я мог просто нанести на карту весь контент.

ПОЖАЛУЙСТА, ПРОСТО НА МЕНЯ

Надеюсь, все ясно. FWIW, я парень JS / HTML, а не парень InDesign. Я новичок в InDesign и просто пытаюсь понять, как сделать этот процесс доступным для пользователей InDesign в моей организации.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
331
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если тексты отбрасываются, возможно, что отображение не завершено, или текст не может быть помечен тегами, например, сноски, возможно, текстовые переменные или подписи. Чтобы включить их в цикл, вам нужно будет преобразовать их в обычный текст перед экспортом. Но на всякий случай вот простой сценарий. Вы можете попробовать и посмотреть, улавливает ли он проблемные тексты.

//MAIN ROUTINE
var main = function() {
	
	var doc = app.properties.activeDocument,
	fgp = app.findGrepPreferences.properties,
	fcgo = app.findChangeGrepOptions.properties,
	found, n = 0, text, pTag, xe;
	
	//Exit if no documents open
	if ( !doc ) {
		alert("You need an open document" );
		return;
	}
	
	//Setting F/R Grep
	app.findGrepPreferences = app.findChangeGrepOptions = null;
	
	app.findGrepPreferences.properties = {
		findWhat : "^.+",
	}
	app.findChangeGrepOptions.properties = {
		includeFootnotes:false,
		includeHiddenLayers:true,
		includeLockedLayersForFind:true,
		includeLockedStoriesForFind:true,
		includeMasterPages:true,
	}
	
	//Adding "p" tag if needed
	pTag = doc.xmlTags.itemByName("p");
	!pTag.isValid && pTag = doc.xmlTags.add({name:"p"});
	
	//Getting paragraphs occurences
	found = doc.findGrep();
	n = found.length;
	while ( n-- ) {
		text = found[n];
		xe = text.associatedXMLElements;
		//Adding "p" tags with ids if needed
		if ( !xe.length || xe[0].markupTag.name! = "p") { 
			doc.xmlElements[0].xmlElements.add( pTag, text ).xmlAttributes.add('id', guid () );
		}
	}
	
	//Reverting initial F/R settings
	app.findGrepPreferences.properties = fgp;
	app.findChangeGrepOptions.properties = fcgo;
}

//Returns unique ID
function guid() {
  function s4() {
    return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
  }
  return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}

var u;

//Run
app.doScript ( "main()",u,u,UndoModes.ENTIRE_SCRIPT, "The Script" );

Каждый раз, когда я пытаюсь экспортировать сгенерированный из него XML, происходит сбой InDesign.

gcdev 04.04.2018 17:28

Может быть ошибка. Я прекрасно могу экспортировать. Какую версию вы используете? Вы в курсе? Возможно, содержимое слишком велико. Попробуйте установить фиктивный атрибут вместо UUID и посмотрите, экспортирует ли InDesign без сбоев. Это нужно, чтобы узнать, виноват ли UUID.

Loic 05.04.2018 18:25
Ответ принят как подходящий

Очевидно, объект, который не был сопоставлен с XML, был связанным файлом InCopy, который был заблокирован от любого редактирования. Чтобы сопоставить его с XML, мне пришлось щелкнуть внутри него, а затем выбрать «Правка»> «InCopy»> «Оформить». После этого он без труда нанес на карту, используя мой «План номер один», приведенный выше.

Другие вопросы по теме