layoutbridge-spm 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -0
- package/LICENSE +26 -0
- package/README.de.md +318 -0
- package/README.md +304 -4
- package/THIRD-PARTY-NOTICES.md +2878 -0
- package/dist/src/mcp/config.js +125 -0
- package/dist/src/mcp/dispatch.js +123 -0
- package/dist/src/mcp/license/free-tools.js +16 -0
- package/dist/src/mcp/license/gate.js +209 -0
- package/dist/src/mcp/license/index.js +96 -0
- package/dist/src/mcp/license/instance-name.js +56 -0
- package/dist/src/mcp/license/key-source.js +58 -0
- package/dist/src/mcp/license/lemonsqueezy-verifier.js +207 -0
- package/dist/src/mcp/license/placeholder-verifier.js +10 -0
- package/dist/src/mcp/license/polar-ids.js +63 -0
- package/dist/src/mcp/license/polar-verifier.js +265 -0
- package/dist/src/mcp/license/product-ids.js +72 -0
- package/dist/src/mcp/license/state-store.js +91 -0
- package/dist/src/mcp/license/types.js +11 -0
- package/dist/src/mcp/logging.js +270 -0
- package/dist/src/mcp/product-info.js +48 -0
- package/dist/src/mcp/server.js +250 -0
- package/dist/src/mcp/setup.js +608 -0
- package/dist/src/mcp/start.cjs +95 -0
- package/dist/src/mcp/tool-definition.js +2 -0
- package/dist/src/mcp/tools.js +2004 -0
- package/dist/src/mcp/typography-rules.js +70 -0
- package/dist/src/transport/com.js +250 -0
- package/dist/src/transport/osascript.js +171 -0
- package/dist/src/transport/queue.js +19 -0
- package/dist/src/transport/script-bundle.js +92 -0
- package/dist/src/transport/transport.js +30 -0
- package/indesign/commands/10-app.js +6 -0
- package/indesign/commands/20-documents.js +513 -0
- package/indesign/commands/22-document-setup.js +118 -0
- package/indesign/commands/23-save-package.js +255 -0
- package/indesign/commands/25-export.js +379 -0
- package/indesign/commands/26-export-image.js +197 -0
- package/indesign/commands/27-textdefaults.js +151 -0
- package/indesign/commands/28-selection.js +174 -0
- package/indesign/commands/30-pages.js +1032 -0
- package/indesign/commands/31-view.js +210 -0
- package/indesign/commands/32-sections.js +203 -0
- package/indesign/commands/35-parents.js +428 -0
- package/indesign/commands/37-layout.js +760 -0
- package/indesign/commands/40-frames.js +836 -0
- package/indesign/commands/41-shapes.js +505 -0
- package/indesign/commands/42-groups.js +117 -0
- package/indesign/commands/43-layers.js +291 -0
- package/indesign/commands/44-effects.js +274 -0
- package/indesign/commands/45-frame-options.js +247 -0
- package/indesign/commands/47-anchored.js +287 -0
- package/indesign/commands/50-modify.js +781 -0
- package/indesign/commands/52-align.js +139 -0
- package/indesign/commands/55-fit.js +106 -0
- package/indesign/commands/60-images.js +771 -0
- package/indesign/commands/62-embed.js +120 -0
- package/indesign/commands/69-placeholders.js +127 -0
- package/indesign/commands/70-text.js +567 -0
- package/indesign/commands/71-outlines.js +92 -0
- package/indesign/commands/72-place-text.js +366 -0
- package/indesign/commands/74-stories.js +116 -0
- package/indesign/commands/75-tables.js +676 -0
- package/indesign/commands/76-text-variables.js +260 -0
- package/indesign/commands/77-story-options.js +86 -0
- package/indesign/commands/78-frame-lines.js +304 -0
- package/indesign/commands/79-check-typography.js +303 -0
- package/indesign/commands/80-styles.js +1620 -0
- package/indesign/commands/81-composition.js +355 -0
- package/indesign/commands/82-object-styles.js +263 -0
- package/indesign/commands/83-indents-tabs.js +237 -0
- package/indesign/commands/84-import-styles.js +142 -0
- package/indesign/commands/85-swatches.js +112 -0
- package/indesign/commands/86-gradients.js +185 -0
- package/indesign/commands/87-replace-swatch.js +180 -0
- package/indesign/commands/88-replace-font.js +217 -0
- package/indesign/interpreter.js +758 -0
- package/package.json +55 -6
- package/rules/typography-rules.json +31 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/* Bereich A – Dokumente. */
|
|
2
|
+
|
|
3
|
+
/* Pfad eines Dokuments, leer wenn nie gespeichert. */
|
|
4
|
+
function idcDocumentPath(doc) {
|
|
5
|
+
try {
|
|
6
|
+
if (doc.saved) { return IDC.fsPath(doc.fullName); }
|
|
7
|
+
} catch (e) { /* leer */ }
|
|
8
|
+
return '';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Fehlende und veraltete Verknuepfungen sowie fehlende Schriften. */
|
|
12
|
+
function idcDocumentIssues(doc) {
|
|
13
|
+
var missingLinks = [];
|
|
14
|
+
var outOfDateLinks = [];
|
|
15
|
+
var missingFonts = [];
|
|
16
|
+
var i, link, font, name;
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
for (i = 0; i < doc.links.length; i++) {
|
|
20
|
+
link = doc.links.item(i);
|
|
21
|
+
if (IDC.enumIs(link.status, LinkStatus.LINK_MISSING)) {
|
|
22
|
+
missingLinks.push(String(link.name));
|
|
23
|
+
} else if (IDC.enumIs(link.status, LinkStatus.LINK_OUT_OF_DATE)) {
|
|
24
|
+
outOfDateLinks.push(String(link.name));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
} catch (e1) { /* Liste bleibt so weit, wie sie kam */ }
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
for (i = 0; i < doc.fonts.length; i++) {
|
|
31
|
+
font = doc.fonts.item(i);
|
|
32
|
+
if (!IDC.enumIs(font.status, FontStatus.INSTALLED)) {
|
|
33
|
+
name = String(font.name);
|
|
34
|
+
missingFonts.push(name);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} catch (e2) { /* dito */ }
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
missing_links: missingLinks,
|
|
41
|
+
out_of_date_links: outOfDateLinks,
|
|
42
|
+
missing_fonts: missingFonts
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
IDC.register('list_documents', { needs_document: false, read_only: true, ruler: 'none' },
|
|
47
|
+
function () {
|
|
48
|
+
var documents = [];
|
|
49
|
+
var activeId = null;
|
|
50
|
+
var i, doc, isActive;
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* Ueber die ID vergleichen, nicht ueber equals(): equals() lieferte am
|
|
54
|
+
* lebenden Dokument false, obwohl nur ein Dokument offen war.
|
|
55
|
+
*/
|
|
56
|
+
try {
|
|
57
|
+
if (app.documents.length > 0) { activeId = Number(app.activeDocument.id); }
|
|
58
|
+
} catch (e) { activeId = null; }
|
|
59
|
+
|
|
60
|
+
for (i = 0; i < app.documents.length; i++) {
|
|
61
|
+
doc = app.documents.item(i);
|
|
62
|
+
isActive = false;
|
|
63
|
+
try {
|
|
64
|
+
if (activeId !== null) { isActive = Number(doc.id) === activeId; }
|
|
65
|
+
} catch (e2) { isActive = false; }
|
|
66
|
+
documents.push({
|
|
67
|
+
document_id: Number(doc.id),
|
|
68
|
+
name: String(doc.name),
|
|
69
|
+
saved: doc.saved === true,
|
|
70
|
+
path: idcDocumentPath(doc),
|
|
71
|
+
page_count: doc.pages.length,
|
|
72
|
+
is_active: isActive
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return { documents: documents, count: documents.length };
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
IDC.register('open_document', { needs_document: false, read_only: false, ruler: 'none' },
|
|
79
|
+
function (ctx) {
|
|
80
|
+
var args = ctx.args;
|
|
81
|
+
if (typeof args.path !== 'string' || args.path.length === 0) {
|
|
82
|
+
IDC.fail('invalid_argument', 'path is required and must be a file path.', null);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
var file = IDC.fileFor(args.path);
|
|
86
|
+
if (!file.exists) {
|
|
87
|
+
IDC.fail('not_found', 'File does not exist: ' + args.path, { path: args.path });
|
|
88
|
+
}
|
|
89
|
+
var wantedPath = IDC.fsPath(file);
|
|
90
|
+
|
|
91
|
+
var isTemplate = /\.indt$/i.test(args.path);
|
|
92
|
+
var openCopy = args.open_copy === true || (args.open_copy !== false && isTemplate);
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* Schon offen? Dann nicht doppelt oeffnen – ausser jemand will ausdruecklich
|
|
96
|
+
* eine Kopie: die ist ein neues, unbenanntes Dokument und kollidiert mit
|
|
97
|
+
* nichts.
|
|
98
|
+
*/
|
|
99
|
+
var i, candidate, doc = null;
|
|
100
|
+
if (!openCopy) {
|
|
101
|
+
for (i = 0; i < app.documents.length; i++) {
|
|
102
|
+
candidate = app.documents.item(i);
|
|
103
|
+
if (idcDocumentPath(candidate) === wantedPath && wantedPath !== '') {
|
|
104
|
+
doc = candidate;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
var alreadyOpen = doc !== null;
|
|
111
|
+
if (!alreadyOpen) {
|
|
112
|
+
var showWindow = args.show_window === false ? false : true;
|
|
113
|
+
var openOption = openCopy ? OpenOptions.OPEN_COPY : OpenOptions.OPEN_ORIGINAL;
|
|
114
|
+
try {
|
|
115
|
+
doc = app.open(file, showWindow, openOption);
|
|
116
|
+
} catch (e) {
|
|
117
|
+
IDC.fail('io_error', 'InDesign could not open the file: ' + String(e.message ? e.message : e),
|
|
118
|
+
{ path: args.path });
|
|
119
|
+
}
|
|
120
|
+
if (IDC.isArray(doc)) { doc = doc[0]; }
|
|
121
|
+
} else {
|
|
122
|
+
ctx.warn('Document was already open; it was not opened a second time.');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
var issues = idcDocumentIssues(doc);
|
|
126
|
+
if (issues.missing_links.length > 0) {
|
|
127
|
+
ctx.warn('Missing links (fehlende Verknuepfungen): ' + issues.missing_links.join(', '));
|
|
128
|
+
}
|
|
129
|
+
if (issues.out_of_date_links.length > 0) {
|
|
130
|
+
ctx.warn('Out of date links (veraltete Verknuepfungen): ' + issues.out_of_date_links.join(', '));
|
|
131
|
+
}
|
|
132
|
+
if (issues.missing_fonts.length > 0) {
|
|
133
|
+
ctx.warn('Missing fonts (fehlende Schriften): ' + issues.missing_fonts.join(', '));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
ctx.changes = { opened_document_ids: alreadyOpen ? [] : [Number(doc.id)] };
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
document_id: Number(doc.id),
|
|
140
|
+
name: String(doc.name),
|
|
141
|
+
page_count: doc.pages.length,
|
|
142
|
+
facing_pages: doc.documentPreferences.facingPages === true,
|
|
143
|
+
already_open: alreadyOpen,
|
|
144
|
+
path: idcDocumentPath(doc),
|
|
145
|
+
missing_links: issues.missing_links,
|
|
146
|
+
out_of_date_links: issues.out_of_date_links,
|
|
147
|
+
missing_fonts: issues.missing_fonts
|
|
148
|
+
};
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
IDC.register('close_document', { needs_document: true, read_only: false, ruler: 'none' },
|
|
152
|
+
function (ctx) {
|
|
153
|
+
var args = ctx.args;
|
|
154
|
+
var doc = ctx.doc;
|
|
155
|
+
|
|
156
|
+
if (args.save_changes !== 'yes' && args.save_changes !== 'no') {
|
|
157
|
+
IDC.fail('invalid_argument',
|
|
158
|
+
'save_changes is required and must be "yes" or "no" (InDesign save dialogs are suppressed).',
|
|
159
|
+
{ save_changes: args.save_changes === undefined ? null : String(args.save_changes) });
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
var documentId = Number(doc.id);
|
|
163
|
+
var name = String(doc.name);
|
|
164
|
+
var hadUnsavedChanges = doc.modified === true;
|
|
165
|
+
var currentPath = idcDocumentPath(doc);
|
|
166
|
+
var savedTo = '';
|
|
167
|
+
var target = null;
|
|
168
|
+
|
|
169
|
+
if (args.save_changes === 'yes') {
|
|
170
|
+
if (typeof args.path === 'string' && args.path.length > 0) {
|
|
171
|
+
target = IDC.fileFor(args.path);
|
|
172
|
+
savedTo = String(args.path);
|
|
173
|
+
} else if (currentPath === '') {
|
|
174
|
+
IDC.fail('invalid_argument',
|
|
175
|
+
'This document has never been saved; path is required when save_changes is "yes".', null);
|
|
176
|
+
} else {
|
|
177
|
+
savedTo = currentPath;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
if (args.save_changes === 'yes') {
|
|
183
|
+
if (target !== null) { doc.close(SaveOptions.YES, target); }
|
|
184
|
+
else { doc.close(SaveOptions.YES); }
|
|
185
|
+
} else {
|
|
186
|
+
doc.close(SaveOptions.NO);
|
|
187
|
+
}
|
|
188
|
+
} catch (e) {
|
|
189
|
+
IDC.fail('io_error', 'InDesign could not close the document: ' + String(e.message ? e.message : e),
|
|
190
|
+
{ document_id: documentId });
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
var remaining = [];
|
|
194
|
+
var i;
|
|
195
|
+
for (i = 0; i < app.documents.length; i++) {
|
|
196
|
+
remaining.push(Number(app.documents.item(i).id));
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
ctx.changes = { closed_document_ids: [documentId] };
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
document_id: documentId,
|
|
203
|
+
name: name,
|
|
204
|
+
saved_to: savedTo,
|
|
205
|
+
had_unsaved_changes: hadUnsavedChanges,
|
|
206
|
+
remaining_document_ids: remaining
|
|
207
|
+
};
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
/* ------------------------------------------------------- create_document */
|
|
211
|
+
|
|
212
|
+
var IDC_PAGE_PRESETS = {
|
|
213
|
+
A4: { width: 210, height: 297 },
|
|
214
|
+
Letter: { width: 215.9, height: 279.4 },
|
|
215
|
+
Legal: { width: 215.9, height: 355.6 },
|
|
216
|
+
Tabloid: { width: 279.4, height: 431.8 }
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
function idcIsNumber(value) {
|
|
220
|
+
return typeof value === 'number' && isFinite(value);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* Seitenformat aus preset oder width_mm/height_mm, Ausrichtung beachten. */
|
|
224
|
+
function idcPageSize(args) {
|
|
225
|
+
var width = null;
|
|
226
|
+
var height = null;
|
|
227
|
+
var preset;
|
|
228
|
+
var swap;
|
|
229
|
+
|
|
230
|
+
if (args.preset !== undefined && args.preset !== null) {
|
|
231
|
+
preset = IDC_PAGE_PRESETS[String(args.preset)];
|
|
232
|
+
if (!preset) {
|
|
233
|
+
IDC.fail('invalid_argument', 'preset must be one of A4, Letter, Legal, Tabloid.',
|
|
234
|
+
{ preset: String(args.preset) });
|
|
235
|
+
}
|
|
236
|
+
width = preset.width;
|
|
237
|
+
height = preset.height;
|
|
238
|
+
}
|
|
239
|
+
if (idcIsNumber(args.width_mm)) { width = args.width_mm; }
|
|
240
|
+
if (idcIsNumber(args.height_mm)) { height = args.height_mm; }
|
|
241
|
+
if (width === null || height === null) {
|
|
242
|
+
IDC.fail('invalid_argument', 'Pass preset or both width_mm and height_mm.', null);
|
|
243
|
+
}
|
|
244
|
+
if (width <= 0 || height <= 0) {
|
|
245
|
+
IDC.fail('invalid_argument', 'width_mm and height_mm must be greater than 0.',
|
|
246
|
+
{ width_mm: width, height_mm: height });
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if (args.orientation === 'landscape') { swap = width < height; }
|
|
250
|
+
else if (args.orientation === 'portrait' || args.orientation === undefined) { swap = args.orientation === 'portrait' && width > height; }
|
|
251
|
+
else {
|
|
252
|
+
IDC.fail('invalid_argument', 'orientation must be "portrait" or "landscape".',
|
|
253
|
+
{ orientation: String(args.orientation) });
|
|
254
|
+
}
|
|
255
|
+
if (swap) { return { width: height, height: width }; }
|
|
256
|
+
return { width: width, height: height };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/*
|
|
260
|
+
* Stege. InDesign kennt in der Skriptschnittstelle nur left/right; bei
|
|
261
|
+
* Doppelseiten bedeutet left "innen" und right "aussen" (Bund- und
|
|
262
|
+
* Aussensteg). inside/outside werden deshalb darauf abgebildet.
|
|
263
|
+
*/
|
|
264
|
+
function idcMargins(spec, facing, ctx) {
|
|
265
|
+
var out = { top: null, bottom: null, left: null, right: null };
|
|
266
|
+
var hasLR, hasIO;
|
|
267
|
+
|
|
268
|
+
if (!spec || typeof spec !== 'object') {
|
|
269
|
+
IDC.fail('invalid_argument',
|
|
270
|
+
'margins_mm is required: { top, bottom, left, right } or { top, bottom, inside, outside }.', null);
|
|
271
|
+
}
|
|
272
|
+
hasLR = idcIsNumber(spec.left) && idcIsNumber(spec.right);
|
|
273
|
+
hasIO = idcIsNumber(spec.inside) && idcIsNumber(spec.outside);
|
|
274
|
+
if (!idcIsNumber(spec.top) || !idcIsNumber(spec.bottom) || (!hasLR && !hasIO)) {
|
|
275
|
+
IDC.fail('invalid_argument',
|
|
276
|
+
'margins_mm needs top, bottom and either left/right or inside/outside, all numbers.', spec);
|
|
277
|
+
}
|
|
278
|
+
out.top = spec.top;
|
|
279
|
+
out.bottom = spec.bottom;
|
|
280
|
+
if (hasIO) {
|
|
281
|
+
out.left = spec.inside;
|
|
282
|
+
out.right = spec.outside;
|
|
283
|
+
if (!facing) { ctx.warn('inside/outside given for single pages: inside is used as left, outside as right.'); }
|
|
284
|
+
} else {
|
|
285
|
+
out.left = spec.left;
|
|
286
|
+
out.right = spec.right;
|
|
287
|
+
if (facing) { ctx.warn('left/right given for facing pages: left is the inside margin (Bundsteg), right the outside margin.'); }
|
|
288
|
+
}
|
|
289
|
+
var k;
|
|
290
|
+
for (k in out) {
|
|
291
|
+
if (IDC.hasOwn(out, k) && out[k] < 0) {
|
|
292
|
+
IDC.fail('invalid_argument', 'margins_mm.' + k + ' must not be negative.', spec);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return out;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function idcApplyMargins(target, margins, columns) {
|
|
299
|
+
var prefs = target.marginPreferences;
|
|
300
|
+
prefs.top = margins.top;
|
|
301
|
+
prefs.bottom = margins.bottom;
|
|
302
|
+
prefs.left = margins.left;
|
|
303
|
+
prefs.right = margins.right;
|
|
304
|
+
if (columns !== null) {
|
|
305
|
+
prefs.columnCount = columns.count;
|
|
306
|
+
prefs.columnGutter = columns.gutter_mm;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
IDC.register('create_document', { needs_document: false, read_only: false, ruler: 'none' },
|
|
311
|
+
function (ctx) {
|
|
312
|
+
var args = ctx.args;
|
|
313
|
+
var size = idcPageSize(args);
|
|
314
|
+
var facing = args.facing_pages === undefined ? true : args.facing_pages === true;
|
|
315
|
+
var pages = args.pages === undefined ? 1 : args.pages;
|
|
316
|
+
var columns = null;
|
|
317
|
+
var margins;
|
|
318
|
+
var doc, prefs, i, j, spread, page;
|
|
319
|
+
var pageIds = [];
|
|
320
|
+
|
|
321
|
+
if (!idcIsNumber(pages) || pages < 1 || Math.floor(pages) !== pages || pages > 9999) {
|
|
322
|
+
IDC.fail('invalid_argument', 'pages must be a whole number from 1 to 9999.', { pages: args.pages });
|
|
323
|
+
}
|
|
324
|
+
margins = idcMargins(args.margins_mm, facing, ctx);
|
|
325
|
+
if (args.columns !== undefined && args.columns !== null) {
|
|
326
|
+
if (typeof args.columns !== 'object' || !idcIsNumber(args.columns.count) || args.columns.count < 1) {
|
|
327
|
+
IDC.fail('invalid_argument', 'columns must be { count, gutter_mm } with count >= 1.', args.columns);
|
|
328
|
+
}
|
|
329
|
+
columns = {
|
|
330
|
+
count: Math.floor(args.columns.count),
|
|
331
|
+
gutter_mm: idcIsNumber(args.columns.gutter_mm) ? args.columns.gutter_mm : 4.233
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
doc = app.documents.add();
|
|
337
|
+
} catch (e) {
|
|
338
|
+
IDC.fail('script_error', 'InDesign could not create a document: ' + String(e.message ? e.message : e), null);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
try {
|
|
342
|
+
prefs = doc.documentPreferences;
|
|
343
|
+
prefs.facingPages = facing;
|
|
344
|
+
prefs.pageWidth = size.width;
|
|
345
|
+
prefs.pageHeight = size.height;
|
|
346
|
+
prefs.pagesPerDocument = pages;
|
|
347
|
+
|
|
348
|
+
/* Vorgabe fuer kuenftige Seiten, dann Musterseiten, dann die Seiten selbst. */
|
|
349
|
+
idcApplyMargins(doc, margins, columns);
|
|
350
|
+
for (i = 0; i < doc.masterSpreads.length; i++) {
|
|
351
|
+
spread = doc.masterSpreads.item(i);
|
|
352
|
+
for (j = 0; j < spread.pages.length; j++) {
|
|
353
|
+
idcApplyMargins(spread.pages.item(j), margins, columns);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
for (i = 0; i < doc.pages.length; i++) {
|
|
357
|
+
page = doc.pages.item(i);
|
|
358
|
+
idcApplyMargins(page, margins, columns);
|
|
359
|
+
pageIds.push(Number(page.id));
|
|
360
|
+
}
|
|
361
|
+
} catch (e2) {
|
|
362
|
+
IDC.fail('script_error', 'Document was created but could not be set up: ' + String(e2.message ? e2.message : e2),
|
|
363
|
+
{ document_id: Number(doc.id) });
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
ctx.changes = { created_document_ids: [Number(doc.id)] };
|
|
367
|
+
|
|
368
|
+
return {
|
|
369
|
+
document_id: Number(doc.id),
|
|
370
|
+
name: String(doc.name),
|
|
371
|
+
page_ids: pageIds,
|
|
372
|
+
page_count: doc.pages.length,
|
|
373
|
+
page_width_mm: IDC.round(prefs.pageWidth),
|
|
374
|
+
page_height_mm: IDC.round(prefs.pageHeight),
|
|
375
|
+
facing_pages: prefs.facingPages === true
|
|
376
|
+
};
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
/* --------------------------------------------------------- save_document */
|
|
380
|
+
|
|
381
|
+
IDC.register('save_document', { needs_document: true, read_only: false, ruler: 'none' },
|
|
382
|
+
function (ctx) {
|
|
383
|
+
var args = ctx.args;
|
|
384
|
+
var doc = ctx.doc;
|
|
385
|
+
var target = null;
|
|
386
|
+
|
|
387
|
+
if (args.path !== undefined && args.path !== null) {
|
|
388
|
+
if (typeof args.path !== 'string' || args.path.length === 0) {
|
|
389
|
+
IDC.fail('invalid_argument', 'path must be a non-empty file path.', null);
|
|
390
|
+
}
|
|
391
|
+
target = IDC.fileFor(args.path);
|
|
392
|
+
if (!IDC.fileParentExists(target)) {
|
|
393
|
+
IDC.fail('io_error', 'The folder for the target path does not exist: ' + args.path, { path: args.path });
|
|
394
|
+
}
|
|
395
|
+
} else if (doc.saved !== true) {
|
|
396
|
+
IDC.fail('io_error',
|
|
397
|
+
'This document has never been saved; path is required for the first save.', null);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
try {
|
|
401
|
+
if (target !== null) { doc.save(target); }
|
|
402
|
+
else { doc.save(); }
|
|
403
|
+
} catch (e) {
|
|
404
|
+
IDC.fail('io_error', 'InDesign could not save the document: ' + String(e.message ? e.message : e),
|
|
405
|
+
{ path: target === null ? idcDocumentPath(doc) : args.path });
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
ctx.changes = { saved_document_ids: [Number(doc.id)] };
|
|
409
|
+
return {
|
|
410
|
+
document_id: Number(doc.id),
|
|
411
|
+
name: String(doc.name),
|
|
412
|
+
path: idcDocumentPath(doc)
|
|
413
|
+
};
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
/* ---------------------------------------------------- set_document_bleed */
|
|
417
|
+
|
|
418
|
+
/* Zahl = alle Kanten; Objekt = nur die genannten Kanten; Grenzen pruefen. */
|
|
419
|
+
function idcEdges(value, field, max) {
|
|
420
|
+
var out = { top: null, left: null, bottom: null, right: null };
|
|
421
|
+
var keys = ['top', 'left', 'bottom', 'right'];
|
|
422
|
+
var i, k, any = false;
|
|
423
|
+
|
|
424
|
+
if (idcIsNumber(value)) {
|
|
425
|
+
for (i = 0; i < keys.length; i++) { out[keys[i]] = value; }
|
|
426
|
+
any = true;
|
|
427
|
+
} else if (value && typeof value === 'object') {
|
|
428
|
+
for (i = 0; i < keys.length; i++) {
|
|
429
|
+
k = keys[i];
|
|
430
|
+
if (value[k] !== undefined && value[k] !== null) {
|
|
431
|
+
if (!idcIsNumber(value[k])) {
|
|
432
|
+
IDC.fail('invalid_argument', field + '.' + k + ' must be a number.', value);
|
|
433
|
+
}
|
|
434
|
+
out[k] = value[k];
|
|
435
|
+
any = true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
} else {
|
|
439
|
+
IDC.fail('invalid_argument', field + ' must be a number or an object with top/left/bottom/right.', null);
|
|
440
|
+
}
|
|
441
|
+
if (!any) {
|
|
442
|
+
IDC.fail('invalid_argument', field + ' names no edge.', value);
|
|
443
|
+
}
|
|
444
|
+
for (i = 0; i < keys.length; i++) {
|
|
445
|
+
k = keys[i];
|
|
446
|
+
if (out[k] !== null && (out[k] < 0 || out[k] > max)) {
|
|
447
|
+
IDC.fail('invalid_argument', field + '.' + k + ' must be between 0 and ' + max + ' mm.', value);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return out;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
function idcAllEqual(edges) {
|
|
454
|
+
return edges.top !== null && edges.left !== null && edges.bottom !== null && edges.right !== null
|
|
455
|
+
&& edges.top === edges.left && edges.top === edges.bottom && edges.top === edges.right;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
IDC.register('set_document_bleed', { needs_document: true, read_only: false, ruler: 'none' },
|
|
459
|
+
function (ctx) {
|
|
460
|
+
var args = ctx.args;
|
|
461
|
+
var prefs = ctx.doc.documentPreferences;
|
|
462
|
+
var bleed = null;
|
|
463
|
+
var slug = null;
|
|
464
|
+
var changed = false;
|
|
465
|
+
|
|
466
|
+
if (args.bleed_mm !== undefined && args.bleed_mm !== null) { bleed = idcEdges(args.bleed_mm, 'bleed_mm', 50); }
|
|
467
|
+
if (args.slug_mm !== undefined && args.slug_mm !== null) { slug = idcEdges(args.slug_mm, 'slug_mm', 50); }
|
|
468
|
+
|
|
469
|
+
if (bleed !== null) {
|
|
470
|
+
prefs.documentBleedUniformSize = false;
|
|
471
|
+
if (bleed.top !== null) { prefs.documentBleedTopOffset = bleed.top; }
|
|
472
|
+
if (bleed.bottom !== null) { prefs.documentBleedBottomOffset = bleed.bottom; }
|
|
473
|
+
if (bleed.left !== null) { prefs.documentBleedInsideOrLeftOffset = bleed.left; }
|
|
474
|
+
if (bleed.right !== null) { prefs.documentBleedOutsideOrRightOffset = bleed.right; }
|
|
475
|
+
/* uniform nach dem, was jetzt wirklich steht – auch wenn nur eine Kante genannt war */
|
|
476
|
+
if (idcAllEqual({
|
|
477
|
+
top: prefs.documentBleedTopOffset, left: prefs.documentBleedInsideOrLeftOffset,
|
|
478
|
+
bottom: prefs.documentBleedBottomOffset, right: prefs.documentBleedOutsideOrRightOffset
|
|
479
|
+
})) { prefs.documentBleedUniformSize = true; }
|
|
480
|
+
changed = true;
|
|
481
|
+
}
|
|
482
|
+
if (slug !== null) {
|
|
483
|
+
prefs.documentSlugUniformSize = false;
|
|
484
|
+
if (slug.top !== null) { prefs.slugTopOffset = slug.top; }
|
|
485
|
+
if (slug.bottom !== null) { prefs.slugBottomOffset = slug.bottom; }
|
|
486
|
+
if (slug.left !== null) { prefs.slugInsideOrLeftOffset = slug.left; }
|
|
487
|
+
if (slug.right !== null) { prefs.slugRightOrOutsideOffset = slug.right; }
|
|
488
|
+
if (idcAllEqual({
|
|
489
|
+
top: prefs.slugTopOffset, left: prefs.slugInsideOrLeftOffset,
|
|
490
|
+
bottom: prefs.slugBottomOffset, right: prefs.slugRightOrOutsideOffset
|
|
491
|
+
})) { prefs.documentSlugUniformSize = true; }
|
|
492
|
+
changed = true;
|
|
493
|
+
}
|
|
494
|
+
if (!changed) { ctx.warn('Neither bleed_mm nor slug_mm given; nothing changed, current values returned.'); }
|
|
495
|
+
else { ctx.changes = { modified_document_ids: [Number(ctx.doc.id)] }; }
|
|
496
|
+
|
|
497
|
+
return {
|
|
498
|
+
bleed_mm: {
|
|
499
|
+
top: IDC.round(prefs.documentBleedTopOffset),
|
|
500
|
+
left: IDC.round(prefs.documentBleedInsideOrLeftOffset),
|
|
501
|
+
bottom: IDC.round(prefs.documentBleedBottomOffset),
|
|
502
|
+
right: IDC.round(prefs.documentBleedOutsideOrRightOffset)
|
|
503
|
+
},
|
|
504
|
+
slug_mm: {
|
|
505
|
+
top: IDC.round(prefs.slugTopOffset),
|
|
506
|
+
left: IDC.round(prefs.slugInsideOrLeftOffset),
|
|
507
|
+
bottom: IDC.round(prefs.slugBottomOffset),
|
|
508
|
+
right: IDC.round(prefs.slugRightOrOutsideOffset)
|
|
509
|
+
},
|
|
510
|
+
bleed_uniform: prefs.documentBleedUniformSize === true,
|
|
511
|
+
slug_uniform: prefs.documentSlugUniformSize === true
|
|
512
|
+
};
|
|
513
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* Wunschliste J2 Nr. 21 (Sitzung 8) – Dokumenteinrichtung nachtraeglich: set_document_setup. */
|
|
2
|
+
|
|
3
|
+
function idcDescribeSetup(doc) {
|
|
4
|
+
var prefs = doc.documentPreferences;
|
|
5
|
+
var out = { page_width_mm: null, page_height_mm: null, facing_pages: null, page_count: null, start_page_number: null, allow_page_shuffle: null };
|
|
6
|
+
try { out.page_width_mm = IDC.round(Number(prefs.pageWidth)); } catch (e0) { /* null */ }
|
|
7
|
+
try { out.page_height_mm = IDC.round(Number(prefs.pageHeight)); } catch (e1) { /* null */ }
|
|
8
|
+
try { out.facing_pages = prefs.facingPages === true; } catch (e2) { /* null */ }
|
|
9
|
+
try { out.page_count = Number(doc.pages.length); } catch (e3) { /* null */ }
|
|
10
|
+
try { out.start_page_number = Number(prefs.startPageNumber); } catch (e4) { /* null */ }
|
|
11
|
+
try { out.allow_page_shuffle = prefs.allowPageShuffle === true; } catch (e5) { /* null */ }
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
IDC.register('set_document_setup', { needs_document: true, read_only: false, ruler: 'none' },
|
|
16
|
+
function (ctx) {
|
|
17
|
+
var args = ctx.args;
|
|
18
|
+
var doc = ctx.doc;
|
|
19
|
+
var prefs = doc.documentPreferences;
|
|
20
|
+
var before = idcDescribeSetup(doc);
|
|
21
|
+
var width = before.page_width_mm, height = before.page_height_mm, swap = false, sizeGiven = false;
|
|
22
|
+
var given = 0, after, i, page, removed = [], added = [], pageIds = [];
|
|
23
|
+
|
|
24
|
+
if (args.preset !== undefined && args.preset !== null) {
|
|
25
|
+
if (!IDC_PAGE_PRESETS[String(args.preset)]) {
|
|
26
|
+
IDC.fail('invalid_argument', 'preset must be one of A4, Letter, Legal, Tabloid.', { preset: String(args.preset) });
|
|
27
|
+
}
|
|
28
|
+
width = IDC_PAGE_PRESETS[String(args.preset)].width;
|
|
29
|
+
height = IDC_PAGE_PRESETS[String(args.preset)].height;
|
|
30
|
+
sizeGiven = true; given += 1;
|
|
31
|
+
}
|
|
32
|
+
if (args.width_mm !== undefined && args.width_mm !== null) {
|
|
33
|
+
if (!idcIsNumber(args.width_mm) || args.width_mm <= 0 || args.width_mm > 5486) { IDC.fail('invalid_argument', 'width_mm must be a number above 0 (mm).', { width_mm: args.width_mm }); }
|
|
34
|
+
width = args.width_mm; sizeGiven = true; given += 1;
|
|
35
|
+
}
|
|
36
|
+
if (args.height_mm !== undefined && args.height_mm !== null) {
|
|
37
|
+
if (!idcIsNumber(args.height_mm) || args.height_mm <= 0 || args.height_mm > 5486) { IDC.fail('invalid_argument', 'height_mm must be a number above 0 (mm).', { height_mm: args.height_mm }); }
|
|
38
|
+
height = args.height_mm; sizeGiven = true; given += 1;
|
|
39
|
+
}
|
|
40
|
+
if (args.orientation !== undefined && args.orientation !== null) {
|
|
41
|
+
if (args.orientation === 'landscape') { swap = width < height; }
|
|
42
|
+
else if (args.orientation === 'portrait') { swap = width > height; }
|
|
43
|
+
else { IDC.fail('invalid_argument', 'orientation must be "portrait" or "landscape".', { orientation: String(args.orientation) }); }
|
|
44
|
+
if (swap) { sizeGiven = true; }
|
|
45
|
+
given += 1;
|
|
46
|
+
}
|
|
47
|
+
if (args.facing_pages !== undefined && args.facing_pages !== null) {
|
|
48
|
+
if (args.facing_pages !== true && args.facing_pages !== false) { IDC.fail('invalid_argument', 'facing_pages must be true or false.', null); }
|
|
49
|
+
given += 1;
|
|
50
|
+
}
|
|
51
|
+
if (args.pages !== undefined && args.pages !== null) {
|
|
52
|
+
if (!idcIsNumber(args.pages) || args.pages < 1 || Math.floor(args.pages) !== args.pages || args.pages > 9999) {
|
|
53
|
+
IDC.fail('invalid_argument', 'pages must be a whole number from 1 to 9999.', { pages: args.pages });
|
|
54
|
+
}
|
|
55
|
+
if (args.pages < before.page_count && args.allow_page_removal !== true) {
|
|
56
|
+
IDC.fail('invalid_argument', 'pages ' + args.pages + ' is below the current page count ' + before.page_count + '; InDesign would delete the last pages with their contents. Pass allow_page_removal true to confirm, or use delete_page.',
|
|
57
|
+
{ pages: args.pages, page_count: before.page_count });
|
|
58
|
+
}
|
|
59
|
+
given += 1;
|
|
60
|
+
}
|
|
61
|
+
if (args.start_page_number !== undefined && args.start_page_number !== null) {
|
|
62
|
+
if (!idcIsNumber(args.start_page_number) || args.start_page_number < 1 || Math.floor(args.start_page_number) !== args.start_page_number) {
|
|
63
|
+
IDC.fail('invalid_argument', 'start_page_number must be a whole number of 1 or more.', { start_page_number: args.start_page_number });
|
|
64
|
+
}
|
|
65
|
+
given += 1;
|
|
66
|
+
}
|
|
67
|
+
if (given === 0) {
|
|
68
|
+
IDC.fail('invalid_argument', 'Pass at least one of preset, width_mm, height_mm, orientation, facing_pages, pages, start_page_number.', null);
|
|
69
|
+
}
|
|
70
|
+
if (swap) { i = width; width = height; height = i; }
|
|
71
|
+
|
|
72
|
+
for (i = 0; i < doc.pages.length; i++) { try { pageIds.push(Number(doc.pages.item(i).id)); } catch (e0) { /* ohne */ } }
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
if (args.facing_pages !== undefined && args.facing_pages !== null) { prefs.facingPages = args.facing_pages; }
|
|
76
|
+
if (sizeGiven) {
|
|
77
|
+
prefs.pageWidth = width;
|
|
78
|
+
prefs.pageHeight = height;
|
|
79
|
+
}
|
|
80
|
+
if (args.pages !== undefined && args.pages !== null) { prefs.pagesPerDocument = args.pages; }
|
|
81
|
+
if (args.start_page_number !== undefined && args.start_page_number !== null) { prefs.startPageNumber = args.start_page_number; }
|
|
82
|
+
} catch (e1) {
|
|
83
|
+
IDC.fail('script_error', 'InDesign could not change the document setup: ' + String(e1.message ? e1.message : e1), null);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
after = idcDescribeSetup(doc);
|
|
87
|
+
/* Welche Seiten sind weg, welche neu? */
|
|
88
|
+
var current = {};
|
|
89
|
+
for (i = 0; i < doc.pages.length; i++) {
|
|
90
|
+
try { page = doc.pages.item(i); current[Number(page.id)] = true; if (!idcIdIn(pageIds, Number(page.id))) { added.push(Number(page.id)); } } catch (e2) { /* ohne */ }
|
|
91
|
+
}
|
|
92
|
+
for (i = 0; i < pageIds.length; i++) { if (!current[pageIds[i]]) { removed.push(pageIds[i]); } }
|
|
93
|
+
|
|
94
|
+
if (sizeGiven && (after.page_width_mm !== IDC.round(width) || after.page_height_mm !== IDC.round(height))) {
|
|
95
|
+
ctx.warn('InDesign reports the page size ' + after.page_width_mm + ' x ' + after.page_height_mm + ' mm after the change.');
|
|
96
|
+
}
|
|
97
|
+
if (sizeGiven && (before.page_width_mm !== after.page_width_mm || before.page_height_mm !== after.page_height_mm)) {
|
|
98
|
+
ctx.warn('The page size changed; objects and margins are not adjusted automatically – check get_layout_grid and get_page_state.');
|
|
99
|
+
}
|
|
100
|
+
if (args.facing_pages !== undefined && args.facing_pages !== null && before.facing_pages !== after.facing_pages) {
|
|
101
|
+
ctx.warn('facing_pages changed; spreads and parent pages were rearranged by InDesign – read list_pages and list_parent_pages again.');
|
|
102
|
+
}
|
|
103
|
+
if (removed.length > 0) { ctx.warn(removed.length + ' page(s) were removed with their contents.'); }
|
|
104
|
+
ctx.changes = { modified_document_ids: [Number(doc.id)], created_page_ids: added, removed_page_ids: removed };
|
|
105
|
+
return {
|
|
106
|
+
setup: after,
|
|
107
|
+
previous: before,
|
|
108
|
+
pages_added: added,
|
|
109
|
+
pages_removed: removed,
|
|
110
|
+
changed: IDC.stringify(before) !== IDC.stringify(after)
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
function idcIdIn(list, id) {
|
|
115
|
+
var i;
|
|
116
|
+
for (i = 0; i < list.length; i++) { if (list[i] === id) { return true; } }
|
|
117
|
+
return false;
|
|
118
|
+
}
|