Загрузка контента из JSON / CSV и приведение текстового поля в соответствие с контентом с базиликом. js - PullRequest
0 голосов
/ 07 апреля 2020

Я успешно загружаю файл JSON в InDesign через basil. js.

var jsonString = b.loadString("data.json");
var jsonData;

function setup() {

  jsonData = b.JSON.decode(jsonString);

  for (var i = 0; i < jsonData.length; i++) {
    var myText = jsonData[i].text;
    b.text(myText, 100, 10 * i, 100, 20);
  };
}

b.go();

Результат выглядит, как и ожидалось:

The result looks as expected: Что бы я нравится достигать

  1. То, что текстовые фреймы автоматически соответствуют их высоте по отношению к содержимому, что-то. как fit(FitOptions.FRAME_TO_CONTENT);
  2. Чтобы текстовые поля продолжались до тех пор, пока страница не ограничится, а затем не была добавлена ​​новая страница.

Любые советы приветствуются. Ура!

1 Ответ

0 голосов
/ 08 апреля 2020

для вашей первой проблемы

Чтобы текстовые фреймы автоматически соответствовали их высоте содержанию, что-то. как подходит (FitOptions.FRAME_TO_CONTENT);

вы можете просто использовать myText.fit(FitOptions.FRAME_TO_CONTENT);. Вам не нужно придерживаться Бэзила, если там что-то не реализовано.

Чтобы текстовые поля продолжались до тех пор, пока страница не ограничится, а затем не была добавлена ​​новая страница.

Это немного сложнее. Если вы расширите текстовые рамки, их размер изменится. Вам понадобится другая переменная вне вашего l oop, которая отслеживает geometricBounds последнего кадра и добавляет следующий кадр в начале. Когда ваши последние границы превысят pageHeight, вам нужно будет добавить новую страницу.

Это то, с чего можно начать. Это непроверенный код.

/**
 * InDesign Objects have a property called 
 * geometricBounds
 * these are the bounds in page coordinates sorted like this
 * [y1, x1, y2, x2]
 * or in words
 * [
 *   y of upper left corner, 
 *   x of upper left corner,
 *   y of lower right corner, 
 *   x of lower right corner
 * ]
 */
var prevGeometricBounds = [100, 10, 100, 10]; 
for (var i = 0; i < jsonData.length; i++) {
  var myText = jsonData[i].text;
  var x = prevGeometricBounds[1];
  var y = prevGeometricBounds[0];
  var w = prevGeometricBounds[3] - prevGeometricBounds[1];
  var h = prevGeometricBounds[2] - prevGeometricBounds[1];
  var textFrame = text(myText, x, y, w, h);
  textFrame.fit(FitOptions.FRAME_TO_CONTENT);
  prevGeometricBounds = myText.geometricBounds;
  if(prevGeometricBounds[2] > height){
    addPage();
  }
}

Еще один совет. Как вы можете видеть, я опускал b. Basil, который много раз развивался, но мы еще не выпустили версию 2. Вы можете получить последнюю версию из development ветки на GitHub. Документы для этого находятся здесь .


Редактировать 1

В Базилике 2 вы сможете загрузить JSON, используя loadString, а затем декодировать его, используя JSON .parse

Текстовая функция Basil возвращает textFrame. Так что функция fit должна работать. Если вы столкнетесь с ошибками, мы с радостью примем отчеты об ошибках по адресу github .


Edit 2

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. из JSON не по результату функции text().

...