/* * @Author: Vitaly Batushev * @Date: 2016-05-08 21:22:53 * @Last Modified by: Vitaly Batushev * @Last Modified time: 2016-05-09 10:27:18 */ /** * Экспорт информационных блоков * @param config.styles {Array} Массив объектов, описывающих колонки * head — заголовок колонки, * style — название стиля, абзац с которым будет помещаться в колонку * @param config.delimiter {String} Разделитель колонок, по умолчанию — ; * @param config.encoding {String} Кодировка файла, по умолчанию CP1251 (MS Excel любит его) */ var ExportInfoblock = (function(){ var config = { styles: [ {head: "Первый", style: "Заголовок"}, {head: "Второй", style: "Вводка"}, {head: "Третий", style: "Normal Буквица"} ], delimiter: ";", encoding: "CP1251" }; // rows — массив рядов будущей таблицы, row — ряд, который будет записываться в файл рапорта var rows = [], row = ""; var main = function() { // Если открытых документов нет, прекращаем работу if (app.documents.length === 0) { exit(); } //Обходим все объекты Story в Document for (var a = 0, l = app.activeDocument.stories.length; a < l; a++) { processStory(app.activeDocument.stories[a]); } // Если массив рядов заполнен, записываем файл и сообщаем пользователю, в какой // Если массив пуст, сообщаем об этом if (rows.length > 0) { var fileName = writeReport(); alert("Отчет записан в файл " + fileName); } else { alert("Отчет не составлен по причине отсутствия текстов"); } } /** * Обработка объекта Story * @param {Story} story Обрабатываемый объект */ var processStory = function(story) { var temprow = [], pos = 0; for (var a = 0, l = story.paragraphs.length; a < l; a++) { var current = story.paragraphs[a], styleName = current.appliedParagraphStyle.name, contents = replaceSpecCharacters(current.contents); // Ищем место в ряду var place = findPlace(styleName); if (place == 0) { if (temprow[0] !== undefined) { rows.push(temprow); temprow = []; } temprow[0] = contents; pos = current; } else { if (temprow[0] !== undefined) { if (temprow[place] === undefined) { temprow[place] = contents; } else { temprow[place] += contents; } } } } if (temprow[0] !== undefined) { rows.push(temprow); } /** * Поиск места в ряду * @param {String} str Имя стиля * @return {Number} Позиция в ряду */ function findPlace(str) { for (var a = 0, l = config.styles.length; a < l; a++) { if (str == config.styles[a].style) { return a; } } // Если стиль не найден в массиве, считаем, // что он относится к последнему в массиве стилей return config.styles.length - 1; } /** * Замена специальных символов в строке * @param {String} str Исходная строка * @return {String} Строка с замененными символами */ function replaceSpecCharacters (str) { return str.replace(/\r$/,"").replace(/\n$/,"").replace(/(\n|\r)/," "); } } /** * Запись файла рапорта * @return {String} Имя файла рапорта */ var writeReport = function() { var fileReport = File(app.activeDocument.filePath + "/" + app.activeDocument.name + "-report.csv"); fileReport.encoding = config.encoding; fileReport.open("w"); for (var a = 0, l = config.styles.length; a < l; a++) { row += "\"" + config.styles[a].head + "\"" + config.delimiter; } fileReport.writeln(row); for (var a = 0, l = rows.length; a < l; a++) { row = ""; for (var i = 0, j = rows[a].length; i < j; i++) { var content = rows[a][i]; if (content === undefined) { content = ""; } row += "\"" + content + "\"" + config.delimiter; } fileReport.writeln(row); } fileReport.close(); return fileReport.name; } return { execute: main, config: config } })(); // Пример переопределения массива стилей ExportInfoblock.config.styles = [ {head: "Заголовок статьи", style: "Заголовок"}, {head: "Вводная часть", style: "Вводка"}, {head: "Первый абзац", style: "Normal Буквица"}, {head: "Основной текст", style: "Normal"} ]; // Пример переопределения кодировки // ExportInfoblock.config.encoding = "UTF8"; // Пример переопределения разделителя // ExportInfoblock.config.delimiter = ","; ExportInfoblock.execute();