layoutbridge-light 0.0.0-stage → 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 +22 -0
- package/LICENSE +26 -0
- package/README.de.md +338 -0
- package/README.md +325 -2
- package/THIRD-PARTY-NOTICES.md +2878 -0
- package/dist/src/mcp/catalog.js +126 -0
- package/dist/src/mcp/config.js +211 -0
- package/dist/src/mcp/dispatch.js +164 -0
- package/dist/src/mcp/epub-check.js +331 -0
- package/dist/src/mcp/epub-orientation.js +132 -0
- package/dist/src/mcp/license/free-tools.js +16 -0
- package/dist/src/mcp/license/gate.js +210 -0
- package/dist/src/mcp/license/index.js +107 -0
- package/dist/src/mcp/license/instance-name.js +57 -0
- package/dist/src/mcp/license/key-source.js +59 -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 +100 -0
- package/dist/src/mcp/license/polar-verifier.js +285 -0
- package/dist/src/mcp/license/product-ids.js +73 -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 +271 -0
- package/dist/src/mcp/product-info.js +54 -0
- package/dist/src/mcp/product.js +56 -0
- package/dist/src/mcp/server.js +253 -0
- package/dist/src/mcp/setup.js +680 -0
- package/dist/src/mcp/start.cjs +117 -0
- package/dist/src/mcp/tool-definition.js +2 -0
- package/dist/src/mcp/tools.js +2425 -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 +517 -0
- package/indesign/commands/22-document-setup.js +204 -0
- package/indesign/commands/23-save-package.js +258 -0
- package/indesign/commands/25-export.js +448 -0
- package/indesign/commands/26-export-image.js +202 -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 +837 -0
- package/indesign/commands/40-frames.js +851 -0
- package/indesign/commands/41-shapes.js +505 -0
- package/indesign/commands/42-groups.js +117 -0
- package/indesign/commands/43-layers.js +310 -0
- package/indesign/commands/44-effects.js +274 -0
- package/indesign/commands/45-frame-options.js +247 -0
- package/indesign/commands/47-anchored.js +331 -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 +1128 -0
- package/indesign/commands/62-embed.js +120 -0
- package/indesign/commands/69-placeholders.js +127 -0
- package/indesign/commands/70-text.js +675 -0
- package/indesign/commands/71-outlines.js +92 -0
- package/indesign/commands/72-place-text.js +476 -0
- package/indesign/commands/73-story-lock.js +157 -0
- package/indesign/commands/74-stories.js +121 -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 +452 -0
- package/indesign/commands/79-check-typography.js +341 -0
- package/indesign/commands/80-styles.js +1865 -0
- package/indesign/commands/81-composition.js +355 -0
- package/indesign/commands/82-object-styles.js +263 -0
- package/indesign/commands/83-drop-caps.js +87 -0
- package/indesign/commands/83-indents-tabs.js +264 -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 +212 -0
- package/indesign/commands/89-toc-index.js +945 -0
- package/indesign/commands/90-print-on-demand.js +495 -0
- package/indesign/commands/91-epub.js +546 -0
- package/indesign/interpreter.js +779 -0
- package/package.json +41 -4
- package/rules/typography-rules.json +31 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A-43 (Sitzung 43) – Buchsatz fuer Print-on-Demand: check_print_on_demand
|
|
3
|
+
* und create_book_cover. Alle Grenzwerte und Masse kommen als Parameter
|
|
4
|
+
* oder aus der Serverkonfiguration (print_on_demand); im Code steht kein
|
|
5
|
+
* Wert eines bestimmten Dienstes (E-56, E-98).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
var IDC_POD_TOLERANCE_MM = 0.01;
|
|
9
|
+
|
|
10
|
+
function idcPodNumber(args, key, min, max) {
|
|
11
|
+
var v = args[key];
|
|
12
|
+
if (v === undefined || v === null) { return null; }
|
|
13
|
+
if (typeof v !== 'number' || !isFinite(v) || v < min || v > max) {
|
|
14
|
+
IDC.fail('invalid_argument', key + ' must be a number from ' + min + ' to ' + max + '.', { value: v });
|
|
15
|
+
}
|
|
16
|
+
return v;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Stufen des Bundstegs [{max_pages, min_mm}], aufsteigend nach max_pages. */
|
|
20
|
+
function idcPodTiers(value) {
|
|
21
|
+
var out = [], i, t;
|
|
22
|
+
if (value === undefined || value === null) { return null; }
|
|
23
|
+
if (!IDC.isArray(value) || value.length === 0) {
|
|
24
|
+
IDC.fail('invalid_argument', 'inside_margin_tiers must be a non-empty array of {max_pages, min_mm}.', null);
|
|
25
|
+
}
|
|
26
|
+
for (i = 0; i < value.length; i++) {
|
|
27
|
+
t = value[i];
|
|
28
|
+
if (!t || typeof t !== 'object' || typeof t.max_pages !== 'number' || t.max_pages < 1 || typeof t.min_mm !== 'number' || t.min_mm < 0) {
|
|
29
|
+
IDC.fail('invalid_argument', 'inside_margin_tiers[' + i + '] must be {max_pages >= 1, min_mm >= 0}.', { tier: t });
|
|
30
|
+
}
|
|
31
|
+
out.push({ max_pages: t.max_pages, min_mm: t.min_mm });
|
|
32
|
+
}
|
|
33
|
+
out.sort(function (a, b) { return a.max_pages - b.max_pages; });
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function idcPodCheck(name, status, required, actual) {
|
|
38
|
+
return { check: name, status: status, required: required, actual: actual, findings: [] };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function idcPodSkipped(name, key) {
|
|
42
|
+
var c = idcPodCheck(name, 'skipped', null, null);
|
|
43
|
+
c.reason = 'no limit given: pass ' + key + ' or set print_on_demand.' + key + ' in the server configuration';
|
|
44
|
+
return c;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Seiten des Dokuments und ihre Raender (innen/aussen bei Doppelseiten). */
|
|
48
|
+
function idcPodPageInfo(page, facing) {
|
|
49
|
+
var prefs = page.marginPreferences;
|
|
50
|
+
var side = IDC.pageSide(page);
|
|
51
|
+
var size = IDC.pageSize(page);
|
|
52
|
+
return {
|
|
53
|
+
page: page,
|
|
54
|
+
page_id: Number(page.id),
|
|
55
|
+
page_name: String(page.name),
|
|
56
|
+
side: side,
|
|
57
|
+
width: size.width,
|
|
58
|
+
height: size.height,
|
|
59
|
+
top: Number(prefs.top),
|
|
60
|
+
bottom: Number(prefs.bottom),
|
|
61
|
+
inside: Number(prefs.left),
|
|
62
|
+
outside: Number(prefs.right),
|
|
63
|
+
/* linke Kante / rechte Kante der Seite in Seitenkoordinaten */
|
|
64
|
+
left_is_inside: !facing || side !== 'LEFT_HAND'
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* Abstand eines Rechtecks zu den Beschnittkanten: innen, aussen, oben, unten. */
|
|
69
|
+
function idcPodEdgeDistances(info, rect) {
|
|
70
|
+
var left = rect.x;
|
|
71
|
+
var right = info.width - rect.x - rect.width;
|
|
72
|
+
return {
|
|
73
|
+
inside: info.left_is_inside ? left : right,
|
|
74
|
+
outside: info.left_is_inside ? right : left,
|
|
75
|
+
top: rect.y,
|
|
76
|
+
bottom: info.height - rect.y - rect.height
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function idcPodBeyondTrim(dist) {
|
|
81
|
+
return dist.inside < -IDC_POD_TOLERANCE_MM || dist.outside < -IDC_POD_TOLERANCE_MM
|
|
82
|
+
|| dist.top < -IDC_POD_TOLERANCE_MM || dist.bottom < -IDC_POD_TOLERANCE_MM;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function idcPodPush(check, finding, state) {
|
|
86
|
+
state.total += 1;
|
|
87
|
+
if (state.total <= state.max) { check.findings.push(finding); } else { state.truncated = true; }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function idcPodRound(v) { return v === null ? null : IDC.round(v); }
|
|
91
|
+
|
|
92
|
+
IDC.register('check_print_on_demand', { needs_document: true, read_only: true, ruler: 'page' },
|
|
93
|
+
function (ctx) {
|
|
94
|
+
var args = ctx.args;
|
|
95
|
+
var doc = ctx.doc;
|
|
96
|
+
var facing = idcFacing(doc);
|
|
97
|
+
var minPages = idcPodNumber(args, 'min_page_count', 1, 100000);
|
|
98
|
+
var maxPages = idcPodNumber(args, 'max_page_count', 1, 100000);
|
|
99
|
+
var multiple = idcPodNumber(args, 'page_count_multiple', 1, 1000);
|
|
100
|
+
var tiers = idcPodTiers(args.inside_margin_tiers);
|
|
101
|
+
var minOutside = idcPodNumber(args, 'min_outside_margin_mm', 0, 1000);
|
|
102
|
+
var bleedWanted = idcPodNumber(args, 'bleed_mm', 0, 50);
|
|
103
|
+
var bleedTolerance = idcPodNumber(args, 'bleed_tolerance_mm', 0, 5);
|
|
104
|
+
var minFont = idcPodNumber(args, 'min_font_size_pt', 0, 1296);
|
|
105
|
+
var minPpi = idcPodNumber(args, 'min_ppi', 1, 100000);
|
|
106
|
+
var maxFindings = idcPodNumber(args, 'max_findings', 1, 1000);
|
|
107
|
+
var state = { total: 0, max: maxFindings === null ? 200 : maxFindings, truncated: false };
|
|
108
|
+
var checks = [], pages = [], pageCount = Number(doc.pages.length);
|
|
109
|
+
var i, j, c, info, insideReq = null, tier = null, minIn = null, minOut = null, worst, items, item, rect, dist, id;
|
|
110
|
+
|
|
111
|
+
if (bleedTolerance === null) { bleedTolerance = 0.1; }
|
|
112
|
+
if (multiple !== null && Math.floor(multiple) !== multiple) { IDC.fail('invalid_argument', 'page_count_multiple must be a whole number.', { value: multiple }); }
|
|
113
|
+
if (!facing) { ctx.warn('The document has single pages, not facing pages; the left margin is read as the inside margin (Bundsteg) and the right one as the outside margin.'); }
|
|
114
|
+
for (i = 0; i < pageCount; i++) { pages.push(idcPodPageInfo(doc.pages.item(i), facing)); }
|
|
115
|
+
|
|
116
|
+
/* 1. Seitenzahl */
|
|
117
|
+
if (minPages === null && maxPages === null && multiple === null) {
|
|
118
|
+
c = idcPodSkipped('page_count', 'min_page_count / max_page_count / page_count_multiple');
|
|
119
|
+
c.actual = pageCount;
|
|
120
|
+
} else {
|
|
121
|
+
c = idcPodCheck('page_count', 'pass', { min: minPages, max: maxPages, multiple_of: multiple }, pageCount);
|
|
122
|
+
if (minPages !== null && pageCount < minPages) { c.status = 'fail'; c.findings.push({ problem: 'too_few_pages', page_count: pageCount, min: minPages }); }
|
|
123
|
+
if (maxPages !== null && pageCount > maxPages) { c.status = 'fail'; c.findings.push({ problem: 'too_many_pages', page_count: pageCount, max: maxPages }); }
|
|
124
|
+
if (multiple !== null && pageCount % multiple !== 0) { c.status = 'fail'; c.findings.push({ problem: 'not_a_multiple', page_count: pageCount, multiple_of: multiple }); }
|
|
125
|
+
}
|
|
126
|
+
checks.push(c);
|
|
127
|
+
|
|
128
|
+
/* 2. Bundsteg je Seitenzahlstufe */
|
|
129
|
+
for (i = 0; i < pages.length; i++) { if (minIn === null || pages[i].inside < minIn) { minIn = pages[i].inside; } }
|
|
130
|
+
if (tiers === null) {
|
|
131
|
+
c = idcPodSkipped('inside_margin', 'inside_margin_tiers');
|
|
132
|
+
c.actual = idcPodRound(minIn);
|
|
133
|
+
} else {
|
|
134
|
+
for (i = 0; i < tiers.length; i++) { if (pageCount <= tiers[i].max_pages) { tier = tiers[i]; break; } }
|
|
135
|
+
if (tier === null) {
|
|
136
|
+
c = idcPodCheck('inside_margin', 'fail', null, idcPodRound(minIn));
|
|
137
|
+
c.findings.push({ problem: 'page_count_above_last_tier', page_count: pageCount, last_tier_max_pages: tiers[tiers.length - 1].max_pages });
|
|
138
|
+
} else {
|
|
139
|
+
insideReq = tier.min_mm;
|
|
140
|
+
c = idcPodCheck('inside_margin', 'pass', { min_mm: insideReq, tier_max_pages: tier.max_pages }, idcPodRound(minIn));
|
|
141
|
+
for (i = 0; i < pages.length; i++) {
|
|
142
|
+
if (pages[i].inside < insideReq - IDC_POD_TOLERANCE_MM) {
|
|
143
|
+
c.status = 'fail';
|
|
144
|
+
idcPodPush(c, { page_id: pages[i].page_id, page_name: pages[i].page_name, inside_mm: idcPodRound(pages[i].inside) }, state);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
checks.push(c);
|
|
150
|
+
|
|
151
|
+
/* 3. Aussen, oben, unten */
|
|
152
|
+
for (i = 0; i < pages.length; i++) {
|
|
153
|
+
worst = Math.min(pages[i].outside, pages[i].top, pages[i].bottom);
|
|
154
|
+
if (minOut === null || worst < minOut) { minOut = worst; }
|
|
155
|
+
}
|
|
156
|
+
if (minOutside === null) {
|
|
157
|
+
c = idcPodSkipped('outside_margins', 'min_outside_margin_mm');
|
|
158
|
+
c.actual = idcPodRound(minOut);
|
|
159
|
+
} else {
|
|
160
|
+
c = idcPodCheck('outside_margins', 'pass', { min_mm: minOutside }, idcPodRound(minOut));
|
|
161
|
+
for (i = 0; i < pages.length; i++) {
|
|
162
|
+
info = pages[i];
|
|
163
|
+
if (info.outside < minOutside - IDC_POD_TOLERANCE_MM || info.top < minOutside - IDC_POD_TOLERANCE_MM || info.bottom < minOutside - IDC_POD_TOLERANCE_MM) {
|
|
164
|
+
c.status = 'fail';
|
|
165
|
+
idcPodPush(c, { page_id: info.page_id, page_name: info.page_name, outside_mm: idcPodRound(info.outside), top_mm: idcPodRound(info.top), bottom_mm: idcPodRound(info.bottom) }, state);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
checks.push(c);
|
|
170
|
+
|
|
171
|
+
/* 4. Anschnitt: innen 0 bei Doppelseiten, aussen/oben/unten wie verlangt; randabfallende Objekte brauchen Anschnitt. */
|
|
172
|
+
var bleed = idcDocumentBleedMm(doc);
|
|
173
|
+
var bleedingItems = [], crossing = [];
|
|
174
|
+
for (i = 0; i < pages.length; i++) {
|
|
175
|
+
info = pages[i];
|
|
176
|
+
try { items = info.page.pageItems; } catch (eI) { continue; }
|
|
177
|
+
for (j = 0; j < items.length; j++) {
|
|
178
|
+
item = IDC.concrete(items.item(j));
|
|
179
|
+
try { rect = IDC.boundsOnPage(doc, item, info.page); } catch (eR) { continue; }
|
|
180
|
+
dist = idcPodEdgeDistances(info, rect);
|
|
181
|
+
if (idcPodBeyondTrim(dist)) { bleedingItems.push({ item: item, info: info, dist: dist }); }
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
c = idcPodCheck('bleed', 'pass', { inside_mm: facing ? 0 : null, top_bottom_outside_mm: bleedWanted, tolerance_mm: bleedTolerance }, bleed);
|
|
185
|
+
if (bleed !== null) {
|
|
186
|
+
if (facing && bleed.inside_or_left > IDC_POD_TOLERANCE_MM) {
|
|
187
|
+
c.status = 'fail';
|
|
188
|
+
c.findings.push({ problem: 'inside_bleed_not_zero', inside_mm: bleed.inside_or_left });
|
|
189
|
+
}
|
|
190
|
+
if (bleedWanted !== null) {
|
|
191
|
+
var edges = [['top', bleed.top], ['bottom', bleed.bottom], [facing ? 'outside' : 'right', bleed.outside_or_right]];
|
|
192
|
+
if (!facing) { edges.push(['left', bleed.inside_or_left]); }
|
|
193
|
+
for (i = 0; i < edges.length; i++) {
|
|
194
|
+
if (bleedingItems.length > 0 || edges[i][1] > IDC_POD_TOLERANCE_MM) {
|
|
195
|
+
if (Math.abs(edges[i][1] - bleedWanted) > bleedTolerance + 0.0001) {
|
|
196
|
+
c.status = 'fail';
|
|
197
|
+
c.findings.push({ problem: 'bleed_differs', edge: edges[i][0], actual_mm: edges[i][1], required_mm: bleedWanted });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (bleedingItems.length > 0 && bleed.top <= IDC_POD_TOLERANCE_MM && bleed.bottom <= IDC_POD_TOLERANCE_MM && bleed.outside_or_right <= IDC_POD_TOLERANCE_MM) {
|
|
203
|
+
c.status = 'fail';
|
|
204
|
+
c.findings.push({ problem: 'bleeding_objects_without_bleed', object_count: bleedingItems.length });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
c.bleeding_object_count = bleedingItems.length;
|
|
208
|
+
checks.push(c);
|
|
209
|
+
|
|
210
|
+
/* 5. Objekte im Randbereich (naeher am Beschnitt als die Mindestraender, ohne randabfallende) */
|
|
211
|
+
if (minOutside === null && insideReq === null) {
|
|
212
|
+
c = idcPodSkipped('objects_in_margin', 'min_outside_margin_mm / inside_margin_tiers');
|
|
213
|
+
} else {
|
|
214
|
+
c = idcPodCheck('objects_in_margin', 'pass', { inside_mm: insideReq, outside_top_bottom_mm: minOutside }, null);
|
|
215
|
+
for (i = 0; i < pages.length; i++) {
|
|
216
|
+
info = pages[i];
|
|
217
|
+
try { items = info.page.pageItems; } catch (eI2) { continue; }
|
|
218
|
+
for (j = 0; j < items.length; j++) {
|
|
219
|
+
item = IDC.concrete(items.item(j));
|
|
220
|
+
try { rect = IDC.boundsOnPage(doc, item, info.page); id = Number(item.id); } catch (eR2) { continue; }
|
|
221
|
+
dist = idcPodEdgeDistances(info, rect);
|
|
222
|
+
if (idcPodBeyondTrim(dist)) { continue; }
|
|
223
|
+
var close = [];
|
|
224
|
+
if (insideReq !== null && dist.inside < insideReq - IDC_POD_TOLERANCE_MM) { close.push('inside'); }
|
|
225
|
+
if (minOutside !== null && dist.outside < minOutside - IDC_POD_TOLERANCE_MM) { close.push('outside'); }
|
|
226
|
+
if (minOutside !== null && dist.top < minOutside - IDC_POD_TOLERANCE_MM) { close.push('top'); }
|
|
227
|
+
if (minOutside !== null && dist.bottom < minOutside - IDC_POD_TOLERANCE_MM) { close.push('bottom'); }
|
|
228
|
+
if (close.length > 0) {
|
|
229
|
+
c.status = 'fail';
|
|
230
|
+
idcPodPush(c, {
|
|
231
|
+
item_id: id, type: IDC.itemType(item), page_id: info.page_id, page_name: info.page_name, edges: close,
|
|
232
|
+
distance_mm: { inside: idcPodRound(dist.inside), outside: idcPodRound(dist.outside), top: idcPodRound(dist.top), bottom: idcPodRound(dist.bottom) }
|
|
233
|
+
}, state);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
checks.push(c);
|
|
239
|
+
|
|
240
|
+
/* 6. Objekte ueber den Bund (bei Anschnitt innen 0 werden sie am Bund abgeschnitten) */
|
|
241
|
+
if (!facing) {
|
|
242
|
+
c = idcPodCheck('objects_across_spine', 'skipped', null, null);
|
|
243
|
+
c.reason = 'single pages – no spine';
|
|
244
|
+
} else {
|
|
245
|
+
c = idcPodCheck('objects_across_spine', 'pass', null, null);
|
|
246
|
+
for (i = 0; i < bleedingItems.length; i++) {
|
|
247
|
+
if (bleedingItems[i].dist.inside < -IDC_POD_TOLERANCE_MM) {
|
|
248
|
+
crossing.push(bleedingItems[i]);
|
|
249
|
+
c.status = 'fail';
|
|
250
|
+
idcPodPush(c, {
|
|
251
|
+
item_id: Number(bleedingItems[i].item.id), type: IDC.itemType(bleedingItems[i].item),
|
|
252
|
+
page_id: bleedingItems[i].info.page_id, page_name: bleedingItems[i].info.page_name,
|
|
253
|
+
beyond_spine_mm: idcPodRound(-bleedingItems[i].dist.inside)
|
|
254
|
+
}, state);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
c.actual = crossing.length;
|
|
258
|
+
}
|
|
259
|
+
checks.push(c);
|
|
260
|
+
|
|
261
|
+
/* 7. Mindestschriftgrad (alle Textlaeufe, auch Musterseiten und Uebersatz) */
|
|
262
|
+
if (minFont === null) {
|
|
263
|
+
c = idcPodSkipped('min_font_size', 'min_font_size_pt');
|
|
264
|
+
} else {
|
|
265
|
+
c = idcPodCheck('min_font_size', 'pass', { min_pt: minFont }, null);
|
|
266
|
+
var smallest = null, s, story, ranges, r, range, size, frames;
|
|
267
|
+
for (s = 0; s < doc.stories.length; s++) {
|
|
268
|
+
story = doc.stories.item(s);
|
|
269
|
+
try { ranges = story.textStyleRanges; } catch (eT) { continue; }
|
|
270
|
+
for (r = 0; r < ranges.length; r++) {
|
|
271
|
+
range = ranges.item(r);
|
|
272
|
+
try {
|
|
273
|
+
size = IDC.inPoints(function () { return Number(range.pointSize); });
|
|
274
|
+
} catch (eS) { continue; }
|
|
275
|
+
var text = '';
|
|
276
|
+
try { text = String(range.contents); } catch (eC) { text = ''; }
|
|
277
|
+
if (text.replace(/[\s\r\n\u0016\u0007\u0008]/g, '') === '') { continue; }
|
|
278
|
+
if (smallest === null || size < smallest) { smallest = size; }
|
|
279
|
+
if (size < minFont - 0.001) {
|
|
280
|
+
c.status = 'fail';
|
|
281
|
+
frames = idcRunFrames(range);
|
|
282
|
+
idcPodPush(c, {
|
|
283
|
+
story_id: Number(story.id), point_size: IDC.round(size, 2), page_id: frames.page_id, page_name: frames.page_name,
|
|
284
|
+
frame_ids: frames.frame_ids, is_master: frames.is_master, snippet: idcSnippet(text, 40)
|
|
285
|
+
}, state);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
c.actual = smallest === null ? null : IDC.round(smallest, 2);
|
|
290
|
+
}
|
|
291
|
+
checks.push(c);
|
|
292
|
+
|
|
293
|
+
/* 8. Bildaufloesung (effektiv, nur Pixelbilder) */
|
|
294
|
+
if (minPpi === null) {
|
|
295
|
+
c = idcPodSkipped('image_resolution', 'min_ppi');
|
|
296
|
+
} else {
|
|
297
|
+
c = idcPodCheck('image_resolution', 'pass', { min_ppi: minPpi }, null);
|
|
298
|
+
var graphics = [], g, graphic, ppi, lowest = null, landing, link, pdfLike;
|
|
299
|
+
try { graphics = doc.allGraphics; } catch (eG) { graphics = []; }
|
|
300
|
+
for (g = 0; g < graphics.length; g++) {
|
|
301
|
+
graphic = graphics[g];
|
|
302
|
+
pdfLike = false;
|
|
303
|
+
try { pdfLike = /pdf|eps|postscript/i.test(String(graphic.imageTypeName)) || IDC.className(graphic) === 'PDF' || IDC.className(graphic) === 'EPS'; } catch (eP) { pdfLike = false; }
|
|
304
|
+
if (pdfLike) { continue; }
|
|
305
|
+
try { ppi = idcPpi(graphic.effectivePpi); } catch (eE) { ppi = null; }
|
|
306
|
+
if (ppi === null) { continue; }
|
|
307
|
+
if (lowest === null || ppi.min < lowest) { lowest = ppi.min; }
|
|
308
|
+
if (ppi.min < minPpi) {
|
|
309
|
+
c.status = 'fail';
|
|
310
|
+
landing = IDC.landing(graphic);
|
|
311
|
+
link = null;
|
|
312
|
+
try { link = String(graphic.itemLink.name); } catch (eL) { link = null; }
|
|
313
|
+
idcPodPush(c, { graphic_id: Number(graphic.id), file_name: link, effective_ppi: ppi.min, page_id: landing.page_id, page_name: landing.page_name }, state);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
c.actual = lowest;
|
|
317
|
+
}
|
|
318
|
+
checks.push(c);
|
|
319
|
+
|
|
320
|
+
/* 9. Schriften: vorhanden und einbettbar (ob sie im PDF eingebettet sind, zeigt erst das PDF) */
|
|
321
|
+
c = idcPodCheck('fonts', 'pass', { installed: true, pdf_embedding_allowed: true }, null);
|
|
322
|
+
var fonts, f, font, status, allowed, fontCount = 0;
|
|
323
|
+
try { fonts = doc.fonts; } catch (eF) { fonts = null; }
|
|
324
|
+
if (fonts !== null) {
|
|
325
|
+
for (f = 0; f < fonts.length; f++) {
|
|
326
|
+
font = fonts.item(f);
|
|
327
|
+
fontCount += 1;
|
|
328
|
+
try { status = idcFontStatusName(font.status); } catch (eFs) { status = 'unknown'; }
|
|
329
|
+
allowed = null;
|
|
330
|
+
try { if (font.allowPDFEmbedding === false) { allowed = false; } else if (font.allowPDFEmbedding === true) { allowed = true; } } catch (eFa) { allowed = null; }
|
|
331
|
+
if (status !== 'installed' || allowed === false) {
|
|
332
|
+
c.status = 'fail';
|
|
333
|
+
idcPodPush(c, { font: String(font.name).replace('\t', ' '), status: status, pdf_embedding_allowed: allowed }, state);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
c.actual = fontCount;
|
|
338
|
+
checks.push(c);
|
|
339
|
+
|
|
340
|
+
var failed = [], skipped = [];
|
|
341
|
+
for (i = 0; i < checks.length; i++) {
|
|
342
|
+
if (checks[i].status === 'fail') { failed.push(checks[i].check); }
|
|
343
|
+
if (checks[i].status === 'skipped') { skipped.push(checks[i].check); }
|
|
344
|
+
}
|
|
345
|
+
if (state.truncated) { ctx.warn(state.total + ' findings, only the first ' + state.max + ' returned (max_findings).'); }
|
|
346
|
+
if (skipped.length > 0) { ctx.warn('Not checked for lack of a limit: ' + skipped.join(', ') + '.'); }
|
|
347
|
+
|
|
348
|
+
return {
|
|
349
|
+
passed: failed.length === 0,
|
|
350
|
+
failed_checks: failed,
|
|
351
|
+
skipped_checks: skipped,
|
|
352
|
+
page_count: pageCount,
|
|
353
|
+
facing_pages: facing,
|
|
354
|
+
page_size_mm: pages.length > 0 ? { width: pages[0].width, height: pages[0].height } : null,
|
|
355
|
+
checks: checks,
|
|
356
|
+
findings_total: state.total,
|
|
357
|
+
findings_truncated: state.truncated
|
|
358
|
+
};
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
/* ------------------------------------------------------- create_book_cover */
|
|
362
|
+
|
|
363
|
+
var IDC_MM_PER_INCH = 25.4;
|
|
364
|
+
var IDC_PT_PER_MM = 72 / 25.4;
|
|
365
|
+
|
|
366
|
+
function idcPodSize(widthMm, heightMm) {
|
|
367
|
+
return {
|
|
368
|
+
width_mm: IDC.round(widthMm, 3),
|
|
369
|
+
height_mm: IDC.round(heightMm, 3),
|
|
370
|
+
width_pt: IDC.round(widthMm * IDC_PT_PER_MM, 2),
|
|
371
|
+
height_pt: IDC.round(heightMm * IDC_PT_PER_MM, 2),
|
|
372
|
+
width_in: IDC.round(widthMm / IDC_MM_PER_INCH, 4),
|
|
373
|
+
height_in: IDC.round(heightMm / IDC_MM_PER_INCH, 4)
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
IDC.register('create_book_cover', { needs_document: false, read_only: false, ruler: 'none' },
|
|
378
|
+
function (ctx) {
|
|
379
|
+
var args = ctx.args;
|
|
380
|
+
var pageCount = idcPodNumber(args, 'page_count', 1, 100000);
|
|
381
|
+
var trimW = idcPodNumber(args, 'trim_width_mm', 1, 2000);
|
|
382
|
+
var trimH = idcPodNumber(args, 'trim_height_mm', 1, 2000);
|
|
383
|
+
var perPageMm = idcPodNumber(args, 'spine_per_page_mm', 0, 10);
|
|
384
|
+
var perPageIn = idcPodNumber(args, 'spine_per_page_in', 0, 1);
|
|
385
|
+
var bleedMm = idcPodNumber(args, 'bleed_mm', 0, 50);
|
|
386
|
+
var safety = idcPodNumber(args, 'safety_margin_mm', 0, 500);
|
|
387
|
+
var spineSafety = idcPodNumber(args, 'spine_safety_mm', 0, 100);
|
|
388
|
+
var barcode = args.barcode_area === undefined || args.barcode_area === null ? null : args.barcode_area;
|
|
389
|
+
var spine, width, doc, prefs, page, spread, guides = [], barcodeId = null, k, keys;
|
|
390
|
+
|
|
391
|
+
if (pageCount === null || Math.floor(pageCount) !== pageCount) { IDC.fail('invalid_argument', 'page_count is required: the number of interior pages (whole number).', { page_count: args.page_count }); }
|
|
392
|
+
if (trimW === null || trimH === null) { IDC.fail('invalid_argument', 'trim_width_mm and trim_height_mm (trim size of the book, Endformat) are required.', null); }
|
|
393
|
+
if (perPageIn !== null) {
|
|
394
|
+
spine = pageCount * perPageIn * IDC_MM_PER_INCH;
|
|
395
|
+
} else if (perPageMm !== null) {
|
|
396
|
+
spine = pageCount * perPageMm;
|
|
397
|
+
} else {
|
|
398
|
+
IDC.fail('invalid_argument', 'Pass spine_per_page_mm or spine_per_page_in (paper thickness per page as the printer states it), or set print_on_demand.spine_per_page_mm in the server configuration.', null);
|
|
399
|
+
}
|
|
400
|
+
if (bleedMm === null) { bleedMm = 0; ctx.warn('No bleed_mm given and none configured – the cover has no bleed (Anschnitt).'); }
|
|
401
|
+
if (safety === null) { safety = 0; }
|
|
402
|
+
if (barcode !== null) {
|
|
403
|
+
keys = ['width_mm', 'height_mm', 'offset_x_mm', 'offset_y_mm'];
|
|
404
|
+
if (typeof barcode !== 'object') { IDC.fail('invalid_argument', 'barcode_area must be {width_mm, height_mm, offset_x_mm, offset_y_mm}.', null); }
|
|
405
|
+
for (k = 0; k < keys.length; k++) {
|
|
406
|
+
if (typeof barcode[keys[k]] !== 'number' || barcode[keys[k]] < 0) {
|
|
407
|
+
IDC.fail('invalid_argument', 'barcode_area.' + keys[k] + ' must be a number of 0 or more.', { barcode_area: barcode });
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
if (barcode.width_mm + barcode.offset_x_mm > trimW || barcode.height_mm + barcode.offset_y_mm > trimH) {
|
|
411
|
+
IDC.fail('invalid_argument', 'barcode_area does not fit on the back cover.', { barcode_area: barcode, trim_width_mm: trimW, trim_height_mm: trimH });
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
width = 2 * trimW + spine;
|
|
415
|
+
|
|
416
|
+
try {
|
|
417
|
+
doc = app.documents.add();
|
|
418
|
+
} catch (e0) {
|
|
419
|
+
IDC.fail('script_error', 'InDesign could not create a document: ' + String(e0.message ? e0.message : e0), null);
|
|
420
|
+
}
|
|
421
|
+
try {
|
|
422
|
+
prefs = doc.documentPreferences;
|
|
423
|
+
prefs.facingPages = false;
|
|
424
|
+
prefs.pagesPerDocument = 1;
|
|
425
|
+
prefs.pageWidth = width;
|
|
426
|
+
prefs.pageHeight = trimH;
|
|
427
|
+
prefs.documentBleedUniformSize = true;
|
|
428
|
+
prefs.documentBleedTopOffset = bleedMm;
|
|
429
|
+
prefs.documentBleedBottomOffset = bleedMm;
|
|
430
|
+
prefs.documentBleedInsideOrLeftOffset = bleedMm;
|
|
431
|
+
prefs.documentBleedOutsideOrRightOffset = bleedMm;
|
|
432
|
+
page = doc.pages.item(0);
|
|
433
|
+
idcApplyMargins(doc, { top: safety, bottom: safety, left: safety, right: safety }, { count: 1, gutter_mm: 0 });
|
|
434
|
+
idcApplyMargins(page, { top: safety, bottom: safety, left: safety, right: safety }, { count: 1, gutter_mm: 0 });
|
|
435
|
+
spread = page.parent;
|
|
436
|
+
} catch (e1) {
|
|
437
|
+
IDC.fail('script_error', 'The cover document was created but could not be set up: ' + String(e1.message ? e1.message : e1), { document_id: Number(doc.id) });
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/* Hilfslinien: Falz Rueckseite/Ruecken und Ruecken/Vorderseite, optional die Sicherheitszone im Ruecken. */
|
|
441
|
+
function addGuide(position, role) {
|
|
442
|
+
var guide = null;
|
|
443
|
+
try {
|
|
444
|
+
guide = IDC.withRulerOrigin(doc, RulerOrigin.PAGE_ORIGIN, function () {
|
|
445
|
+
return spread.guides.add(undefined, { orientation: HorizontalOrVertical.VERTICAL, location: position });
|
|
446
|
+
});
|
|
447
|
+
} catch (eG) {
|
|
448
|
+
ctx.warn('Could not add the ' + role + ' guide: ' + String(eG.message ? eG.message : eG));
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
guides.push({ guide_id: Number(guide.id), role: role, position_mm: IDC.round(position, 3) });
|
|
452
|
+
}
|
|
453
|
+
addGuide(trimW, 'spine_left');
|
|
454
|
+
addGuide(trimW + spine, 'spine_right');
|
|
455
|
+
if (spineSafety !== null && spineSafety > 0) {
|
|
456
|
+
if (spine > 2 * spineSafety) {
|
|
457
|
+
addGuide(trimW + spineSafety, 'spine_safety_left');
|
|
458
|
+
addGuide(trimW + spine - spineSafety, 'spine_safety_right');
|
|
459
|
+
} else {
|
|
460
|
+
ctx.warn('The spine (' + IDC.round(spine, 3) + ' mm) is narrower than twice spine_safety_mm – no room for spine text.');
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/* Freiraum fuer den Strichcode: nicht druckender Rahmen auf der Rueckseite, gemessen von Ruecken und Unterkante. */
|
|
465
|
+
if (barcode !== null) {
|
|
466
|
+
var bx = trimW - barcode.offset_x_mm - barcode.width_mm;
|
|
467
|
+
var by = trimH - barcode.offset_y_mm - barcode.height_mm;
|
|
468
|
+
var frame = idcAddItem(doc, page, 'rectangles', [by, bx, by + barcode.height_mm, bx + barcode.width_mm], 'page');
|
|
469
|
+
try { frame.nonprinting = true; } catch (eN) { ctx.warn('Could not make the barcode frame non-printing – delete it before export.'); }
|
|
470
|
+
try { frame.name = 'barcode_area'; } catch (eNm) { /* ohne Namen */ }
|
|
471
|
+
barcodeId = Number(frame.id);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
ctx.changes = { created_document_ids: [Number(doc.id)] };
|
|
475
|
+
if (barcodeId !== null) { ctx.changes.created_frame_ids = [barcodeId]; }
|
|
476
|
+
|
|
477
|
+
return {
|
|
478
|
+
document_id: Number(doc.id),
|
|
479
|
+
name: String(doc.name),
|
|
480
|
+
page_id: Number(page.id),
|
|
481
|
+
page_count: pageCount,
|
|
482
|
+
spine_width_mm: IDC.round(spine, 3),
|
|
483
|
+
spine_width_in: IDC.round(spine / IDC_MM_PER_INCH, 4),
|
|
484
|
+
trim_size: idcPodSize(width, trimH),
|
|
485
|
+
size_with_bleed: idcPodSize(width + 2 * bleedMm, trimH + 2 * bleedMm),
|
|
486
|
+
bleed_mm: bleedMm,
|
|
487
|
+
safety_margin_mm: safety,
|
|
488
|
+
back_cover_mm: { x: 0, width: IDC.round(trimW, 3) },
|
|
489
|
+
spine_mm: { x: IDC.round(trimW, 3), width: IDC.round(spine, 3) },
|
|
490
|
+
front_cover_mm: { x: IDC.round(trimW + spine, 3), width: IDC.round(trimW, 3) },
|
|
491
|
+
guides: guides,
|
|
492
|
+
barcode_frame_id: barcodeId,
|
|
493
|
+
barcode_area_mm: barcodeId === null ? null : { x: IDC.round(trimW - barcode.offset_x_mm - barcode.width_mm, 3), y: IDC.round(trimH - barcode.offset_y_mm - barcode.height_mm, 3), width: barcode.width_mm, height: barcode.height_mm }
|
|
494
|
+
};
|
|
495
|
+
});
|