linked-rolls 0.51.0 → 0.53.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/README.md +10 -0
- package/lib/Emulation.js +6 -5
- package/lib/Perforator.d.ts +89 -0
- package/lib/Perforator.js +1 -0
- package/lib/RollCopy.d.ts +18 -9
- package/lib/RollCopy.js +6 -1
- package/lib/importJsonLd.js +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/migrate.d.ts +2 -0
- package/lib/migrate.js +34 -1
- package/lib/readers/stanfordAton.js +14 -4
- package/lib/reservations.js +1 -1
- package/lib/schema.json +211 -7
- package/lib/sigla.d.ts +19 -14
- package/lib/sigla.js +28 -7
- package/lib/spec/context.json +13 -1
- package/lib/witnesses.d.ts +7 -0
- package/lib/witnesses.js +7 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -80,6 +80,16 @@ sigla off the stemma as it stands, so a label never outlives the
|
|
|
80
80
|
arrangement it describes, and nothing should cite one without saying
|
|
81
81
|
which state of the edition it belongs to.
|
|
82
82
|
|
|
83
|
+
Handed an `EditionView`, which knows the copies as well, `siglaOf`
|
|
84
|
+
lowercases the versions no copy's features carry at first hand, as
|
|
85
|
+
editions mark a state nothing surviving shows: r3 stands to R3 as a
|
|
86
|
+
reconstructed state stands to a witnessed one. A version reached only
|
|
87
|
+
through the versions derived from it is lowercased, and so is one a
|
|
88
|
+
copy does no more than state it carries, since a statement gives no
|
|
89
|
+
readings. `attestedVersions` reports the same fact on its own. Handed
|
|
90
|
+
the versions alone, `siglaOf` cannot tell and leaves every siglum in
|
|
91
|
+
capitals.
|
|
92
|
+
|
|
83
93
|
## The tolerance a derivation was collated at
|
|
84
94
|
|
|
85
95
|
`collationTolerance` on a derivation is the window two readings of one
|
package/lib/Emulation.js
CHANGED
|
@@ -2,15 +2,16 @@ import { MIDIControlEvents } from "midifile-ts";
|
|
|
2
2
|
import { idOf } from "./Assumption.js";
|
|
3
3
|
import { isCommand, pairsAmong, placementsOf } from "./Symbol.js";
|
|
4
4
|
import { add, mean, mm, seconds, subtract } from "./Quantity.js";
|
|
5
|
+
import { punchDiameterOf } from "./RollCopy.js";
|
|
5
6
|
/** The punch diameter the edition's copies report, where any of them does. */
|
|
6
|
-
const
|
|
7
|
+
const meanPunchDiameterOf = (view) => {
|
|
7
8
|
const measured = view.edition.copies
|
|
8
|
-
.map(
|
|
9
|
-
.filter(
|
|
9
|
+
.map(punchDiameterOf)
|
|
10
|
+
.filter(value => value !== undefined);
|
|
10
11
|
return measured.length > 0 ? mean(measured) : undefined;
|
|
11
12
|
};
|
|
12
13
|
const propertiesOf = (view, version) => ({
|
|
13
|
-
punchDiameter:
|
|
14
|
+
punchDiameter: meanPunchDiameterOf(view),
|
|
14
15
|
tempo: view.edition.tempoAdjustment,
|
|
15
16
|
toOwnPaper: view.toOwnPaperOf(version)
|
|
16
17
|
});
|
|
@@ -141,7 +142,7 @@ export class Emulation {
|
|
|
141
142
|
* diameter, or a millimetre, where no copy agrees with a statement.
|
|
142
143
|
*/
|
|
143
144
|
applyConstraints(view) {
|
|
144
|
-
const gap =
|
|
145
|
+
const gap = meanPunchDiameterOf(view) ?? mm(1);
|
|
145
146
|
const offsets = (follower, reference) => offsetsBetween(view, follower, reference);
|
|
146
147
|
displacementsOf(this.negotiatedEvents, offsets, gap).forEach((distance, event) => {
|
|
147
148
|
event.horizontal.from = add(event.horizontal.from, distance);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ObjectAssumption } from "./Assumption.js";
|
|
2
|
+
import { ConditionState } from "./ConditionState.js";
|
|
3
|
+
import { Measure, Millimeters } from "./Quantity.js";
|
|
4
|
+
import { WithId } from "./utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* The pitch in the engineering sense: the distance along the roll from
|
|
7
|
+
* one punch of a chain to the next, which is the slot one firing cut
|
|
8
|
+
* together with the bridge of paper left before the next. It is taken
|
|
9
|
+
* on held notes, whose chains repeat it, as the median over them. It
|
|
10
|
+
* runs along the roll, and is another thing than the hole separation,
|
|
11
|
+
* which is the distance across the roll from one track to the next.
|
|
12
|
+
* @see crm:E54 Dimension
|
|
13
|
+
*/
|
|
14
|
+
export interface ChainPitch extends Measure<'mm'> {
|
|
15
|
+
/**
|
|
16
|
+
* The length along the roll of one slot of a chain.
|
|
17
|
+
* @see reo:slot
|
|
18
|
+
*/
|
|
19
|
+
slot?: Millimeters;
|
|
20
|
+
/**
|
|
21
|
+
* The paper left standing between two slots of a chain. Slot and
|
|
22
|
+
* bridge are medians of their own and need not add up to the pitch.
|
|
23
|
+
* @see reo:bridge
|
|
24
|
+
*/
|
|
25
|
+
bridge?: Millimeters;
|
|
26
|
+
/**
|
|
27
|
+
* How many pitches the median was taken over.
|
|
28
|
+
* @see reo:sampleSize
|
|
29
|
+
*/
|
|
30
|
+
n?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The step by which the perforator moved the paper on, read as the
|
|
34
|
+
* period the lengths of the slots keep: a slot is the punch together
|
|
35
|
+
* with a whole number of steps, so its lengths fall on a comb of this
|
|
36
|
+
* spacing.
|
|
37
|
+
* @see crm:E54 Dimension
|
|
38
|
+
*/
|
|
39
|
+
export interface Advance extends Measure<'mm'> {
|
|
40
|
+
/**
|
|
41
|
+
* How closely the lengths keep the period, from 0 where they scatter
|
|
42
|
+
* to 1 where every one falls on the comb: the mean resultant length
|
|
43
|
+
* of the lengths folded onto it. A period found weakly is the result
|
|
44
|
+
* of a search all the same; the belief it is stated with says how far
|
|
45
|
+
* it is held to be the machine's step.
|
|
46
|
+
* @see reo:strength
|
|
47
|
+
*/
|
|
48
|
+
strength?: number;
|
|
49
|
+
/**
|
|
50
|
+
* How many slot lengths were folded.
|
|
51
|
+
* @see reo:sampleSize
|
|
52
|
+
*/
|
|
53
|
+
n?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* How the perforator was set when it punched the copy, as far as the
|
|
57
|
+
* perforations show it. No time is stated: how long a machine kept a
|
|
58
|
+
* setting is for a comparison across rolls to find out.
|
|
59
|
+
* @see crm:E3 Condition State
|
|
60
|
+
*/
|
|
61
|
+
export interface PerforatorSetting extends ConditionState<'setting'> {
|
|
62
|
+
/**
|
|
63
|
+
* The diameter of the round punch. Taken across the roll, it is the
|
|
64
|
+
* one value of the setting that neither the scale along the roll nor
|
|
65
|
+
* the shrinkage of the paper enters.
|
|
66
|
+
* @see reo:punchDiameter
|
|
67
|
+
*/
|
|
68
|
+
punchDiameter?: ObjectAssumption<Measure<'mm'>>;
|
|
69
|
+
/**
|
|
70
|
+
* @see reo:chainPitch
|
|
71
|
+
*/
|
|
72
|
+
chainPitch?: ObjectAssumption<ChainPitch>;
|
|
73
|
+
/**
|
|
74
|
+
* @see reo:advance
|
|
75
|
+
*/
|
|
76
|
+
advance?: ObjectAssumption<Advance>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The machine that punched the copy. It stands for this production
|
|
80
|
+
* alone. Whether it is the one another copy was punched on is left to a
|
|
81
|
+
* statement of identity made about it elsewhere, which its id allows.
|
|
82
|
+
* @see crm:E22 Human-Made Object
|
|
83
|
+
*/
|
|
84
|
+
export interface Perforator extends WithId {
|
|
85
|
+
/**
|
|
86
|
+
* @see crm:P44 has condition
|
|
87
|
+
*/
|
|
88
|
+
condition?: PerforatorSetting;
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/RollCopy.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { WithId, WithType } from "./utils.js";
|
|
|
8
8
|
import { Agent, Concept } from "./Agent.js";
|
|
9
9
|
import { FeatureSource } from "./FeatureSource.js";
|
|
10
10
|
import { Measure, Millimeters, Quantity, Track } from "./Quantity.js";
|
|
11
|
+
import { Perforator } from "./Perforator.js";
|
|
11
12
|
/**
|
|
12
13
|
* This condition state is used to describe the roll's
|
|
13
14
|
* paper shrinkage or stretching. It might be calculated
|
|
@@ -114,6 +115,12 @@ export interface ProductionEvent {
|
|
|
114
115
|
* @see reo:paperSpeed
|
|
115
116
|
*/
|
|
116
117
|
speed?: ObjectAssumption<PaperSpeed>;
|
|
118
|
+
/**
|
|
119
|
+
* The perforator the copy was punched on, with the setting its
|
|
120
|
+
* perforations show.
|
|
121
|
+
* @see crm:P16 used specific object
|
|
122
|
+
*/
|
|
123
|
+
perforator?: Perforator;
|
|
117
124
|
/**
|
|
118
125
|
* The features the copy came from its punching with: the note and
|
|
119
126
|
* expression perforations, and now and then a mark the perforator
|
|
@@ -204,8 +211,10 @@ export interface RollCopy extends WithType<'RollCopy'>, WithId {
|
|
|
204
211
|
ops: Array<'shifted' | 'stretched' | 'shortened'>;
|
|
205
212
|
/**
|
|
206
213
|
* Physical measurements of this roll copy, including
|
|
207
|
-
* dimensions,
|
|
208
|
-
*
|
|
214
|
+
* dimensions, hole separation, margins, shift corrections,
|
|
215
|
+
* and information about the measuring software. What the
|
|
216
|
+
* perforations tell about the machine that cut them is stated
|
|
217
|
+
* with the production.
|
|
209
218
|
* @see crm:P39i was measured by
|
|
210
219
|
*/
|
|
211
220
|
measurements: Partial<{
|
|
@@ -231,13 +240,11 @@ export interface RollCopy extends WithType<'RollCopy'>, WithId {
|
|
|
231
240
|
unit: 'mm';
|
|
232
241
|
};
|
|
233
242
|
/**
|
|
234
|
-
* The
|
|
235
|
-
*
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
* The distance between adjacent tracker bar holes, in the
|
|
240
|
-
* unit the scan was measured in.
|
|
243
|
+
* The distance across the roll from the centre of one track to
|
|
244
|
+
* the next, the track pitch or Teilung, in the unit the scan was
|
|
245
|
+
* measured in. It is fixed by the tracker bar the roll was cut
|
|
246
|
+
* for, and is another thing than the chain pitch, which runs
|
|
247
|
+
* along the roll.
|
|
241
248
|
* @see reo:holeSeparation
|
|
242
249
|
*/
|
|
243
250
|
holeSeparation: Measure<'px'> | Measure<'mm'>;
|
|
@@ -400,6 +407,8 @@ export declare const isPaperStretch: (condition: RollConditionAssignment) => boo
|
|
|
400
407
|
* before the systems were told apart; `reservationsAbout` says so.
|
|
401
408
|
*/
|
|
402
409
|
export declare const barOf: (copy: Pick<RollCopy, 'production'>) => TrackerBar;
|
|
410
|
+
/** The diameter of the punch the copy was cut with, where the edition holds it true or likely. */
|
|
411
|
+
export declare const punchDiameterOf: (copy: Pick<RollCopy, 'production'>) => Millimeters | undefined;
|
|
403
412
|
/**
|
|
404
413
|
* Reads the features of a copy as the tracker bar would read them.
|
|
405
414
|
* Holes on a position the bar does not read carry no symbol and are
|
package/lib/RollCopy.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { v4 } from "uuid";
|
|
2
2
|
import { welteT100 } from "./systems/welteT100/bar.js";
|
|
3
3
|
import { trackerBarOf } from "./systems/index.js";
|
|
4
|
-
import { assignReference } from "./Assumption.js";
|
|
4
|
+
import { assignReference, certaintyOf, isAsserted } from "./Assumption.js";
|
|
5
5
|
import { px, track } from "./Quantity.js";
|
|
6
6
|
export const rollConditions = [
|
|
7
7
|
'general',
|
|
@@ -47,6 +47,11 @@ export const isPaperStretch = (condition) => condition.conditionType === 'paper-
|
|
|
47
47
|
* before the systems were told apart; `reservationsAbout` says so.
|
|
48
48
|
*/
|
|
49
49
|
export const barOf = (copy) => trackerBarOf(copy.production?.system) ?? welteT100;
|
|
50
|
+
/** The diameter of the punch the copy was cut with, where the edition holds it true or likely. */
|
|
51
|
+
export const punchDiameterOf = (copy) => {
|
|
52
|
+
const diameter = copy.production?.perforator?.condition?.punchDiameter;
|
|
53
|
+
return diameter && isAsserted(certaintyOf(diameter)) ? diameter.value : undefined;
|
|
54
|
+
};
|
|
50
55
|
/**
|
|
51
56
|
* Reads the features of a copy as the tracker bar would read them.
|
|
52
57
|
* Holes on a position the bar does not read carry no symbol and are
|
package/lib/importJsonLd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { derivedKeys } from "./asJsonLd.js";
|
|
2
|
-
import { migrate } from "./migrate.js";
|
|
2
|
+
import { migrate, plainCopyId } from "./migrate.js";
|
|
3
3
|
import { isDateString } from "./utils.js";
|
|
4
4
|
export const importDate = (str) => {
|
|
5
5
|
const [y, m, d] = str.split('-').map(s => parseInt(s, 10));
|
|
@@ -49,7 +49,7 @@ const withPlainCopyIds = (json) => ({
|
|
|
49
49
|
...json,
|
|
50
50
|
copies: (json.copies ?? []).map((copy) => ({
|
|
51
51
|
...copy,
|
|
52
|
-
'@id': typeof copy['@id'] === 'string' ? copy['@id']
|
|
52
|
+
'@id': typeof copy['@id'] === 'string' ? plainCopyId(copy['@id']) : copy['@id']
|
|
53
53
|
}))
|
|
54
54
|
});
|
|
55
55
|
export const importJsonLd = (json) => {
|
package/lib/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from './systems/welteT98/bar.js';
|
|
|
16
16
|
export * from './systems/index.js';
|
|
17
17
|
export * from './ReproducingSystem.js';
|
|
18
18
|
export * from './FeatureSource.js';
|
|
19
|
+
export * from './Perforator.js';
|
|
19
20
|
export * from './RollCopy.js';
|
|
20
21
|
export * from './procedures.js';
|
|
21
22
|
export * from './vocabulary.js';
|
package/lib/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from './systems/welteT98/bar.js';
|
|
|
16
16
|
export * from './systems/index.js';
|
|
17
17
|
export * from './ReproducingSystem.js';
|
|
18
18
|
export * from './FeatureSource.js';
|
|
19
|
+
export * from './Perforator.js';
|
|
19
20
|
export * from './RollCopy.js';
|
|
20
21
|
export * from './procedures.js';
|
|
21
22
|
export * from './vocabulary.js';
|
package/lib/migrate.d.ts
CHANGED
|
@@ -11,5 +11,7 @@
|
|
|
11
11
|
* had renamed before.
|
|
12
12
|
*/
|
|
13
13
|
type Json = any;
|
|
14
|
+
/** A copy's id without the `copy/` that documents of earlier releases put before it. */
|
|
15
|
+
export declare const plainCopyId: (id: string) => string;
|
|
14
16
|
export declare const migrate: (edition: Json) => Json;
|
|
15
17
|
export {};
|
package/lib/migrate.js
CHANGED
|
@@ -117,6 +117,39 @@ const withScale = (node) => {
|
|
|
117
117
|
const factor = (node.conditions ?? []).find(isPaperStretch)?.factor;
|
|
118
118
|
return factor === undefined ? node : { ...node, measurements: { ...node.measurements, scale: factor } };
|
|
119
119
|
};
|
|
120
|
+
/** A copy's id without the `copy/` that documents of earlier releases put before it. */
|
|
121
|
+
export const plainCopyId = (id) => id.replace(/^copy\//, '');
|
|
122
|
+
/**
|
|
123
|
+
* The punch diameter was a measurement of the copy before it was stated
|
|
124
|
+
* as the setting of the perforator that cut it. A diameter of -1 stood
|
|
125
|
+
* for one nobody had measured and is left out. The perforator is named
|
|
126
|
+
* after the copy, so that a file migrated twice names it the same way.
|
|
127
|
+
*/
|
|
128
|
+
const withPerforator = (node) => {
|
|
129
|
+
const diameter = node.measurements?.punchDiameter;
|
|
130
|
+
if (diameter === undefined)
|
|
131
|
+
return node;
|
|
132
|
+
const { punchDiameter: _moved, ...measurements } = node.measurements;
|
|
133
|
+
if (!(diameter?.value > 0))
|
|
134
|
+
return { ...node, measurements };
|
|
135
|
+
const perforator = node.production?.perforator ?? { '@id': `perforator_${plainCopyId(node['@id'])}` };
|
|
136
|
+
return {
|
|
137
|
+
...node,
|
|
138
|
+
measurements,
|
|
139
|
+
production: {
|
|
140
|
+
...node.production,
|
|
141
|
+
perforator: {
|
|
142
|
+
...perforator,
|
|
143
|
+
condition: {
|
|
144
|
+
'@type': 'ConditionState',
|
|
145
|
+
conditionType: 'setting',
|
|
146
|
+
...perforator.condition,
|
|
147
|
+
punchDiameter: diameter
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
};
|
|
120
153
|
/** A derivation written as a single one, before a version could name several. */
|
|
121
154
|
const isSingleDerivation = (basedOn) => basedOn !== null && typeof basedOn === 'object' && !Array.isArray(basedOn);
|
|
122
155
|
const withDerivationList = (node) => isSingleDerivation(node.basedOn) ? { ...node, basedOn: [node.basedOn] } : node;
|
|
@@ -233,7 +266,7 @@ const withTimeSpanDates = (node) => {
|
|
|
233
266
|
return { ...rest, within };
|
|
234
267
|
};
|
|
235
268
|
const migrateNode = (node) => [withRenamedKeys, withTypology, withoutVersionType, withoutVersionSiglum, withLowerCaseTerms, withSplitMethod, withReferences, withKeeper, withoutEmptyKeeper,
|
|
236
|
-
withProductionNodes, withScale, withDerivationList, withReadingKind, withTimeSpanDates, withoutFeatureKind,
|
|
269
|
+
withPerforator, withProductionNodes, withScale, withDerivationList, withReadingKind, withTimeSpanDates, withoutFeatureKind,
|
|
237
270
|
withBorneFeaturesNamed, withFeaturesInActs]
|
|
238
271
|
.reduce((result, step) => step(result), node);
|
|
239
272
|
/** The items each walked, or the very same list where the walk changed none. */
|
|
@@ -157,7 +157,20 @@ export function readFromStanfordAton(atonString, { trackShift, system = welteT10
|
|
|
157
157
|
id: v4(),
|
|
158
158
|
ops: [],
|
|
159
159
|
conditions: [],
|
|
160
|
-
production: {
|
|
160
|
+
production: {
|
|
161
|
+
system: systemOf(system),
|
|
162
|
+
...(punchDiameter !== undefined && {
|
|
163
|
+
perforator: {
|
|
164
|
+
id: `perforator_${v4()}`,
|
|
165
|
+
condition: {
|
|
166
|
+
type: 'ConditionState',
|
|
167
|
+
conditionType: 'setting',
|
|
168
|
+
punchDiameter: { value: punchDiameter, unit: 'mm' }
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}),
|
|
172
|
+
produced: features
|
|
173
|
+
},
|
|
161
174
|
modifications: [],
|
|
162
175
|
...((scan ?? stanford) && { scan: scan ?? stanford?.scan }),
|
|
163
176
|
measurements: {
|
|
@@ -166,9 +179,6 @@ export function readFromStanfordAton(atonString, { trackShift, system = welteT10
|
|
|
166
179
|
height: inMillimeters(readPx(json.ROLLINFO.IMAGE_LENGTH), dpi),
|
|
167
180
|
unit: 'mm'
|
|
168
181
|
},
|
|
169
|
-
...(punchDiameter !== undefined && {
|
|
170
|
-
punchDiameter: { value: punchDiameter, unit: 'mm' }
|
|
171
|
-
}),
|
|
172
182
|
holeSeparation: {
|
|
173
183
|
value: separation,
|
|
174
184
|
unit: 'px'
|
package/lib/reservations.js
CHANGED
|
@@ -125,7 +125,7 @@ const witnessedAtFirstHand = (view, version) => {
|
|
|
125
125
|
const carriers = witnessesOf(view, version.id).filter(({ by }) => by === 'carriers');
|
|
126
126
|
return carriers.length > 0 && carriers.every(({ through }) => through !== undefined) ? {
|
|
127
127
|
type: 'no-direct-witness',
|
|
128
|
-
note: 'No copy carries it at first hand;
|
|
128
|
+
note: 'No copy carries it at first hand; its text is a reconstruction from the versions derived from it.'
|
|
129
129
|
} : undefined;
|
|
130
130
|
};
|
|
131
131
|
const versionChecks = [textStated, witnessedByFeatures, witnessedAtFirstHand];
|
package/lib/schema.json
CHANGED
|
@@ -1854,6 +1854,56 @@
|
|
|
1854
1854
|
],
|
|
1855
1855
|
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain."
|
|
1856
1856
|
},
|
|
1857
|
+
"ObjectAssumption<Advance>": {
|
|
1858
|
+
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
|
|
1859
|
+
"properties": {
|
|
1860
|
+
"@annotation": {
|
|
1861
|
+
"description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
|
|
1862
|
+
"properties": {
|
|
1863
|
+
"belief": {
|
|
1864
|
+
"$ref": "#/definitions/Belief",
|
|
1865
|
+
"description": "The belief held about the annotated statement.",
|
|
1866
|
+
"ontology": "crminf:J4i is subject of"
|
|
1867
|
+
},
|
|
1868
|
+
"@id": {
|
|
1869
|
+
"description": "A unique identifier for this object.",
|
|
1870
|
+
"type": "string"
|
|
1871
|
+
}
|
|
1872
|
+
},
|
|
1873
|
+
"required": [
|
|
1874
|
+
"belief",
|
|
1875
|
+
"@id"
|
|
1876
|
+
],
|
|
1877
|
+
"type": "object"
|
|
1878
|
+
},
|
|
1879
|
+
"n": {
|
|
1880
|
+
"description": "How many slot lengths were folded.",
|
|
1881
|
+
"type": "number",
|
|
1882
|
+
"ontology": "reo:sampleSize"
|
|
1883
|
+
},
|
|
1884
|
+
"strength": {
|
|
1885
|
+
"description": "How closely the lengths keep the period, from 0 where they scatter to 1 where every one falls on the comb: the mean resultant length of the lengths folded onto it. A period found weakly is the result of a search all the same; the belief it is stated with says how far it is held to be the machine's step.",
|
|
1886
|
+
"type": "number",
|
|
1887
|
+
"ontology": "reo:strength"
|
|
1888
|
+
},
|
|
1889
|
+
"unit": {
|
|
1890
|
+
"const": "mm",
|
|
1891
|
+
"description": "The unit of measurement.",
|
|
1892
|
+
"type": "string",
|
|
1893
|
+
"ontology": "crm:P91 has unit"
|
|
1894
|
+
},
|
|
1895
|
+
"value": {
|
|
1896
|
+
"$ref": "#/definitions/Quantity%3C%22mm%22%3E",
|
|
1897
|
+
"description": "The measured value.",
|
|
1898
|
+
"ontology": "crm:P90 has value"
|
|
1899
|
+
}
|
|
1900
|
+
},
|
|
1901
|
+
"required": [
|
|
1902
|
+
"unit",
|
|
1903
|
+
"value"
|
|
1904
|
+
],
|
|
1905
|
+
"type": "object"
|
|
1906
|
+
},
|
|
1857
1907
|
"ObjectAssumption<Agent>": {
|
|
1858
1908
|
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
|
|
1859
1909
|
"properties": {
|
|
@@ -1908,6 +1958,61 @@
|
|
|
1908
1958
|
],
|
|
1909
1959
|
"type": "object"
|
|
1910
1960
|
},
|
|
1961
|
+
"ObjectAssumption<ChainPitch>": {
|
|
1962
|
+
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
|
|
1963
|
+
"properties": {
|
|
1964
|
+
"@annotation": {
|
|
1965
|
+
"description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
|
|
1966
|
+
"properties": {
|
|
1967
|
+
"belief": {
|
|
1968
|
+
"$ref": "#/definitions/Belief",
|
|
1969
|
+
"description": "The belief held about the annotated statement.",
|
|
1970
|
+
"ontology": "crminf:J4i is subject of"
|
|
1971
|
+
},
|
|
1972
|
+
"@id": {
|
|
1973
|
+
"description": "A unique identifier for this object.",
|
|
1974
|
+
"type": "string"
|
|
1975
|
+
}
|
|
1976
|
+
},
|
|
1977
|
+
"required": [
|
|
1978
|
+
"belief",
|
|
1979
|
+
"@id"
|
|
1980
|
+
],
|
|
1981
|
+
"type": "object"
|
|
1982
|
+
},
|
|
1983
|
+
"bridge": {
|
|
1984
|
+
"$ref": "#/definitions/Millimeters",
|
|
1985
|
+
"description": "The paper left standing between two slots of a chain. Slot and bridge are medians of their own and need not add up to the pitch.",
|
|
1986
|
+
"ontology": "reo:bridge"
|
|
1987
|
+
},
|
|
1988
|
+
"n": {
|
|
1989
|
+
"description": "How many pitches the median was taken over.",
|
|
1990
|
+
"type": "number",
|
|
1991
|
+
"ontology": "reo:sampleSize"
|
|
1992
|
+
},
|
|
1993
|
+
"slot": {
|
|
1994
|
+
"$ref": "#/definitions/Millimeters",
|
|
1995
|
+
"description": "The length along the roll of one slot of a chain.",
|
|
1996
|
+
"ontology": "reo:slot"
|
|
1997
|
+
},
|
|
1998
|
+
"unit": {
|
|
1999
|
+
"const": "mm",
|
|
2000
|
+
"description": "The unit of measurement.",
|
|
2001
|
+
"type": "string",
|
|
2002
|
+
"ontology": "crm:P91 has unit"
|
|
2003
|
+
},
|
|
2004
|
+
"value": {
|
|
2005
|
+
"$ref": "#/definitions/Quantity%3C%22mm%22%3E",
|
|
2006
|
+
"description": "The measured value.",
|
|
2007
|
+
"ontology": "crm:P90 has value"
|
|
2008
|
+
}
|
|
2009
|
+
},
|
|
2010
|
+
"required": [
|
|
2011
|
+
"unit",
|
|
2012
|
+
"value"
|
|
2013
|
+
],
|
|
2014
|
+
"type": "object"
|
|
2015
|
+
},
|
|
1911
2016
|
"ObjectAssumption<CollationTolerance>": {
|
|
1912
2017
|
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
|
|
1913
2018
|
"properties": {
|
|
@@ -2238,6 +2343,46 @@
|
|
|
2238
2343
|
],
|
|
2239
2344
|
"type": "object"
|
|
2240
2345
|
},
|
|
2346
|
+
"ObjectAssumption<Measure<\"mm\">>": {
|
|
2347
|
+
"description": "An object assumption wraps a complex object with an optional annotation. Used for structured values (e.g. persons, conditions) whose properties may be uncertain.",
|
|
2348
|
+
"properties": {
|
|
2349
|
+
"@annotation": {
|
|
2350
|
+
"description": "An optional annotation expressing a belief about this assumption. Uses the JSON-LD-star `@annotation` mechanism to attach epistemic metadata (certainty and reasons) to any triple.",
|
|
2351
|
+
"properties": {
|
|
2352
|
+
"belief": {
|
|
2353
|
+
"$ref": "#/definitions/Belief",
|
|
2354
|
+
"description": "The belief held about the annotated statement.",
|
|
2355
|
+
"ontology": "crminf:J4i is subject of"
|
|
2356
|
+
},
|
|
2357
|
+
"@id": {
|
|
2358
|
+
"description": "A unique identifier for this object.",
|
|
2359
|
+
"type": "string"
|
|
2360
|
+
}
|
|
2361
|
+
},
|
|
2362
|
+
"required": [
|
|
2363
|
+
"belief",
|
|
2364
|
+
"@id"
|
|
2365
|
+
],
|
|
2366
|
+
"type": "object"
|
|
2367
|
+
},
|
|
2368
|
+
"unit": {
|
|
2369
|
+
"const": "mm",
|
|
2370
|
+
"description": "The unit of measurement.",
|
|
2371
|
+
"type": "string",
|
|
2372
|
+
"ontology": "crm:P91 has unit"
|
|
2373
|
+
},
|
|
2374
|
+
"value": {
|
|
2375
|
+
"$ref": "#/definitions/Quantity%3C%22mm%22%3E",
|
|
2376
|
+
"description": "The measured value.",
|
|
2377
|
+
"ontology": "crm:P90 has value"
|
|
2378
|
+
}
|
|
2379
|
+
},
|
|
2380
|
+
"required": [
|
|
2381
|
+
"unit",
|
|
2382
|
+
"value"
|
|
2383
|
+
],
|
|
2384
|
+
"type": "object"
|
|
2385
|
+
},
|
|
2241
2386
|
"ObjectAssumption<PaperSpeed>": {
|
|
2242
2387
|
"anyOf": [
|
|
2243
2388
|
{
|
|
@@ -2514,6 +2659,65 @@
|
|
|
2514
2659
|
],
|
|
2515
2660
|
"type": "object"
|
|
2516
2661
|
},
|
|
2662
|
+
"Perforator": {
|
|
2663
|
+
"description": "The machine that punched the copy. It stands for this production alone. Whether it is the one another copy was punched on is left to a statement of identity made about it elsewhere, which its id allows.",
|
|
2664
|
+
"properties": {
|
|
2665
|
+
"condition": {
|
|
2666
|
+
"$ref": "#/definitions/PerforatorSetting",
|
|
2667
|
+
"ontology": "crm:P44 has condition"
|
|
2668
|
+
},
|
|
2669
|
+
"@id": {
|
|
2670
|
+
"description": "A unique identifier for this object.",
|
|
2671
|
+
"type": "string"
|
|
2672
|
+
}
|
|
2673
|
+
},
|
|
2674
|
+
"required": [
|
|
2675
|
+
"@id"
|
|
2676
|
+
],
|
|
2677
|
+
"type": "object",
|
|
2678
|
+
"ontology": "crm:E22 Human-Made Object"
|
|
2679
|
+
},
|
|
2680
|
+
"PerforatorSetting": {
|
|
2681
|
+
"description": "How the perforator was set when it punched the copy, as far as the perforations show it. No time is stated: how long a machine kept a setting is for a comparison across rolls to find out.",
|
|
2682
|
+
"properties": {
|
|
2683
|
+
"advance": {
|
|
2684
|
+
"$ref": "#/definitions/ObjectAssumption%3CAdvance%3E",
|
|
2685
|
+
"ontology": "reo:advance"
|
|
2686
|
+
},
|
|
2687
|
+
"chainPitch": {
|
|
2688
|
+
"$ref": "#/definitions/ObjectAssumption%3CChainPitch%3E",
|
|
2689
|
+
"ontology": "reo:chainPitch"
|
|
2690
|
+
},
|
|
2691
|
+
"conditionType": {
|
|
2692
|
+
"const": "setting",
|
|
2693
|
+
"description": "The kind of condition, from the list the roll or the kind of feature allows.",
|
|
2694
|
+
"type": "string",
|
|
2695
|
+
"ontology": "crm:P2 has type"
|
|
2696
|
+
},
|
|
2697
|
+
"description": {
|
|
2698
|
+
"description": "A free-text description of the condition, providing details beyond the type classification.",
|
|
2699
|
+
"type": "string",
|
|
2700
|
+
"ontology": "crm:P3 has note"
|
|
2701
|
+
},
|
|
2702
|
+
"punchDiameter": {
|
|
2703
|
+
"$ref": "#/definitions/ObjectAssumption%3CMeasure%3C%22mm%22%3E%3E",
|
|
2704
|
+
"description": "The diameter of the round punch. Taken across the roll, it is the one value of the setting that neither the scale along the roll nor the shrinkage of the paper enters.",
|
|
2705
|
+
"ontology": "reo:punchDiameter"
|
|
2706
|
+
},
|
|
2707
|
+
"@type": {
|
|
2708
|
+
"const": "ConditionState",
|
|
2709
|
+
"description": "The type discriminator for this object.",
|
|
2710
|
+
"type": "string",
|
|
2711
|
+
"ontology": "rdf:type"
|
|
2712
|
+
}
|
|
2713
|
+
},
|
|
2714
|
+
"required": [
|
|
2715
|
+
"conditionType",
|
|
2716
|
+
"@type"
|
|
2717
|
+
],
|
|
2718
|
+
"type": "object",
|
|
2719
|
+
"ontology": "crm:E3 Condition State"
|
|
2720
|
+
},
|
|
2517
2721
|
"Person": {
|
|
2518
2722
|
"$ref": "#/definitions/Agent",
|
|
2519
2723
|
"description": "An agent that is a person."
|
|
@@ -2567,6 +2771,11 @@
|
|
|
2567
2771
|
"description": "The paper the roll copy was cut on.",
|
|
2568
2772
|
"ontology": "crm:P126 employed"
|
|
2569
2773
|
},
|
|
2774
|
+
"perforator": {
|
|
2775
|
+
"$ref": "#/definitions/Perforator",
|
|
2776
|
+
"description": "The perforator the copy was punched on, with the setting its perforations show.",
|
|
2777
|
+
"ontology": "crm:P16 used specific object"
|
|
2778
|
+
},
|
|
2570
2779
|
"produced": {
|
|
2571
2780
|
"description": "The features the copy came from its punching with: the note and expression perforations, and now and then a mark the perforator left. A reading of a scan finds every hole on the paper at once and states it here, and a feature an editor reads as the work of a later hand belongs in the act that made it, whichever kind of feature it is.",
|
|
2572
2781
|
"items": {
|
|
@@ -2742,7 +2951,7 @@
|
|
|
2742
2951
|
"ontology": "crm:P50 has current keeper"
|
|
2743
2952
|
},
|
|
2744
2953
|
"measurements": {
|
|
2745
|
-
"description": "Physical measurements of this roll copy, including dimensions,
|
|
2954
|
+
"description": "Physical measurements of this roll copy, including dimensions, hole separation, margins, shift corrections, and information about the measuring software. What the perforations tell about the machine that cut them is stated with the production.",
|
|
2746
2955
|
"properties": {
|
|
2747
2956
|
"dimensions": {
|
|
2748
2957
|
"description": "The physical dimensions of the roll.",
|
|
@@ -2781,7 +2990,7 @@
|
|
|
2781
2990
|
"$ref": "#/definitions/Measure%3C%22mm%22%3E"
|
|
2782
2991
|
}
|
|
2783
2992
|
],
|
|
2784
|
-
"description": "The distance
|
|
2993
|
+
"description": "The distance across the roll from the centre of one track to the next, the track pitch or Teilung, in the unit the scan was measured in. It is fixed by the tracker bar the roll was cut for, and is another thing than the chain pitch, which runs along the roll.",
|
|
2785
2994
|
"ontology": "reo:holeSeparation"
|
|
2786
2995
|
},
|
|
2787
2996
|
"margins": {
|
|
@@ -2823,11 +3032,6 @@
|
|
|
2823
3032
|
"type": "object",
|
|
2824
3033
|
"ontology": "crmdig:L23 used software or firmware"
|
|
2825
3034
|
},
|
|
2826
|
-
"punchDiameter": {
|
|
2827
|
-
"$ref": "#/definitions/Measure%3C%22mm%22%3E",
|
|
2828
|
-
"description": "The average diameter of punched holes.",
|
|
2829
|
-
"ontology": "reo:punchDiameter"
|
|
2830
|
-
},
|
|
2831
3035
|
"readerExtension": {
|
|
2832
3036
|
"description": "What a pneumatic reader added to this copy's holes, where it was taken off again. Such a reader reports how long a valve stayed open, which exceeds the perforation that opened it, so its holes are overlong by a constant while its onsets agree. Nothing for a copy read by other means, whose holes are the punched slots themselves. Not exported to RDF.",
|
|
2833
3037
|
"properties": {
|
package/lib/sigla.d.ts
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { Edition } from './Edition.js';
|
|
2
|
+
import { EditionView } from './EditionView.js';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*
|
|
4
|
+
* What the sigla are read off: the versions alone, or a view, which knows
|
|
5
|
+
* the copies as well and so can tell which versions a witness shows.
|
|
6
|
+
*/
|
|
7
|
+
export type Stemma = Pick<Edition, 'versions'> | EditionView;
|
|
8
|
+
/**
|
|
9
|
+
* The siglum of every version, as the stemma stands: where it sits
|
|
10
|
+
* (`alongTheStemma`) and, given a view, whether any copy shows it.
|
|
11
|
+
*
|
|
12
|
+
* A version no copy's features carry at first hand is inferred, whether
|
|
13
|
+
* it is reached only through the versions derived from it or a copy does
|
|
14
|
+
* no more than state that it carries it. Its siglum is lowercased, so
|
|
15
|
+
* that r3 stands to R3 as a reconstructed state stands to a witnessed
|
|
16
|
+
* one. Handed the versions alone, the sigla cannot tell and stay in
|
|
17
|
+
* capitals throughout.
|
|
9
18
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* ends and the children hang off it as branches. So a siglum says where a
|
|
13
|
-
* version sits in this stemma, and it is computed anew when the stemma
|
|
14
|
-
* changes. Nothing should cite one without saying which state it belongs
|
|
15
|
-
* to.
|
|
19
|
+
* A siglum is computed anew when the stemma or the copies change, so
|
|
20
|
+
* nothing should cite one without saying which state it belongs to.
|
|
16
21
|
*/
|
|
17
|
-
export declare const siglaOf: (
|
|
22
|
+
export declare const siglaOf: (stemma: Stemma) => ReadonlyMap<string, string>;
|
|
18
23
|
/** The siglum of one version as the stemma stands, or nothing where the edition holds no such version. */
|
|
19
|
-
export declare const siglumOf: (
|
|
24
|
+
export declare const siglumOf: (stemma: Stemma, versionId: string) => string | undefined;
|
package/lib/sigla.js
CHANGED
|
@@ -2,6 +2,7 @@ import { idOf } from './Assumption.js';
|
|
|
2
2
|
import { systemIdOf } from './TrackerBar.js';
|
|
3
3
|
import { trackerBarOf } from './systems/index.js';
|
|
4
4
|
import { principalDerivationOf } from './Version.js';
|
|
5
|
+
import { attestedVersions } from './witnesses.js';
|
|
5
6
|
/** The letter the versions of a system are labelled with. */
|
|
6
7
|
const letters = new Map([
|
|
7
8
|
['welte-t100', 'R'],
|
|
@@ -27,13 +28,9 @@ const letterOf = (version) => {
|
|
|
27
28
|
*
|
|
28
29
|
* The main line runs through the child that has descendants of its own;
|
|
29
30
|
* where several have, the one with the most, and where none has, the line
|
|
30
|
-
* ends and the children hang off it as branches.
|
|
31
|
-
* version sits in this stemma, and it is computed anew when the stemma
|
|
32
|
-
* changes. Nothing should cite one without saying which state it belongs
|
|
33
|
-
* to.
|
|
31
|
+
* ends and the children hang off it as branches.
|
|
34
32
|
*/
|
|
35
|
-
|
|
36
|
-
const versions = edition.versions;
|
|
33
|
+
const alongTheStemma = (versions) => {
|
|
37
34
|
const byId = new Map(versions.map(version => [version.id, version]));
|
|
38
35
|
const parentOf = (version) => {
|
|
39
36
|
const principal = principalDerivationOf(version);
|
|
@@ -94,5 +91,29 @@ export const siglaOf = (edition) => {
|
|
|
94
91
|
}
|
|
95
92
|
return sigla;
|
|
96
93
|
};
|
|
94
|
+
const isView = (stemma) => !('versions' in stemma);
|
|
95
|
+
/**
|
|
96
|
+
* The sigla with the inferred versions in lowercase, as editions mark a
|
|
97
|
+
* state nothing surviving shows. The letter still names the system and
|
|
98
|
+
* the number still counts the generation.
|
|
99
|
+
*/
|
|
100
|
+
const marking = (sigla, attested) => new Map([...sigla].map(([id, siglum]) => [id, attested.has(id) ? siglum : siglum.toLowerCase()]));
|
|
101
|
+
/**
|
|
102
|
+
* The siglum of every version, as the stemma stands: where it sits
|
|
103
|
+
* (`alongTheStemma`) and, given a view, whether any copy shows it.
|
|
104
|
+
*
|
|
105
|
+
* A version no copy's features carry at first hand is inferred, whether
|
|
106
|
+
* it is reached only through the versions derived from it or a copy does
|
|
107
|
+
* no more than state that it carries it. Its siglum is lowercased, so
|
|
108
|
+
* that r3 stands to R3 as a reconstructed state stands to a witnessed
|
|
109
|
+
* one. Handed the versions alone, the sigla cannot tell and stay in
|
|
110
|
+
* capitals throughout.
|
|
111
|
+
*
|
|
112
|
+
* A siglum is computed anew when the stemma or the copies change, so
|
|
113
|
+
* nothing should cite one without saying which state it belongs to.
|
|
114
|
+
*/
|
|
115
|
+
export const siglaOf = (stemma) => isView(stemma)
|
|
116
|
+
? marking(alongTheStemma(stemma.edition.versions), attestedVersions(stemma))
|
|
117
|
+
: alongTheStemma(stemma.versions);
|
|
97
118
|
/** The siglum of one version as the stemma stands, or nothing where the edition holds no such version. */
|
|
98
|
-
export const siglumOf = (
|
|
119
|
+
export const siglumOf = (stemma, versionId) => siglaOf(stemma).get(versionId);
|
package/lib/spec/context.json
CHANGED
|
@@ -157,7 +157,6 @@
|
|
|
157
157
|
"dimensions": "reo:dimensions",
|
|
158
158
|
"width": "reo:width",
|
|
159
159
|
"height": "reo:height",
|
|
160
|
-
"punchDiameter": "reo:punchDiameter",
|
|
161
160
|
"holeSeparation": "reo:holeSeparation",
|
|
162
161
|
"scanResolution": "reo:scanResolution",
|
|
163
162
|
"value": "crm:P90_has_value",
|
|
@@ -177,6 +176,19 @@
|
|
|
177
176
|
"speed": {
|
|
178
177
|
"@id": "reo:paperSpeed",
|
|
179
178
|
"@context": { "value": "crm:P90_has_value" }
|
|
179
|
+
},
|
|
180
|
+
"perforator": {
|
|
181
|
+
"@id": "crm:P16_used_specific_object",
|
|
182
|
+
"@context": {
|
|
183
|
+
"punchDiameter": "reo:punchDiameter",
|
|
184
|
+
"chainPitch": "reo:chainPitch",
|
|
185
|
+
"advance": "reo:advance",
|
|
186
|
+
"slot": "reo:slot",
|
|
187
|
+
"bridge": "reo:bridge",
|
|
188
|
+
"n": "reo:sampleSize",
|
|
189
|
+
"strength": "reo:strength",
|
|
190
|
+
"value": "crm:P90_has_value"
|
|
191
|
+
}
|
|
180
192
|
}
|
|
181
193
|
}
|
|
182
194
|
},
|
package/lib/witnesses.d.ts
CHANGED
|
@@ -19,6 +19,13 @@ export interface Witness {
|
|
|
19
19
|
/** The belief a statement rests on, where it states one. */
|
|
20
20
|
belief?: Belief;
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* The versions a copy's features carry at first hand: for every copy,
|
|
24
|
+
* the latest state it bears. A version left out is reached only through
|
|
25
|
+
* the versions derived from it, or is attested by statement alone, and
|
|
26
|
+
* its text is a reconstruction rather than a reading.
|
|
27
|
+
*/
|
|
28
|
+
export declare const attestedVersions: (view: EditionView) => ReadonlySet<string>;
|
|
22
29
|
/**
|
|
23
30
|
* The copies that bear witness to the version: those whose features carry
|
|
24
31
|
* a symbol the version's own edits insert, and those that state they carry
|
package/lib/witnesses.js
CHANGED
|
@@ -28,6 +28,13 @@ const carriersIn = (view) => {
|
|
|
28
28
|
.map(carriage => [carriage.copy, carriage.version]))
|
|
29
29
|
};
|
|
30
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* The versions a copy's features carry at first hand: for every copy,
|
|
33
|
+
* the latest state it bears. A version left out is reached only through
|
|
34
|
+
* the versions derived from it, or is attested by statement alone, and
|
|
35
|
+
* its text is a reconstruction rather than a reading.
|
|
36
|
+
*/
|
|
37
|
+
export const attestedVersions = (view) => new Set(carriersIn(view).latestOf.values());
|
|
31
38
|
const witnessesIn = (carriers, view, versionId) => {
|
|
32
39
|
const carrying = carriers.copiesOf.get(versionId) ?? [];
|
|
33
40
|
const byCarriers = carrying.map((copy) => {
|
package/package.json
CHANGED