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,291 @@
|
|
|
1
|
+
/* Wunschliste J Nr. 2 (Sitzung 8) – Ebenen: list_layers, set_frame_layer, set_layer_visibility. */
|
|
2
|
+
|
|
3
|
+
function idcReadBool(target, property) {
|
|
4
|
+
try {
|
|
5
|
+
var v = target[property];
|
|
6
|
+
if (v === true || v === false) { return v; }
|
|
7
|
+
return null;
|
|
8
|
+
} catch (e) { return null; }
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/* Anzahl der Objekte einer Ebene (Dokument- und Musterseiten). */
|
|
12
|
+
function idcLayerItemCount(layer) {
|
|
13
|
+
try { return Number(layer.pageItems.length); } catch (e) { return null; }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function idcDescribeLayer(layer, index) {
|
|
17
|
+
var out = {
|
|
18
|
+
layer_id: null,
|
|
19
|
+
name: null,
|
|
20
|
+
index: index,
|
|
21
|
+
visible: idcReadBool(layer, 'visible'),
|
|
22
|
+
locked: idcReadBool(layer, 'locked'),
|
|
23
|
+
printable: idcReadBool(layer, 'printable'),
|
|
24
|
+
ignore_wrap: idcReadBool(layer, 'ignoreWrap'),
|
|
25
|
+
show_guides: idcReadBool(layer, 'showGuides'),
|
|
26
|
+
lock_guides: idcReadBool(layer, 'lockGuides'),
|
|
27
|
+
item_count: idcLayerItemCount(layer)
|
|
28
|
+
};
|
|
29
|
+
try { out.layer_id = Number(layer.id); } catch (e0) { /* null */ }
|
|
30
|
+
try { out.name = String(layer.name); } catch (e1) { /* null */ }
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Ebene ueber Name oder ID; genau eines von beiden. Liefert { layer, index }. */
|
|
35
|
+
function idcLayerArg(doc, args) {
|
|
36
|
+
var hasName = args.layer_name !== undefined && args.layer_name !== null;
|
|
37
|
+
var hasId = args.layer_id !== undefined && args.layer_id !== null;
|
|
38
|
+
var i, layer, name;
|
|
39
|
+
if (hasName && hasId) {
|
|
40
|
+
IDC.fail('invalid_argument', 'Pass either layer_name or layer_id, not both.', { layer_name: args.layer_name, layer_id: args.layer_id });
|
|
41
|
+
}
|
|
42
|
+
if (!hasName && !hasId) {
|
|
43
|
+
IDC.fail('invalid_argument', 'layer_name or layer_id is required.', null);
|
|
44
|
+
}
|
|
45
|
+
if (hasName && (typeof args.layer_name !== 'string' || args.layer_name === '')) {
|
|
46
|
+
IDC.fail('invalid_argument', 'layer_name must be a non-empty string.', { layer_name: args.layer_name });
|
|
47
|
+
}
|
|
48
|
+
for (i = 0; i < doc.layers.length; i++) {
|
|
49
|
+
layer = doc.layers.item(i);
|
|
50
|
+
if (hasId) {
|
|
51
|
+
if (Number(layer.id) === Number(args.layer_id)) { return { layer: layer, index: i }; }
|
|
52
|
+
} else {
|
|
53
|
+
try { name = String(layer.name); } catch (e) { name = ''; }
|
|
54
|
+
if (name === String(args.layer_name)) { return { layer: layer, index: i }; }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (hasId) {
|
|
58
|
+
IDC.fail('not_found', 'No layer with layer_id ' + args.layer_id + ' in this document; see list_layers.', { layer_id: args.layer_id });
|
|
59
|
+
}
|
|
60
|
+
IDC.fail('not_found', 'No layer named "' + args.layer_name + '" in this document; see list_layers.', { layer_name: args.layer_name });
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Ebene eines Objekts, mit Index in doc.layers. */
|
|
65
|
+
function idcLayerOfItem(doc, item) {
|
|
66
|
+
var layer = null;
|
|
67
|
+
var i, candidate;
|
|
68
|
+
try { layer = item.itemLayer; } catch (e0) { layer = null; }
|
|
69
|
+
if (layer === null || layer === undefined) { return null; }
|
|
70
|
+
for (i = 0; i < doc.layers.length; i++) {
|
|
71
|
+
candidate = doc.layers.item(i);
|
|
72
|
+
if (Number(candidate.id) === Number(layer.id)) { return { layer: candidate, index: i }; }
|
|
73
|
+
}
|
|
74
|
+
return { layer: layer, index: null };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Kurzform fuer Rueckgaben anderer Werkzeuge: { layer_id, layer_name, visible, locked }. */
|
|
78
|
+
function idcLayerSummary(doc, item) {
|
|
79
|
+
var found = idcLayerOfItem(doc, item);
|
|
80
|
+
var out = { layer_id: null, layer_name: null, visible: null, locked: null };
|
|
81
|
+
if (found === null) { return out; }
|
|
82
|
+
try { out.layer_id = Number(found.layer.id); } catch (e0) { /* null */ }
|
|
83
|
+
try { out.layer_name = String(found.layer.name); } catch (e1) { /* null */ }
|
|
84
|
+
out.visible = idcReadBool(found.layer, 'visible');
|
|
85
|
+
out.locked = idcReadBool(found.layer, 'locked');
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function idcLayerName(item) {
|
|
90
|
+
try { return String(item.itemLayer.name); } catch (e) { return null; }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/*
|
|
94
|
+
* Schreibende Werkzeuge: Objekt auf gesperrter Ebene oder selbst gesperrt
|
|
95
|
+
* -> invalid_state mit klarer Ansage statt eines nackten InDesign-Fehlers.
|
|
96
|
+
*/
|
|
97
|
+
function idcRejectLocked(doc, item, frameId, what) {
|
|
98
|
+
var layer = idcLayerSummary(doc, item);
|
|
99
|
+
var itemLocked = idcReadBool(item, 'locked');
|
|
100
|
+
if (layer.locked === true) {
|
|
101
|
+
IDC.fail('invalid_state', 'Object ' + frameId + ' lies on the locked layer "' + layer.layer_name + '"; ' + what +
|
|
102
|
+
' cannot change it. Unlock the layer with set_layer_visibility (locked false) first.',
|
|
103
|
+
{ frame_id: frameId, layer_id: layer.layer_id, layer_name: layer.layer_name, layer_locked: true, item_locked: itemLocked === true });
|
|
104
|
+
}
|
|
105
|
+
if (itemLocked === true) {
|
|
106
|
+
IDC.fail('invalid_state', 'Object ' + frameId + ' is locked (Objekt > Sperren); ' + what + ' cannot change it.',
|
|
107
|
+
{ frame_id: frameId, layer_id: layer.layer_id, layer_name: layer.layer_name, layer_locked: false, item_locked: true });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
IDC.register('list_layers', { needs_document: true, read_only: true, ruler: 'none' },
|
|
112
|
+
function (ctx) {
|
|
113
|
+
var doc = ctx.doc;
|
|
114
|
+
var out = [];
|
|
115
|
+
var i, activeId = null, hidden = 0, locked = 0, nonPrinting = 0, entry;
|
|
116
|
+
for (i = 0; i < doc.layers.length; i++) {
|
|
117
|
+
entry = idcDescribeLayer(doc.layers.item(i), i);
|
|
118
|
+
if (entry.visible === false) { hidden += 1; }
|
|
119
|
+
if (entry.locked === true) { locked += 1; }
|
|
120
|
+
if (entry.printable === false) { nonPrinting += 1; }
|
|
121
|
+
out.push(entry);
|
|
122
|
+
}
|
|
123
|
+
try { activeId = Number(doc.activeLayer.id); } catch (e0) { activeId = null; }
|
|
124
|
+
if (nonPrinting > 0) {
|
|
125
|
+
ctx.warn(nonPrinting + ' layer(s) are set to not print; their objects are missing from PDF exports.');
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
layers: out,
|
|
129
|
+
count: out.length,
|
|
130
|
+
active_layer_id: activeId,
|
|
131
|
+
hidden_count: hidden,
|
|
132
|
+
locked_count: locked,
|
|
133
|
+
non_printing_count: nonPrinting
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
IDC.register('set_frame_layer', { needs_document: true, read_only: false, ruler: 'none' },
|
|
138
|
+
function (ctx) {
|
|
139
|
+
var args = ctx.args;
|
|
140
|
+
var doc = ctx.doc;
|
|
141
|
+
var found = idcFrameArg(doc, args, 'frame_id');
|
|
142
|
+
var item = found.item;
|
|
143
|
+
var createIfMissing = args.create_if_missing === true;
|
|
144
|
+
var before = idcLayerSummary(doc, item);
|
|
145
|
+
var target = null;
|
|
146
|
+
var created = false;
|
|
147
|
+
var i, layer, name, after, changed;
|
|
148
|
+
|
|
149
|
+
idcRejectGroupMember(item, args.frame_id, 'set_frame_layer');
|
|
150
|
+
|
|
151
|
+
if (createIfMissing) {
|
|
152
|
+
if (typeof args.layer_name !== 'string' || args.layer_name === '') {
|
|
153
|
+
IDC.fail('invalid_argument', 'create_if_missing needs layer_name.', { layer_name: args.layer_name });
|
|
154
|
+
}
|
|
155
|
+
if (args.layer_id !== undefined && args.layer_id !== null) {
|
|
156
|
+
IDC.fail('invalid_argument', 'create_if_missing works with layer_name only, not layer_id.', { layer_id: args.layer_id });
|
|
157
|
+
}
|
|
158
|
+
for (i = 0; i < doc.layers.length; i++) {
|
|
159
|
+
layer = doc.layers.item(i);
|
|
160
|
+
try { name = String(layer.name); } catch (e0) { name = ''; }
|
|
161
|
+
if (name === String(args.layer_name)) { target = layer; }
|
|
162
|
+
}
|
|
163
|
+
if (target === null) {
|
|
164
|
+
try {
|
|
165
|
+
target = doc.layers.add({ name: String(args.layer_name) });
|
|
166
|
+
} catch (e1) {
|
|
167
|
+
IDC.fail('script_error', 'InDesign could not create layer "' + args.layer_name + '": ' + String(e1.message ? e1.message : e1),
|
|
168
|
+
{ layer_name: args.layer_name });
|
|
169
|
+
}
|
|
170
|
+
created = true;
|
|
171
|
+
ctx.warn('Layer "' + args.layer_name + '" did not exist and was created (on top).');
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
target = idcLayerArg(doc, args).layer;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (before.layer_id !== null && Number(target.id) === before.layer_id) {
|
|
178
|
+
return {
|
|
179
|
+
frame_id: Number(item.id),
|
|
180
|
+
type: IDC.itemType(item),
|
|
181
|
+
layer_id: before.layer_id,
|
|
182
|
+
layer_name: before.layer_name,
|
|
183
|
+
previous_layer_id: before.layer_id,
|
|
184
|
+
previous_layer_name: before.layer_name,
|
|
185
|
+
layer_created: created,
|
|
186
|
+
changed: false
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (idcReadBool(target, 'locked') === true) {
|
|
191
|
+
IDC.fail('invalid_state', 'Target layer "' + String(target.name) + '" is locked; unlock it with set_layer_visibility first.',
|
|
192
|
+
{ layer_id: Number(target.id), layer_name: String(target.name) });
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
item.itemLayer = target;
|
|
197
|
+
} catch (e2) {
|
|
198
|
+
IDC.fail('script_error', 'InDesign could not move object ' + args.frame_id + ' to layer "' + String(target.name) + '": ' + String(e2.message ? e2.message : e2),
|
|
199
|
+
{ frame_id: args.frame_id, layer_name: String(target.name) });
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
after = idcLayerSummary(doc, item);
|
|
203
|
+
changed = after.layer_id !== before.layer_id;
|
|
204
|
+
if (!changed) {
|
|
205
|
+
ctx.warn('InDesign reports the object still on layer "' + after.layer_name + '" after the move.');
|
|
206
|
+
}
|
|
207
|
+
if (after.visible === false) {
|
|
208
|
+
ctx.warn('Layer "' + after.layer_name + '" is hidden; the object is now invisible.');
|
|
209
|
+
}
|
|
210
|
+
ctx.changes = { modified_frame_ids: [Number(item.id)] };
|
|
211
|
+
return {
|
|
212
|
+
frame_id: Number(item.id),
|
|
213
|
+
type: IDC.itemType(item),
|
|
214
|
+
layer_id: after.layer_id,
|
|
215
|
+
layer_name: after.layer_name,
|
|
216
|
+
previous_layer_id: before.layer_id,
|
|
217
|
+
previous_layer_name: before.layer_name,
|
|
218
|
+
layer_created: created,
|
|
219
|
+
changed: changed
|
|
220
|
+
};
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
IDC.register('set_layer_visibility', { needs_document: true, read_only: false, ruler: 'none' },
|
|
224
|
+
function (ctx) {
|
|
225
|
+
var args = ctx.args;
|
|
226
|
+
var doc = ctx.doc;
|
|
227
|
+
var found = idcLayerArg(doc, args);
|
|
228
|
+
var layer = found.layer;
|
|
229
|
+
var fields = ['visible', 'locked', 'printable'];
|
|
230
|
+
var previous = {};
|
|
231
|
+
var wanted = {};
|
|
232
|
+
var given = 0;
|
|
233
|
+
var i, key, value, after, changed = false;
|
|
234
|
+
|
|
235
|
+
for (i = 0; i < fields.length; i++) {
|
|
236
|
+
key = fields[i];
|
|
237
|
+
value = args[key];
|
|
238
|
+
if (value === undefined || value === null) { continue; }
|
|
239
|
+
if (value !== true && value !== false) {
|
|
240
|
+
IDC.fail('invalid_argument', key + ' must be true or false.', { field: key, value: value });
|
|
241
|
+
}
|
|
242
|
+
wanted[key] = value;
|
|
243
|
+
given += 1;
|
|
244
|
+
}
|
|
245
|
+
if (given === 0) {
|
|
246
|
+
IDC.fail('invalid_argument', 'Pass at least one of visible, locked, printable.', null);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
for (i = 0; i < fields.length; i++) {
|
|
250
|
+
previous[fields[i]] = idcReadBool(layer, fields[i]);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
for (i = 0; i < fields.length; i++) {
|
|
254
|
+
key = fields[i];
|
|
255
|
+
if (!IDC.hasOwn(wanted, key)) { continue; }
|
|
256
|
+
if (previous[key] === wanted[key]) { continue; }
|
|
257
|
+
try {
|
|
258
|
+
layer[key] = wanted[key];
|
|
259
|
+
} catch (e0) {
|
|
260
|
+
IDC.fail('script_error', 'InDesign could not set ' + key + ' on layer "' + String(layer.name) + '": ' + String(e0.message ? e0.message : e0),
|
|
261
|
+
{ layer_id: Number(layer.id), layer_name: String(layer.name), field: key });
|
|
262
|
+
}
|
|
263
|
+
changed = true;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
after = idcDescribeLayer(layer, found.index);
|
|
267
|
+
for (i = 0; i < fields.length; i++) {
|
|
268
|
+
key = fields[i];
|
|
269
|
+
if (IDC.hasOwn(wanted, key) && after[key] !== wanted[key]) {
|
|
270
|
+
ctx.warn('InDesign reports ' + key + ' = ' + String(after[key]) + ' on layer "' + after.name + '" after the change.');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (after.visible === false && after.item_count > 0) {
|
|
274
|
+
ctx.warn('Layer "' + after.name + '" is hidden with ' + after.item_count + ' object(s) on it.');
|
|
275
|
+
}
|
|
276
|
+
if (after.printable === false) {
|
|
277
|
+
ctx.warn('Layer "' + after.name + '" does not print; its objects are missing from PDF exports.');
|
|
278
|
+
}
|
|
279
|
+
if (changed) { ctx.changes = { modified_layer_ids: [after.layer_id] }; }
|
|
280
|
+
return {
|
|
281
|
+
layer_id: after.layer_id,
|
|
282
|
+
name: after.name,
|
|
283
|
+
index: after.index,
|
|
284
|
+
visible: after.visible,
|
|
285
|
+
locked: after.locked,
|
|
286
|
+
printable: after.printable,
|
|
287
|
+
item_count: after.item_count,
|
|
288
|
+
previous: previous,
|
|
289
|
+
changed: changed
|
|
290
|
+
};
|
|
291
|
+
});
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Auftrag A-8.6 (Sitzung 9) – set_frame_effects: Deckkraft, Mischmodus,
|
|
3
|
+
* Schlagschatten und weiche Kante eines Objekts (InDesign "Effekte"),
|
|
4
|
+
* getrennt fuer Objekt, Flaeche, Kontur und Text. Adobe-DOM (Auftrag,
|
|
5
|
+
* geprueft 05.09.2026): transparencySettings, fillTransparencySettings,
|
|
6
|
+
* strokeTransparencySettings, contentTransparencySettings ->
|
|
7
|
+
* TransparencySetting {blendingSettings {opacity, blendMode},
|
|
8
|
+
* dropShadowSettings {mode, opacity, angle, distance, size, spread, noise,
|
|
9
|
+
* effectColor, blendMode, xOffset, yOffset, useGlobalLight, knockedOut,
|
|
10
|
+
* honorOtherEffects}, featherSettings {mode, width, cornerType, noise,
|
|
11
|
+
* chokeAmount}}. Werte von FeatherCornerType nicht belegbar (404) – live
|
|
12
|
+
* bestaetigt (Journal). Masse (distance, size, width, xOffset, yOffset)
|
|
13
|
+
* laufen ueber die Millimeter-Klammer des Interpreters.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
var IDC_BLEND_MODES = [
|
|
17
|
+
['normal', 'NORMAL'], ['multiply', 'MULTIPLY'], ['screen', 'SCREEN'], ['overlay', 'OVERLAY'],
|
|
18
|
+
['soft_light', 'SOFT_LIGHT'], ['hard_light', 'HARD_LIGHT'], ['color_dodge', 'COLOR_DODGE'],
|
|
19
|
+
['color_burn', 'COLOR_BURN'], ['darken', 'DARKEN'], ['lighten', 'LIGHTEN'], ['difference', 'DIFFERENCE'],
|
|
20
|
+
['exclusion', 'EXCLUSION'], ['hue', 'HUE'], ['saturation', 'SATURATION'], ['color', 'COLOR'], ['luminosity', 'LUMINOSITY']
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
var IDC_FEATHER_CORNERS = [['sharp', 'SHARP'], ['rounded', 'ROUNDED'], ['diffused', 'DIFFUSION']];
|
|
24
|
+
|
|
25
|
+
var IDC_EFFECT_TARGETS = {
|
|
26
|
+
object: 'transparencySettings',
|
|
27
|
+
fill: 'fillTransparencySettings',
|
|
28
|
+
stroke: 'strokeTransparencySettings',
|
|
29
|
+
text: 'contentTransparencySettings'
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function idcEnumByTable(table, enumObject, enumName, value, field) {
|
|
33
|
+
var i;
|
|
34
|
+
if (typeof enumObject === 'undefined') {
|
|
35
|
+
IDC.fail('invalid_state', 'This runtime has no ' + enumName + ' enumeration.', null);
|
|
36
|
+
}
|
|
37
|
+
for (i = 0; i < table.length; i++) {
|
|
38
|
+
if (table[i][0] === value) {
|
|
39
|
+
if (enumObject[table[i][1]] === undefined) {
|
|
40
|
+
IDC.fail('invalid_state', 'This InDesign version has no ' + enumName + '.' + table[i][1] + '.', { value: value });
|
|
41
|
+
}
|
|
42
|
+
return enumObject[table[i][1]];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
IDC.fail('invalid_argument', field + ' must be one of: ' + idcCompEnumNames(table) + '.', { value: value });
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function idcEnumNameByTable(table, enumObject, value) {
|
|
50
|
+
var i;
|
|
51
|
+
if (value === null || value === undefined || typeof enumObject === 'undefined') { return null; }
|
|
52
|
+
for (i = 0; i < table.length; i++) {
|
|
53
|
+
try {
|
|
54
|
+
if (enumObject[table[i][1]] !== undefined && IDC.enumIs(value, enumObject[table[i][1]])) { return table[i][0]; }
|
|
55
|
+
} catch (e) { /* weiter */ }
|
|
56
|
+
}
|
|
57
|
+
return String(value);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function idcEffectPercent(spec, key, field) {
|
|
61
|
+
return idcOptNumber(spec, key, field, 0, 100, false);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Effekte eines Zielbereichs lesen. */
|
|
65
|
+
function idcReadEffects(settings) {
|
|
66
|
+
var out = {
|
|
67
|
+
opacity_percent: null,
|
|
68
|
+
blend_mode: null,
|
|
69
|
+
drop_shadow: { enabled: null, opacity_percent: null, angle_deg: null, distance_mm: null, size_mm: null, spread_percent: null, noise_percent: null, color: null, blend_mode: null, use_global_light: null, knocked_out: null, honor_other_effects: null, x_offset_mm: null, y_offset_mm: null },
|
|
70
|
+
feather: { enabled: null, width_mm: null, corner_type: null, noise_percent: null, choke_percent: null }
|
|
71
|
+
};
|
|
72
|
+
var b = null, d = null, f = null;
|
|
73
|
+
if (settings === null || settings === undefined) { return out; }
|
|
74
|
+
try { b = settings.blendingSettings; } catch (e0) { b = null; }
|
|
75
|
+
try { d = settings.dropShadowSettings; } catch (e1) { d = null; }
|
|
76
|
+
try { f = settings.featherSettings; } catch (e2) { f = null; }
|
|
77
|
+
if (b !== null) {
|
|
78
|
+
try { out.opacity_percent = IDC.round(Number(b.opacity), 3); } catch (e3) { /* null */ }
|
|
79
|
+
try { out.blend_mode = idcEnumNameByTable(IDC_BLEND_MODES, typeof BlendMode === 'undefined' ? undefined : BlendMode, b.blendMode); } catch (e4) { /* null */ }
|
|
80
|
+
}
|
|
81
|
+
if (d !== null) {
|
|
82
|
+
try { out.drop_shadow.enabled = typeof ShadowMode !== 'undefined' && IDC.enumIs(d.mode, ShadowMode.DROP); } catch (e5) { /* null */ }
|
|
83
|
+
try { out.drop_shadow.opacity_percent = IDC.round(Number(d.opacity), 3); } catch (e6) { /* null */ }
|
|
84
|
+
try { out.drop_shadow.angle_deg = IDC.round(Number(d.angle), 3); } catch (e7) { /* null */ }
|
|
85
|
+
try { out.drop_shadow.distance_mm = IDC.round(Number(d.distance), 3); } catch (e8) { /* null */ }
|
|
86
|
+
try { out.drop_shadow.size_mm = IDC.round(Number(d.size), 3); } catch (e9) { /* null */ }
|
|
87
|
+
try { out.drop_shadow.spread_percent = IDC.round(Number(d.spread), 3); } catch (e10) { /* null */ }
|
|
88
|
+
try { out.drop_shadow.noise_percent = IDC.round(Number(d.noise), 3); } catch (e11) { /* null */ }
|
|
89
|
+
try { out.drop_shadow.color = String(d.effectColor.name); } catch (e12) { /* null */ }
|
|
90
|
+
try { out.drop_shadow.blend_mode = idcEnumNameByTable(IDC_BLEND_MODES, typeof BlendMode === 'undefined' ? undefined : BlendMode, d.blendMode); } catch (e13) { /* null */ }
|
|
91
|
+
try { out.drop_shadow.use_global_light = d.useGlobalLight === true; } catch (e14) { /* null */ }
|
|
92
|
+
try { out.drop_shadow.knocked_out = d.knockedOut === true; } catch (e15) { /* null */ }
|
|
93
|
+
try { out.drop_shadow.honor_other_effects = d.honorOtherEffects === true; } catch (e16) { /* null */ }
|
|
94
|
+
try { out.drop_shadow.x_offset_mm = IDC.round(Number(d.xOffset), 3); } catch (e17) { /* null */ }
|
|
95
|
+
try { out.drop_shadow.y_offset_mm = IDC.round(Number(d.yOffset), 3); } catch (e18) { /* null */ }
|
|
96
|
+
}
|
|
97
|
+
if (f !== null) {
|
|
98
|
+
try { out.feather.enabled = typeof FeatherMode !== 'undefined' && IDC.enumIs(f.mode, FeatherMode.STANDARD); } catch (e19) { /* null */ }
|
|
99
|
+
try { out.feather.width_mm = IDC.round(Number(f.width), 3); } catch (e20) { /* null */ }
|
|
100
|
+
try { out.feather.corner_type = idcEnumNameByTable(IDC_FEATHER_CORNERS, typeof FeatherCornerType === 'undefined' ? undefined : FeatherCornerType, f.cornerType); } catch (e21) { /* null */ }
|
|
101
|
+
try { out.feather.noise_percent = IDC.round(Number(f.noise), 3); } catch (e22) { /* null */ }
|
|
102
|
+
try { out.feather.choke_percent = IDC.round(Number(f.chokeAmount), 3); } catch (e23) { /* null */ }
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Weicht ein Zielbereich vom Normalzustand ab (Deckkraft 100, normal, kein Schatten, keine Kante)? */
|
|
108
|
+
function idcHasEffects(settings) {
|
|
109
|
+
var e = idcReadEffects(settings);
|
|
110
|
+
if (e.opacity_percent !== null && e.opacity_percent < 100) { return true; }
|
|
111
|
+
if (e.blend_mode !== null && e.blend_mode !== 'normal') { return true; }
|
|
112
|
+
if (e.drop_shadow.enabled === true) { return true; }
|
|
113
|
+
if (e.feather.enabled === true) { return true; }
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function idcEffectSettings(item, target) {
|
|
118
|
+
var property = IDC_EFFECT_TARGETS[target];
|
|
119
|
+
var settings = null;
|
|
120
|
+
try { settings = item[property]; } catch (e) { settings = null; }
|
|
121
|
+
return settings === undefined ? null : settings;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Objekt-Effekte fuer get_frame_options: effects (object) und has_effects {fill, stroke, text}. */
|
|
125
|
+
function idcEffectsSummary(item) {
|
|
126
|
+
var out = { effects: idcReadEffects(idcEffectSettings(item, 'object')), has_effects: { fill: null, stroke: null, text: null } };
|
|
127
|
+
var s;
|
|
128
|
+
s = idcEffectSettings(item, 'fill');
|
|
129
|
+
if (s !== null) { out.has_effects.fill = idcHasEffects(s); }
|
|
130
|
+
s = idcEffectSettings(item, 'stroke');
|
|
131
|
+
if (s !== null) { out.has_effects.stroke = idcHasEffects(s); }
|
|
132
|
+
if (IDC.isTextFrame(item)) {
|
|
133
|
+
s = idcEffectSettings(item, 'text');
|
|
134
|
+
if (s !== null) { out.has_effects.text = idcHasEffects(s); }
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
var IDC_SHADOW_KEYS = { enabled: 1, opacity_percent: 1, angle_deg: 1, distance_mm: 1, size_mm: 1, spread_percent: 1, noise_percent: 1, color: 1, blend_mode: 1, use_global_light: 1, knocked_out: 1, honor_other_effects: 1 };
|
|
140
|
+
var IDC_FEATHER_KEYS = { enabled: 1, width_mm: 1, corner_type: 1, noise_percent: 1, choke_percent: 1 };
|
|
141
|
+
|
|
142
|
+
function idcRejectUnknownKeys(spec, allowed, field) {
|
|
143
|
+
var key;
|
|
144
|
+
for (key in spec) {
|
|
145
|
+
if (IDC.hasOwn(spec, key) && !IDC.hasOwn(allowed, key)) {
|
|
146
|
+
IDC.fail('invalid_argument', field + '.' + key + ' is not supported in this version (only ' + idcKeysOf(allowed) + ').', { key: key });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function idcKeysOf(obj) {
|
|
152
|
+
var out = [], k;
|
|
153
|
+
for (k in obj) { if (IDC.hasOwn(obj, k)) { out.push(k); } }
|
|
154
|
+
return out.join(', ');
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
IDC.register('set_frame_effects', { needs_document: true, read_only: false, ruler: 'none' },
|
|
158
|
+
function (ctx) {
|
|
159
|
+
var args = ctx.args;
|
|
160
|
+
var doc = ctx.doc;
|
|
161
|
+
var found = idcFrameArg(doc, args, 'frame_id');
|
|
162
|
+
var item = found.item;
|
|
163
|
+
var type = IDC.itemType(item);
|
|
164
|
+
var target = idcGiven(args.target) ? String(args.target) : 'object';
|
|
165
|
+
var settings, blending, shadow, feather, changed = [], spec, v, color;
|
|
166
|
+
|
|
167
|
+
if (!IDC.hasOwn(IDC_EFFECT_TARGETS, target)) {
|
|
168
|
+
IDC.fail('invalid_argument', 'target must be object, fill, stroke or text.', { target: target });
|
|
169
|
+
}
|
|
170
|
+
if (target === 'text' && !IDC.isTextFrame(item)) {
|
|
171
|
+
IDC.fail('invalid_state', 'target "text" needs a text frame; object ' + args.frame_id + ' is a ' + type + '.', { frame_id: args.frame_id, type: type });
|
|
172
|
+
}
|
|
173
|
+
if (!idcGiven(args.opacity_percent) && !idcGiven(args.blend_mode) && !idcGiven(args.drop_shadow) && !idcGiven(args.feather)) {
|
|
174
|
+
IDC.fail('invalid_argument', 'Pass at least one of opacity_percent, blend_mode, drop_shadow or feather.', null);
|
|
175
|
+
}
|
|
176
|
+
settings = idcEffectSettings(item, target);
|
|
177
|
+
if (settings === null) {
|
|
178
|
+
IDC.fail('invalid_state', 'Object ' + args.frame_id + ' has no ' + IDC_EFFECT_TARGETS[target] + ' in this runtime.', { frame_id: args.frame_id, target: target });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* Erst alles pruefen, dann schreiben. */
|
|
182
|
+
var opacity = idcOptNumber(args, 'opacity_percent', 'set_frame_effects', 0, 100, false);
|
|
183
|
+
var blendMode = idcGiven(args.blend_mode) ? idcEnumByTable(IDC_BLEND_MODES, typeof BlendMode === 'undefined' ? undefined : BlendMode, 'BlendMode', String(args.blend_mode), 'blend_mode') : null;
|
|
184
|
+
var shadowSpec = null, featherSpec = null;
|
|
185
|
+
if (idcGiven(args.drop_shadow)) {
|
|
186
|
+
spec = idcObjectArg(args.drop_shadow, 'drop_shadow');
|
|
187
|
+
idcRejectUnknownKeys(spec, IDC_SHADOW_KEYS, 'drop_shadow');
|
|
188
|
+
if (typeof spec.enabled !== 'boolean') { IDC.fail('invalid_argument', 'drop_shadow.enabled (true/false) is required.', { value: spec.enabled }); }
|
|
189
|
+
shadowSpec = {
|
|
190
|
+
enabled: spec.enabled,
|
|
191
|
+
opacity: idcEffectPercent(spec, 'opacity_percent', 'drop_shadow'),
|
|
192
|
+
angle: idcOptNumber(spec, 'angle_deg', 'drop_shadow', -360, 360, false),
|
|
193
|
+
distance: idcOptNumber(spec, 'distance_mm', 'drop_shadow', 0, 352.778, false),
|
|
194
|
+
size: idcOptNumber(spec, 'size_mm', 'drop_shadow', 0, 50.08, false),
|
|
195
|
+
spread: idcEffectPercent(spec, 'spread_percent', 'drop_shadow'),
|
|
196
|
+
noise: idcEffectPercent(spec, 'noise_percent', 'drop_shadow'),
|
|
197
|
+
blendMode: idcGiven(spec.blend_mode) ? idcEnumByTable(IDC_BLEND_MODES, typeof BlendMode === 'undefined' ? undefined : BlendMode, 'BlendMode', String(spec.blend_mode), 'drop_shadow.blend_mode') : null,
|
|
198
|
+
useGlobalLight: idcOptBool(spec, 'use_global_light', 'drop_shadow'),
|
|
199
|
+
knockedOut: idcOptBool(spec, 'knocked_out', 'drop_shadow'),
|
|
200
|
+
honorOtherEffects: idcOptBool(spec, 'honor_other_effects', 'drop_shadow'),
|
|
201
|
+
color: null
|
|
202
|
+
};
|
|
203
|
+
if (idcGiven(spec.color)) {
|
|
204
|
+
color = idcObjectArg(spec.color, 'drop_shadow.color');
|
|
205
|
+
idcBothGiven(color, 'swatch_name', 'hex');
|
|
206
|
+
if (idcGiven(color.swatch_name)) { shadowSpec.color = idcSwatchArg(doc, color.swatch_name, 'drop_shadow.color.swatch_name'); }
|
|
207
|
+
else if (idcGiven(color.hex)) { shadowSpec.color = idcSwatchForHex(doc, color.hex, 'drop_shadow.color.hex', []); }
|
|
208
|
+
else { IDC.fail('invalid_argument', 'drop_shadow.color needs swatch_name or hex.', { value: color }); }
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (idcGiven(args.feather)) {
|
|
212
|
+
spec = idcObjectArg(args.feather, 'feather');
|
|
213
|
+
idcRejectUnknownKeys(spec, IDC_FEATHER_KEYS, 'feather');
|
|
214
|
+
if (typeof spec.enabled !== 'boolean') { IDC.fail('invalid_argument', 'feather.enabled (true/false) is required.', { value: spec.enabled }); }
|
|
215
|
+
featherSpec = {
|
|
216
|
+
enabled: spec.enabled,
|
|
217
|
+
width: idcOptNumber(spec, 'width_mm', 'feather', 0, 352.78, false),
|
|
218
|
+
cornerType: idcGiven(spec.corner_type) ? idcEnumByTable(IDC_FEATHER_CORNERS, typeof FeatherCornerType === 'undefined' ? undefined : FeatherCornerType, 'FeatherCornerType', String(spec.corner_type), 'feather.corner_type') : null,
|
|
219
|
+
noise: idcEffectPercent(spec, 'noise_percent', 'feather'),
|
|
220
|
+
choke: idcEffectPercent(spec, 'choke_percent', 'feather')
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
if (opacity !== null || blendMode !== null) {
|
|
226
|
+
blending = settings.blendingSettings;
|
|
227
|
+
if (opacity !== null) { blending.opacity = opacity; changed.push('opacity_percent'); }
|
|
228
|
+
if (blendMode !== null) { blending.blendMode = blendMode; changed.push('blend_mode'); }
|
|
229
|
+
}
|
|
230
|
+
if (shadowSpec !== null) {
|
|
231
|
+
shadow = settings.dropShadowSettings;
|
|
232
|
+
if (typeof ShadowMode === 'undefined') { IDC.fail('invalid_state', 'This runtime has no ShadowMode enumeration.', null); }
|
|
233
|
+
shadow.mode = shadowSpec.enabled ? ShadowMode.DROP : ShadowMode.NONE;
|
|
234
|
+
if (shadowSpec.enabled) {
|
|
235
|
+
if (shadowSpec.opacity !== null) { shadow.opacity = shadowSpec.opacity; }
|
|
236
|
+
if (shadowSpec.angle !== null) { shadow.angle = shadowSpec.angle; }
|
|
237
|
+
if (shadowSpec.distance !== null) { shadow.distance = shadowSpec.distance; }
|
|
238
|
+
if (shadowSpec.size !== null) { shadow.size = shadowSpec.size; }
|
|
239
|
+
if (shadowSpec.spread !== null) { shadow.spread = shadowSpec.spread; }
|
|
240
|
+
if (shadowSpec.noise !== null) { shadow.noise = shadowSpec.noise; }
|
|
241
|
+
if (shadowSpec.color !== null) { shadow.effectColor = shadowSpec.color; }
|
|
242
|
+
if (shadowSpec.blendMode !== null) { shadow.blendMode = shadowSpec.blendMode; }
|
|
243
|
+
if (shadowSpec.useGlobalLight !== null) { shadow.useGlobalLight = shadowSpec.useGlobalLight; }
|
|
244
|
+
if (shadowSpec.knockedOut !== null) { shadow.knockedOut = shadowSpec.knockedOut; }
|
|
245
|
+
if (shadowSpec.honorOtherEffects !== null) { shadow.honorOtherEffects = shadowSpec.honorOtherEffects; }
|
|
246
|
+
}
|
|
247
|
+
changed.push('drop_shadow');
|
|
248
|
+
}
|
|
249
|
+
if (featherSpec !== null) {
|
|
250
|
+
feather = settings.featherSettings;
|
|
251
|
+
if (typeof FeatherMode === 'undefined') { IDC.fail('invalid_state', 'This runtime has no FeatherMode enumeration.', null); }
|
|
252
|
+
feather.mode = featherSpec.enabled ? FeatherMode.STANDARD : FeatherMode.NONE;
|
|
253
|
+
if (featherSpec.enabled) {
|
|
254
|
+
if (featherSpec.width !== null) { feather.width = featherSpec.width; }
|
|
255
|
+
if (featherSpec.cornerType !== null) { feather.cornerType = featherSpec.cornerType; }
|
|
256
|
+
if (featherSpec.noise !== null) { feather.noise = featherSpec.noise; }
|
|
257
|
+
if (featherSpec.choke !== null) { feather.chokeAmount = featherSpec.choke; }
|
|
258
|
+
}
|
|
259
|
+
changed.push('feather');
|
|
260
|
+
}
|
|
261
|
+
} catch (e) {
|
|
262
|
+
if (e && e.isIdcError) { throw e; }
|
|
263
|
+
IDC.fail('script_error', 'InDesign could not set the effects of object ' + args.frame_id + ' (' + target + '): ' + String(e.message ? e.message : e), { frame_id: args.frame_id, target: target });
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
ctx.changes = { modified_frame_ids: [Number(item.id)] };
|
|
267
|
+
return {
|
|
268
|
+
frame_id: Number(item.id),
|
|
269
|
+
type: type,
|
|
270
|
+
target: target,
|
|
271
|
+
effects: idcReadEffects(settings),
|
|
272
|
+
changed: changed
|
|
273
|
+
};
|
|
274
|
+
});
|