[ID CC-CC2021] InDesign to CSV

Статус
Закрыто для дальнейших ответов.

X-Nitro

Участник
Топикстартер
Сообщения
7
Реакции
0
Доброго времени господа!

Я пытаюсь экспортировать текст из Индизайна в CSV, так чтобы каждый абзац был записан в отдельную строку по его стилю. (скрины ниже)

Нашел вроде подходяший описанию скрипт, но не работает (у меня InDesign CC2015). Может ли кто либо из знатоков подсказать/подправить код ниже?



Original indd file

upload_2016-5-8_11-49-59.png


Desired SCV
upload_2016-5-8_11-52-50.png



Код скрипта

Код:
//Exportascsv.js 
var myStory, myParagraph, myParagraphTemp, myString, myTag, myStartTag; 
var myEndTag, myTextStyleRange, myTable; 
if(app.documents.length !=0){ 
  if(app.documents.item(0).stories.length != 0){ 
//Open a new text file. 
    var myTextFile = File.saveDialog("Save CSV As", undefined); 
//If the user clicked the Cancel button, the result is null. 
    if(myTextFile != null){ 
//Open the file with write access. 
      myTextFile.open("w"); 
      var myCounterArt = 0; 
//walk through the stories. 
      for(var myCounter = 0; myCounter < app.documents.item(0).stories.length; myCounter++){ 
        myStory = app.documents.item(0).stories.item(myCounter); 
// we have stories inside stories (articles in articles sometimes) 
        var myParagraphCounter = 0; 
        myParagraphTemp = ""; 
        myString = ""; 
        do{ 
          myParagraph = myStory.paragraphs.item(myParagraphCounter); 
          myParagraphTemp = ""; 
          switch(myParagraph.appliedParagraphStyle.name){ 
//Headline paragraph style 
              case "Title": 
                myString = '"'+myParagraph.contents+'","'; 
                myParagraphCounter++; 
                break; 
              case "Ingredients": 
//Text paragraph style 
                myString = myString+myParagraph.contents; 
                myParagraphCounter++; 
                break; 
              default: 
                myParagraphCounter++; 
                break; 
          } 
        } while (myParagraphCounter < myStory.paragraphs.length) 
        myString = myString+'"'; 
        myTextFile.writeln(myString); 
      } 
      myTextFile.write("\r"); 
      myTextFile.close(); 
    } 
  } 
}
 

Вложения

  • upload_2016-5-8_11-48-38.png
    upload_2016-5-8_11-48-38.png
    114.3 КБ · Просм.: 962
  • upload_2016-5-8_11-52-21.png
    upload_2016-5-8_11-52-21.png
    8.3 КБ · Просм.: 757

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ты бы приложил пример публикации, в том же IDML, чтобы самому не крутить, на чем проверять.
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Как-то так у меня вышло:
Код:
/*
* @Author: Vitaly Batushev
* @Date:   2016-05-08 21:22:53
* @Last Modified by:   Vitaly Batushev
* @Last Modified time: 2016-05-08 22:41:11
*/

var ExportAsCSV = (function(){
    var config = {
        Title: "Заголовок",
        Ingridients: "Вводка",
        Bodytext: "Normal Буквица"
    };
    var box = [], line;

    var main = function() {
        if (app.documents.length === 0) { exit(); }

        for (var a = 0, l = app.activeDocument.stories.length; a < l; a++) {
            processStory(app.activeDocument.stories[a]);
        }

        if (box.length > 0) {
            writeReport();
            alert("Отчет записан в файл " + fileReport.name);
        } else {
            alert("Отчет не составлен по причине отсутствия текстов");
        }
    }

    var processStory = function(story) {
        var deposito = {};
        for (var a = 0, l = story.paragraphs.length; a < l; a++) {
            var styleName = story.paragraphs[a].appliedParagraphStyle.name,
                contents = replaceSpecCharacters(story.paragraphs[a].contents);
            switch (styleName) {
                case config.Title:
                    if (deposito.Title === undefined) {
                        deposito.Title = contents;
                    } else {
                        box.push(deposito);
                        deposito = {};
                        deposito.Title = contents;
                    }
                    break;
                case config.Ingridients:
                    deposito.Ingridients = contents;
                    break;
                default:
                    if (deposito.Title !== undefined) {
                        if (deposito.Bodytext === undefined) {
                            deposito.Bodytext = contents;
                        } else {
                            deposito.Bodytext += contents;
                        }
                    }
                 }
            }
        }
        if (deposito.Title !== undefined) {
             box.push(deposito);
        }

        function replaceSpecCharacters (str) {
            return str.replace(/\r$/,"").replace(/\n$/,"").replace(/(\n|\r)/," ");
        }
    }

    var writeReport = function() {
        var fileReport = File(app.activeDocument.filePath + "/" + app.activeDocument.name + "-report.csv");
        fileReport.encoding = "CP1251"; fileReport.open("w");
        for (var c in config) {
            line += "\"" + c + "\";";
        }
        fileReport.writeln(line);

        for (var a = 0, l = box.length; a < l; a++) {
            line = "";
            for (var p in box[a]) { line += "\"" + box[a][p] + "\";"; }
            fileReport.writeln(line);
        }
        fileReport.close();
    }

    return {
        execute: main
    }
})();

ExportAsCSV.execute();
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Немного переписал, исправил ошибки, добавил возможность использовать произвольное количество полей, изменять заголовки колонок, разделитель и кодировку файла репорта.
ExportInfoblock.jsx
 
Последнее редактирование:
  • Спасибо
Реакции: X-Nitro

Flame

Unregistered user
20 лет на форуме
Сообщения
1 322
Реакции
57
Красивый код. Никак не могу научиться такому, вечно тяп-ляп и костыли :)
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
@Flame, спасибо на добром слове, но мне еще расти и расти.
 
Статус
Закрыто для дальнейших ответов.