flow-frame-core 0.1.0 → 0.1.7
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 +32 -0
- package/TOOLS.md +1080 -0
- package/dist/browerRoutes.d.ts.map +1 -1
- package/dist/browerRoutes.js.map +1 -1
- package/dist/browser-utils/utils.d.ts.map +1 -1
- package/dist/browser-utils/utils.js +1 -0
- package/dist/browser-utils/utils.js.map +1 -1
- package/dist/controllers/browserController.d.ts +28 -0
- package/dist/controllers/browserController.d.ts.map +1 -0
- package/dist/controllers/browserController.js +45 -0
- package/dist/controllers/browserController.js.map +1 -0
- package/dist/controllers/extensionController.d.ts +39 -0
- package/dist/controllers/extensionController.d.ts.map +1 -0
- package/dist/controllers/extensionController.js +29 -0
- package/dist/controllers/extensionController.js.map +1 -0
- package/dist/controllers/promptController.d.ts +22 -0
- package/dist/controllers/promptController.d.ts.map +1 -0
- package/dist/controllers/promptController.js +59 -0
- package/dist/controllers/promptController.js.map +1 -0
- package/dist/controllers/promptLibraryController.d.ts +16 -0
- package/dist/controllers/promptLibraryController.d.ts.map +1 -0
- package/dist/controllers/promptLibraryController.js +60 -0
- package/dist/controllers/promptLibraryController.js.map +1 -0
- package/dist/controllers/standardController.d.ts +38 -0
- package/dist/controllers/standardController.d.ts.map +1 -0
- package/dist/controllers/standardController.js +79 -0
- package/dist/controllers/standardController.js.map +1 -0
- package/dist/controllers/workflowController.d.ts +19 -0
- package/dist/controllers/workflowController.d.ts.map +1 -0
- package/dist/controllers/workflowController.js +94 -0
- package/dist/controllers/workflowController.js.map +1 -0
- package/dist/filter-gmail-poller/filter-gmail-poller.d.ts.map +1 -1
- package/dist/filter-gmail-poller/filter-gmail-poller.js +1 -0
- package/dist/filter-gmail-poller/filter-gmail-poller.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -1
- package/dist/operations/blender-ops.d.ts.map +1 -1
- package/dist/operations/blender-ops.js +0 -1
- package/dist/operations/blender-ops.js.map +1 -1
- package/dist/operations.d.ts +1 -1
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +1 -0
- package/dist/operations.js.map +1 -1
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +1 -0
- package/dist/process.js.map +1 -1
- package/dist/server.js +32 -1
- package/dist/services/audioService.js.map +1 -1
- package/dist/services/autoPromptOptimizer.d.ts.map +1 -1
- package/dist/services/autoPromptOptimizer.js +1 -0
- package/dist/services/autoPromptOptimizer.js.map +1 -1
- package/dist/services/chainExecutor.d.ts +2 -1
- package/dist/services/chainExecutor.d.ts.map +1 -1
- package/dist/services/chainExecutor.js +105 -129
- package/dist/services/chainExecutor.js.map +1 -1
- package/dist/services/configuration/executor.d.ts.map +1 -1
- package/dist/services/configuration/executor.js +1 -0
- package/dist/services/configuration/executor.js.map +1 -1
- package/dist/services/error.d.ts.map +1 -1
- package/dist/services/error.js +1 -0
- package/dist/services/error.js.map +1 -1
- package/dist/services/executor.d.ts.map +1 -1
- package/dist/services/executor.js +110 -51
- package/dist/services/executor.js.map +1 -1
- package/dist/services/extractPdf.d.ts.map +1 -1
- package/dist/services/extractPdf.js +1 -0
- package/dist/services/extractPdf.js.map +1 -1
- package/dist/services/polyfill_canvas.js +1 -0
- package/dist/services/polyfill_canvas.js.map +1 -1
- package/dist/services/runPrompt.d.ts +1 -1
- package/dist/services/runPrompt.d.ts.map +1 -1
- package/dist/services/runPrompt.js +1 -1
- package/dist/services/runPrompt.js.map +1 -1
- package/dist/services/self-learning/injest.d.ts.map +1 -1
- package/dist/services/self-learning/injest.js +1 -0
- package/dist/services/self-learning/injest.js.map +1 -1
- package/dist/services/self-learning/matcher.d.ts +1 -1
- package/dist/services/self-learning/recognize.d.ts.map +1 -1
- package/dist/services/self-learning/recognize.js +1 -0
- package/dist/services/self-learning/recognize.js.map +1 -1
- package/dist/services/stepByStepAiPlanner.d.ts.map +1 -1
- package/dist/services/stepByStepAiPlanner.js +1 -0
- package/dist/services/stepByStepAiPlanner.js.map +1 -1
- package/dist/services/uiMapPathFinder.d.ts.map +1 -1
- package/dist/services/uiMapPathFinder.js +1 -0
- package/dist/services/uiMapPathFinder.js.map +1 -1
- package/dist/services/uiMapService.d.ts.map +1 -1
- package/dist/services/uiMapService.js +1 -0
- package/dist/services/uiMapService.js.map +1 -1
- package/dist/services/uiPlanner.d.ts.map +1 -1
- package/dist/services/uiPlanner.js.map +1 -1
- package/dist/services/variableGenerator.d.ts +1 -1
- package/dist/services/variableGenerator.d.ts.map +1 -1
- package/dist/services/variableGenerator.js.map +1 -1
- package/dist/standardRoutes.d.ts.map +1 -1
- package/dist/standardRoutes.js +92 -108
- package/dist/standardRoutes.js.map +1 -1
- package/dist/storage.d.ts +6 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +104 -23
- package/dist/storage.js.map +1 -1
- package/dist/storage.zachary.json +22 -0
- package/dist/suno_download.js +1 -1
- package/dist/suno_download.js.map +1 -1
- package/dist/utils.d.ts +8 -12
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +30 -1
- package/dist/utils.js.map +1 -1
- package/dist/workflowRoutes.d.ts.map +1 -1
- package/dist/workflowRoutes.js +28 -60
- package/dist/workflowRoutes.js.map +1 -1
- package/package.json +3 -2
- package/dist/augment-parallel.d.ts +0 -6
- package/dist/augment-parallel.d.ts.map +0 -1
- package/dist/augment-parallel.js +0 -128
- package/dist/augment-parallel.js.map +0 -1
- package/dist/augment-worker.d.ts +0 -2
- package/dist/augment-worker.d.ts.map +0 -1
- package/dist/augment-worker.js +0 -100
- package/dist/augment-worker.js.map +0 -1
- package/dist/capture_training_data_endpoints.d.ts +0 -158
- package/dist/capture_training_data_endpoints.d.ts.map +0 -1
- package/dist/capture_training_data_endpoints.js +0 -1812
- package/dist/capture_training_data_endpoints.js.map +0 -1
- package/dist/download.d.ts +0 -11
- package/dist/download.d.ts.map +0 -1
- package/dist/download.js +0 -31
- package/dist/download.js.map +0 -1
- package/dist/extension/background.d.ts +0 -2
- package/dist/extension/background.d.ts.map +0 -1
- package/dist/extension/background.js +0 -268
- package/dist/extension/background.js.map +0 -1
- package/dist/filter-gmail-poller/demo.d.ts +0 -2
- package/dist/filter-gmail-poller/demo.d.ts.map +0 -1
- package/dist/filter-gmail-poller/demo.js +0 -79
- package/dist/filter-gmail-poller/demo.js.map +0 -1
- package/dist/filter-gmail-poller/example-existing-app.d.ts +0 -2
- package/dist/filter-gmail-poller/example-existing-app.d.ts.map +0 -1
- package/dist/filter-gmail-poller/example-existing-app.js +0 -72
- package/dist/filter-gmail-poller/example-existing-app.js.map +0 -1
- package/dist/filter-gmail-poller/index.d.ts +0 -3
- package/dist/filter-gmail-poller/index.d.ts.map +0 -1
- package/dist/filter-gmail-poller/index.js +0 -18
- package/dist/filter-gmail-poller/index.js.map +0 -1
- package/dist/filter-gmail-poller/manual-test.d.ts +0 -2
- package/dist/filter-gmail-poller/manual-test.d.ts.map +0 -1
- package/dist/filter-gmail-poller/manual-test.js +0 -70
- package/dist/filter-gmail-poller/manual-test.js.map +0 -1
- package/dist/filter-gmail-poller/test.js +0 -69
- package/dist/gmail-poller/example.d.ts +0 -5
- package/dist/gmail-poller/example.d.ts.map +0 -1
- package/dist/gmail-poller/example.js +0 -83
- package/dist/gmail-poller/example.js.map +0 -1
- package/dist/gmail-poller/gmail-poller.d.ts +0 -82
- package/dist/gmail-poller/gmail-poller.d.ts.map +0 -1
- package/dist/gmail-poller/gmail-poller.js +0 -455
- package/dist/gmail-poller/gmail-poller.js.map +0 -1
- package/dist/gmail-poller/manual-test.d.ts +0 -2
- package/dist/gmail-poller/manual-test.d.ts.map +0 -1
- package/dist/gmail-poller/manual-test.js +0 -37
- package/dist/gmail-poller/manual-test.js.map +0 -1
- package/dist/gmail-poller/microsoft-email-example.d.ts +0 -8
- package/dist/gmail-poller/microsoft-email-example.d.ts.map +0 -1
- package/dist/gmail-poller/microsoft-email-example.js +0 -58
- package/dist/gmail-poller/microsoft-email-example.js.map +0 -1
- package/dist/gmail-poller/microsoft-email-poller.d.ts +0 -73
- package/dist/gmail-poller/microsoft-email-poller.d.ts.map +0 -1
- package/dist/gmail-poller/microsoft-email-poller.js +0 -346
- package/dist/gmail-poller/microsoft-email-poller.js.map +0 -1
- package/dist/gmail-poller/setup-auth.d.ts +0 -3
- package/dist/gmail-poller/setup-auth.d.ts.map +0 -1
- package/dist/gmail-poller/setup-auth.js +0 -36
- package/dist/gmail-poller/setup-auth.js.map +0 -1
- package/dist/gmail-poller/test.js +0 -36
- package/dist/inference/augment_levels.d.ts +0 -2
- package/dist/inference/augment_levels.d.ts.map +0 -1
- package/dist/inference/augment_levels.js.map +0 -1
- package/dist/inference/capture-overlay.d.ts +0 -13
- package/dist/inference/capture-overlay.d.ts.map +0 -1
- package/dist/inference/capture-overlay.js +0 -355
- package/dist/inference/capture-overlay.js.map +0 -1
- package/dist/playparser.d.ts +0 -2
- package/dist/playparser.d.ts.map +0 -1
- package/dist/playparser.js +0 -281
- package/dist/playparser.js.map +0 -1
- package/dist/services/agenticUiPlanner.d.ts +0 -27
- package/dist/services/agenticUiPlanner.d.ts.map +0 -1
- package/dist/services/agenticUiPlanner.js +0 -161
- package/dist/services/agenticUiPlanner.js.map +0 -1
- package/dist/services/autoPromptOptimizer.manual-test.d.ts +0 -2
- package/dist/services/autoPromptOptimizer.manual-test.d.ts.map +0 -1
- package/dist/services/autoPromptOptimizer.manual-test.js +0 -27
- package/dist/services/autoPromptOptimizer.manual-test.js.map +0 -1
- package/dist/services/generateJsTransformFromPrompt.d.ts +0 -11
- package/dist/services/generateJsTransformFromPrompt.d.ts.map +0 -1
- package/dist/services/generateJsTransformFromPrompt.js +0 -328
- package/dist/services/generateJsTransformFromPrompt.js.map +0 -1
- package/dist/services/promptRoutes.d.ts +0 -7
- package/dist/services/promptRoutes.d.ts.map +0 -1
- package/dist/services/promptRoutes.js.map +0 -1
- package/dist/services/schemaInference.d.ts +0 -2
- package/dist/services/schemaInference.d.ts.map +0 -1
- package/dist/services/schemaInference.js +0 -17
- package/dist/services/schemaInference.js.map +0 -1
- package/dist/services/self-learning/autolearn.d.ts +0 -23
- package/dist/services/self-learning/autolearn.d.ts.map +0 -1
- package/dist/services/self-learning/autolearn.js +0 -308
- package/dist/services/self-learning/autolearn.js.map +0 -1
- package/dist/services/self-learning/learn.d.ts +0 -2
- package/dist/services/self-learning/learn.d.ts.map +0 -1
- package/dist/services/self-learning/learn.js +0 -145
- package/dist/services/self-learning/learn.js.map +0 -1
- package/dist/services/self-learning/schemaStrictify.d.ts +0 -2
- package/dist/services/self-learning/schemaStrictify.d.ts.map +0 -1
- package/dist/services/self-learning/schemaStrictify.js +0 -34
- package/dist/services/self-learning/schemaStrictify.js.map +0 -1
- package/dist/services/self-learning/transition_graph.d.ts +0 -6
- package/dist/services/self-learning/transition_graph.d.ts.map +0 -1
- package/dist/services/self-learning/transition_graph.js +0 -83
- package/dist/services/self-learning/transition_graph.js.map +0 -1
- package/dist/services/test-genjs.js +0 -39
- package/dist/services/test-genjs.manual-test.d.ts +0 -2
- package/dist/services/test-genjs.manual-test.d.ts.map +0 -1
- package/dist/services/test-genjs.manual-test.js +0 -40
- package/dist/services/test-genjs.manual-test.js.map +0 -1
- package/dist/test-web-element-requests.d.ts +0 -6
- package/dist/test-web-element-requests.d.ts.map +0 -1
- package/dist/test-web-element-requests.js +0 -114
- package/dist/test-web-element-requests.js.map +0 -1
- package/dist/test_pdf_render.d.ts +0 -2
- package/dist/test_pdf_render.d.ts.map +0 -1
- package/dist/test_pdf_render.js +0 -50
- package/dist/test_pdf_render.js.map +0 -1
- package/dist/web-element-requests.d.ts +0 -102
- package/dist/web-element-requests.d.ts.map +0 -1
- package/dist/web-element-requests.js +0 -278
- package/dist/web-element-requests.js.map +0 -1
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import yaml from 'js-yaml';
|
|
4
|
-
import sharp from 'sharp';
|
|
5
|
-
/**
|
|
6
|
-
* Process hierarchical annotations and generate YOLO training data
|
|
7
|
-
* @param {string} imagePath - Path to the source image
|
|
8
|
-
* @param {Object} annotationData - Annotation data structure
|
|
9
|
-
* @param {string} outputDir - Target output directory
|
|
10
|
-
* @param {Object} options - Processing options
|
|
11
|
-
*/
|
|
12
|
-
export async function processAnnotations(imagePath, annotationData, outputDir, options = {}) {
|
|
13
|
-
try {
|
|
14
|
-
// Load and get image dimensions
|
|
15
|
-
const imageBuffer = await fs.readFile(imagePath);
|
|
16
|
-
console.log('Loaded image:', imagePath);
|
|
17
|
-
const image = sharp(imageBuffer);
|
|
18
|
-
const { width: imgWidth, height: imgHeight } = await image.metadata();
|
|
19
|
-
console.log(`Image dimensions: ${imgWidth}x${imgHeight}`);
|
|
20
|
-
const defaults = {
|
|
21
|
-
prefix: `sample_${Date.now()}`,
|
|
22
|
-
valSplit: 0.2,
|
|
23
|
-
augCount: 100, // For now, just process once without jittering
|
|
24
|
-
jitterPos: Math.min(imgWidth * 0.025, 13),
|
|
25
|
-
jitterSize: Math.min(imgWidth * 0.05, 25),
|
|
26
|
-
rootParentPercentageX: 0.1,
|
|
27
|
-
rootParentPercentageY: 0.1,
|
|
28
|
-
minAreaRatio: 0.05,
|
|
29
|
-
onProgress: null // Callback for progress updates
|
|
30
|
-
};
|
|
31
|
-
const config = { ...defaults, ...options };
|
|
32
|
-
// Parse annotation data structure
|
|
33
|
-
const { classes, parents, boxes } = annotationData;
|
|
34
|
-
// Build class hierarchy helpers
|
|
35
|
-
const classToIndex = {};
|
|
36
|
-
classes.forEach((name, idx) => classToIndex[name] = idx);
|
|
37
|
-
const getDepth = (className) => {
|
|
38
|
-
let depth = 0;
|
|
39
|
-
let current = className;
|
|
40
|
-
while (parents[current]) {
|
|
41
|
-
depth++;
|
|
42
|
-
current = parents[current];
|
|
43
|
-
if (depth > 10)
|
|
44
|
-
break; // Prevent infinite loops
|
|
45
|
-
}
|
|
46
|
-
return depth;
|
|
47
|
-
};
|
|
48
|
-
// Group classes by depth
|
|
49
|
-
const depthToClasses = {};
|
|
50
|
-
classes.forEach(className => {
|
|
51
|
-
const depth = getDepth(className);
|
|
52
|
-
if (!depthToClasses[depth])
|
|
53
|
-
depthToClasses[depth] = [];
|
|
54
|
-
depthToClasses[depth].push(className);
|
|
55
|
-
});
|
|
56
|
-
// Create directory structure for each depth
|
|
57
|
-
for (const depth of Object.keys(depthToClasses)) {
|
|
58
|
-
const levelDir = path.join(outputDir, `level_${depth}`);
|
|
59
|
-
await fs.mkdir(path.join(levelDir, 'images', 'train'), { recursive: true });
|
|
60
|
-
console.log(`Created directory: ${path.join(levelDir, 'images', 'train')}`);
|
|
61
|
-
await fs.mkdir(path.join(levelDir, 'images', 'val'), { recursive: true });
|
|
62
|
-
console.log(`Created directory: ${path.join(levelDir, 'images', 'val')}`);
|
|
63
|
-
await fs.mkdir(path.join(levelDir, 'labels', 'train'), { recursive: true });
|
|
64
|
-
console.log(`Created directory: ${path.join(levelDir, 'labels', 'train')}`);
|
|
65
|
-
await fs.mkdir(path.join(levelDir, 'labels', 'val'), { recursive: true });
|
|
66
|
-
console.log(`Created directory: ${path.join(levelDir, 'labels', 'val')}`);
|
|
67
|
-
}
|
|
68
|
-
// Convert boxes to processing format
|
|
69
|
-
const processBoxes = boxes.map(box => ({
|
|
70
|
-
x1: box.x,
|
|
71
|
-
y1: box.y,
|
|
72
|
-
x2: box.x + box.w,
|
|
73
|
-
y2: box.y + box.h,
|
|
74
|
-
classIdx: classToIndex[box.class],
|
|
75
|
-
className: box.class,
|
|
76
|
-
depth: getDepth(box.class)
|
|
77
|
-
}));
|
|
78
|
-
// Process each augmentation iteration
|
|
79
|
-
for (let i = 0; i < config.augCount; i++) {
|
|
80
|
-
const isVal = Math.random() < config.valSplit;
|
|
81
|
-
const split = isVal ? 'val' : 'train';
|
|
82
|
-
const iterPrefix = `${config.prefix}_${i.toString().padStart(4, '0')}`;
|
|
83
|
-
console.log(`Processing iteration ${i + 1}/${config.augCount} (${split})`);
|
|
84
|
-
// Apply jittering to boxes (for now, minimal jittering)
|
|
85
|
-
const jitteredBoxes = processBoxes.map(box => {
|
|
86
|
-
const dx = Math.floor(Math.random() * (config.jitterPos * 2 + 1)) - config.jitterPos;
|
|
87
|
-
const dy = Math.floor(Math.random() * (config.jitterPos * 2 + 1)) - config.jitterPos;
|
|
88
|
-
const dw = Math.floor(Math.random() * (config.jitterSize * 2 + 1)) - config.jitterSize;
|
|
89
|
-
const dh = Math.floor(Math.random() * (config.jitterSize * 2 + 1)) - config.jitterSize;
|
|
90
|
-
return {
|
|
91
|
-
...box,
|
|
92
|
-
x1: Math.max(0, Math.min(box.x1 + dx, imgWidth - 1)),
|
|
93
|
-
y1: Math.max(0, Math.min(box.y1 + dy, imgHeight - 1)),
|
|
94
|
-
x2: Math.max(box.x1 + dx + 1, Math.min(box.x2 + dx + dw, imgWidth)),
|
|
95
|
-
y2: Math.max(box.y1 + dy + 1, Math.min(box.y2 + dy + dh, imgHeight))
|
|
96
|
-
};
|
|
97
|
-
});
|
|
98
|
-
// Process regions recursively
|
|
99
|
-
await processRegion(image, { x1: 0, y1: 0, x2: imgWidth, y2: imgHeight }, -1, null, iterPrefix, jitteredBoxes, {
|
|
100
|
-
classes,
|
|
101
|
-
parents,
|
|
102
|
-
classToIndex,
|
|
103
|
-
getDepth,
|
|
104
|
-
depthToClasses,
|
|
105
|
-
outputDir,
|
|
106
|
-
split,
|
|
107
|
-
config,
|
|
108
|
-
imgWidth,
|
|
109
|
-
imgHeight
|
|
110
|
-
});
|
|
111
|
-
await config.onProgress?.({
|
|
112
|
-
step: i + 1,
|
|
113
|
-
totalSteps: config.augCount,
|
|
114
|
-
percentage: Math.round(((i + 1) / config.augCount) * 100),
|
|
115
|
-
message: `Processed augmentation ${i + 1}`
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
// Generate data.yaml for each level
|
|
119
|
-
for (const depth of Object.keys(depthToClasses)) {
|
|
120
|
-
await generateDataYaml(path.join(outputDir, `level_${depth}`), classes, config);
|
|
121
|
-
}
|
|
122
|
-
console.log(`Successfully processed ${config.augCount} iterations with ${classes.length} classes`);
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
console.error('Error processing annotations:', error);
|
|
126
|
-
throw error;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Recursive function to process regions at each depth level
|
|
131
|
-
*/
|
|
132
|
-
async function processRegion(sourceImage, regionBox, regionDepth, parentClassIdx, namePrefix, jitteredBoxes, context) {
|
|
133
|
-
const { classes, parents, classToIndex, getDepth, depthToClasses, outputDir, split, config, imgWidth, imgHeight } = context;
|
|
134
|
-
const childDepth = regionDepth + 1;
|
|
135
|
-
// Check if there are classes at this child depth
|
|
136
|
-
if (!depthToClasses[childDepth]) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
const { x1: rx1, y1: ry1, x2: rx2, y2: ry2 } = regionBox;
|
|
140
|
-
// Find candidate boxes at this depth level
|
|
141
|
-
const candidateBoxes = jitteredBoxes.filter(box => {
|
|
142
|
-
// Check depth
|
|
143
|
-
if (box.depth !== childDepth)
|
|
144
|
-
return false;
|
|
145
|
-
// Check parent relationship (if not root)
|
|
146
|
-
if (parentClassIdx !== null) {
|
|
147
|
-
const parentClassName = classes[parentClassIdx];
|
|
148
|
-
if (parents[box.className] !== parentClassName)
|
|
149
|
-
return false;
|
|
150
|
-
}
|
|
151
|
-
// Check containment within region
|
|
152
|
-
return box.x1 >= rx1 && box.y1 >= ry1 && box.x2 <= rx2 && box.y2 <= ry2;
|
|
153
|
-
});
|
|
154
|
-
if (candidateBoxes.length === 0) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
const levelFolder = path.join(outputDir, `level_${childDepth}`);
|
|
158
|
-
// Create ONE image and label file for this parent region containing ALL child boxes
|
|
159
|
-
const parentClassName = parentClassIdx !== null ? classes[parentClassIdx] : 'root';
|
|
160
|
-
const thisPrefix = `${namePrefix}_${parentClassName}_${guid()}`;
|
|
161
|
-
if (childDepth === 0) {
|
|
162
|
-
// Depth 0: Save full image with all root boxes
|
|
163
|
-
const imgPath = path.join(levelFolder, 'images', split, `${thisPrefix}.png`);
|
|
164
|
-
console.log(`Creating full image for root boxes: ${imgPath}`);
|
|
165
|
-
const labelPath = path.join(levelFolder, 'labels', split, `${thisPrefix}.txt`);
|
|
166
|
-
console.log(`Creating label file for root boxes: ${labelPath}`);
|
|
167
|
-
console.log(`Checking for existing image: ${imgPath}`);
|
|
168
|
-
try {
|
|
169
|
-
await fs.access(imgPath);
|
|
170
|
-
console.log(`Image already exists: ${imgPath}`);
|
|
171
|
-
}
|
|
172
|
-
catch {
|
|
173
|
-
// File doesn't exist, save it
|
|
174
|
-
// await sourceImage.png().toFile(imgPath);
|
|
175
|
-
await sourceImage.clone().png().toFile(imgPath);
|
|
176
|
-
console.log(`Saved full image: ${imgPath}`);
|
|
177
|
-
}
|
|
178
|
-
// Create labels with ALL boxes at this depth level
|
|
179
|
-
const labelLines = [];
|
|
180
|
-
for (const box of candidateBoxes) {
|
|
181
|
-
// Main box
|
|
182
|
-
const xc = ((box.x1 + box.x2) / 2) / imgWidth;
|
|
183
|
-
const yc = ((box.y1 + box.y2) / 2) / imgHeight;
|
|
184
|
-
const wn = (box.x2 - box.x1) / imgWidth;
|
|
185
|
-
const hn = (box.y2 - box.y1) / imgHeight;
|
|
186
|
-
labelLines.push(`${box.classIdx} ${xc.toFixed(6)} ${yc.toFixed(6)} ${wn.toFixed(6)} ${hn.toFixed(6)}`);
|
|
187
|
-
// Corner boxes for this box
|
|
188
|
-
const cornerLines = generateCornerBoxes(box, box.classIdx, classes.length, config, imgWidth, imgHeight);
|
|
189
|
-
labelLines.push(...cornerLines);
|
|
190
|
-
}
|
|
191
|
-
await fs.writeFile(labelPath, labelLines.join('\n') + '\n');
|
|
192
|
-
console.log(`Created label file with ${candidateBoxes.length} boxes: ${labelPath}`);
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
// Child depth >= 1: Crop parent region and label ALL child boxes within it
|
|
196
|
-
const parentAbsX1 = Math.floor(regionBox.x1);
|
|
197
|
-
const parentAbsY1 = Math.floor(regionBox.y1);
|
|
198
|
-
const parentAbsX2 = Math.floor(regionBox.x2);
|
|
199
|
-
const parentAbsY2 = Math.floor(regionBox.y2);
|
|
200
|
-
const regionW = parentAbsX2 - parentAbsX1;
|
|
201
|
-
const regionH = parentAbsY2 - parentAbsY1;
|
|
202
|
-
// Crop the image ONCE for this parent region
|
|
203
|
-
const imgPath = path.join(levelFolder, 'images', split, `${thisPrefix}.png`);
|
|
204
|
-
const labelPath = path.join(levelFolder, 'labels', split, `${thisPrefix}.txt`);
|
|
205
|
-
try {
|
|
206
|
-
await fs.access(imgPath);
|
|
207
|
-
console.log(`Image already exists: ${imgPath}`);
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
// File doesn't exist, crop and save it
|
|
211
|
-
const croppedImage = sourceImage.clone().extract({
|
|
212
|
-
left: parentAbsX1,
|
|
213
|
-
top: parentAbsY1,
|
|
214
|
-
width: regionW,
|
|
215
|
-
height: regionH
|
|
216
|
-
});
|
|
217
|
-
await croppedImage.png().toFile(imgPath);
|
|
218
|
-
console.log(`Saved cropped image: ${imgPath} (${regionW}x${regionH})`);
|
|
219
|
-
}
|
|
220
|
-
// Create labels for ALL child boxes in this cropped region
|
|
221
|
-
const labelLines = [];
|
|
222
|
-
for (const box of candidateBoxes) {
|
|
223
|
-
const mx1 = box.x1 - rx1;
|
|
224
|
-
const my1 = box.y1 - ry1;
|
|
225
|
-
const mx2 = box.x2 - rx1;
|
|
226
|
-
const my2 = box.y2 - ry1;
|
|
227
|
-
const xc = ((mx1 + mx2) / 2) / regionW;
|
|
228
|
-
const yc = ((my1 + my2) / 2) / regionH;
|
|
229
|
-
const wn = (mx2 - mx1) / regionW;
|
|
230
|
-
const hn = (my2 - my1) / regionH;
|
|
231
|
-
labelLines.push(`${box.classIdx} ${xc.toFixed(6)} ${yc.toFixed(6)} ${wn.toFixed(6)} ${hn.toFixed(6)}`);
|
|
232
|
-
}
|
|
233
|
-
await fs.writeFile(labelPath, labelLines.join('\n') + '\n');
|
|
234
|
-
console.log(`Saved label with ${candidateBoxes.length} child boxes for parent "${parentClassName}"`);
|
|
235
|
-
}
|
|
236
|
-
// Now recurse into EACH child box's region for the next depth level
|
|
237
|
-
for (let idx = 0; idx < candidateBoxes.length; idx++) {
|
|
238
|
-
const box = candidateBoxes[idx];
|
|
239
|
-
// Calculate absolute coordinates for recursion
|
|
240
|
-
let absRx1, absRy1, absRx2, absRy2;
|
|
241
|
-
if (childDepth === 0) {
|
|
242
|
-
absRx1 = box.x1;
|
|
243
|
-
absRy1 = box.y1;
|
|
244
|
-
absRx2 = box.x2;
|
|
245
|
-
absRy2 = box.y2;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
const parentAbsX1 = Math.floor(regionBox.x1);
|
|
249
|
-
const parentAbsY1 = Math.floor(regionBox.y1);
|
|
250
|
-
const mx1 = box.x1 - rx1;
|
|
251
|
-
const my1 = box.y1 - ry1;
|
|
252
|
-
const mx2 = box.x2 - rx1;
|
|
253
|
-
const my2 = box.y2 - ry1;
|
|
254
|
-
absRx1 = parentAbsX1 + Math.floor(mx1);
|
|
255
|
-
absRy1 = parentAbsY1 + Math.floor(my1);
|
|
256
|
-
absRx2 = parentAbsX1 + Math.floor(mx2);
|
|
257
|
-
absRy2 = parentAbsY1 + Math.floor(my2);
|
|
258
|
-
}
|
|
259
|
-
// Recurse into this box's region for the next depth level
|
|
260
|
-
await processRegion(sourceImage, { x1: absRx1, y1: absRy1, x2: absRx2, y2: absRy2 }, childDepth, box.classIdx, `${box.className}_c_${childDepth}_${idx}`, // Unique prefix for this child's descendants
|
|
261
|
-
jitteredBoxes, context);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
const SKIP_CORNER_BOXES = true; // Set to true to skip corner boxes
|
|
265
|
-
/**
|
|
266
|
-
* Generate corner box labels for depth 0 boxes
|
|
267
|
-
*/
|
|
268
|
-
function generateCornerBoxes(box, classIdx, numClasses, config, imgWidth, imgHeight) {
|
|
269
|
-
const cornerBase = numClasses + (classIdx * 4);
|
|
270
|
-
const pw = box.x2 - box.x1;
|
|
271
|
-
const ph = box.y2 - box.y1;
|
|
272
|
-
const cw = config.rootParentPercentageX * pw;
|
|
273
|
-
const ch = config.rootParentPercentageY * ph;
|
|
274
|
-
if (SKIP_CORNER_BOXES) {
|
|
275
|
-
return [];
|
|
276
|
-
}
|
|
277
|
-
const corners = [
|
|
278
|
-
// Top-left
|
|
279
|
-
{ x1: box.x1, y1: box.y1, x2: box.x1 + cw, y2: box.y1 + ch },
|
|
280
|
-
// Top-right
|
|
281
|
-
{ x1: box.x2 - cw, y1: box.y1, x2: box.x2, y2: box.y1 + ch },
|
|
282
|
-
// Bottom-left
|
|
283
|
-
{ x1: box.x1, y1: box.y2 - ch, x2: box.x1 + cw, y2: box.y2 },
|
|
284
|
-
// Bottom-right
|
|
285
|
-
{ x1: box.x2 - cw, y1: box.y2 - ch, x2: box.x2, y2: box.y2 }
|
|
286
|
-
];
|
|
287
|
-
return corners.map((corner, i) => {
|
|
288
|
-
const cx = (corner.x1 + corner.x2) / 2;
|
|
289
|
-
const cy = (corner.y1 + corner.y2) / 2;
|
|
290
|
-
const xc = cx / imgWidth;
|
|
291
|
-
const yc = cy / imgHeight;
|
|
292
|
-
const wn = cw / imgWidth;
|
|
293
|
-
const hn = ch / imgHeight;
|
|
294
|
-
return `${cornerBase + i} ${xc.toFixed(6)} ${yc.toFixed(6)} ${wn.toFixed(6)} ${hn.toFixed(6)}`;
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
function guid() {
|
|
298
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
299
|
-
var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
300
|
-
return v.toString(16);
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Generate data.yaml file for YOLO training
|
|
305
|
-
*/
|
|
306
|
-
async function generateDataYaml(levelDir, classes, config) {
|
|
307
|
-
// Build expanded names list (original classes + corner classes)
|
|
308
|
-
const expandedNames = [...classes];
|
|
309
|
-
if (!SKIP_CORNER_BOXES) {
|
|
310
|
-
classes.forEach(className => {
|
|
311
|
-
expandedNames.push(`${className}#tl`, `${className}#tr`, `${className}#bl`, `${className}#br`);
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
const yamlData = {
|
|
315
|
-
train: 'images/train',
|
|
316
|
-
val: 'images/val',
|
|
317
|
-
nc: expandedNames.length,
|
|
318
|
-
names: expandedNames
|
|
319
|
-
};
|
|
320
|
-
const yamlContent = yaml.dump(yamlData);
|
|
321
|
-
const yamlPath = path.join(levelDir, 'data.yaml');
|
|
322
|
-
await fs.writeFile(yamlPath, yamlContent);
|
|
323
|
-
console.log(`Generated data.yaml in ${levelDir} (nc=${expandedNames.length})`);
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Example usage function
|
|
327
|
-
*/
|
|
328
|
-
export async function processImageAnnotations(imagePath, annotationJsonPath, outputDir, options = {}) {
|
|
329
|
-
try {
|
|
330
|
-
const annotationData = JSON.parse(await fs.readFile(annotationJsonPath, 'utf8'));
|
|
331
|
-
await processAnnotations(imagePath, annotationData, outputDir, options);
|
|
332
|
-
console.log('Processing completed successfully');
|
|
333
|
-
}
|
|
334
|
-
catch (error) {
|
|
335
|
-
console.error('Error processing image annotations:', error);
|
|
336
|
-
throw error;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
///Users/andrewporter/Documents/ai/yolo_training_data
|
|
340
|
-
// Example usage:
|
|
341
|
-
/*
|
|
342
|
-
await processImageAnnotations(
|
|
343
|
-
'/path/to/image.png',
|
|
344
|
-
'/path/to/annotations.json',
|
|
345
|
-
'/path/to/output',
|
|
346
|
-
{
|
|
347
|
-
prefix: 'my_sample',
|
|
348
|
-
valSplit: 0.2,
|
|
349
|
-
augCount: 100,
|
|
350
|
-
rootParentPercentageX: 0.1,
|
|
351
|
-
rootParentPercentageY: 0.1
|
|
352
|
-
}
|
|
353
|
-
);
|
|
354
|
-
*/
|
|
355
|
-
//# sourceMappingURL=capture-overlay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture-overlay.js","sourceRoot":"","sources":["../../src/inference/capture-overlay.ts"],"names":[],"mappings":"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"}
|
package/dist/playparser.d.ts
DELETED
package/dist/playparser.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playparser.d.ts","sourceRoot":"","sources":["../src/playparser.ts"],"names":[],"mappings":""}
|
package/dist/playparser.js
DELETED
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses a specially formatted play text (like Shakespeare) into a structured JSON object.
|
|
3
|
-
*
|
|
4
|
-
* @param {string} input - The raw play text.
|
|
5
|
-
* @returns {object} - A JSON object representing the play structure.
|
|
6
|
-
*/
|
|
7
|
-
function parsePlay(input) {
|
|
8
|
-
const lines = input.split(/\r?\n/);
|
|
9
|
-
const play = {
|
|
10
|
-
title: null,
|
|
11
|
-
acts: []
|
|
12
|
-
};
|
|
13
|
-
let currentAct = null;
|
|
14
|
-
let currentScene = null;
|
|
15
|
-
let currentBlock = null;
|
|
16
|
-
// Helper: finalize and push the currentBlock (speech or direction) into the current scene
|
|
17
|
-
function finalizeBlock() {
|
|
18
|
-
if (!currentScene || !currentBlock)
|
|
19
|
-
return;
|
|
20
|
-
currentScene.blocks.push(currentBlock);
|
|
21
|
-
currentBlock = null;
|
|
22
|
-
}
|
|
23
|
-
// Iterate line by line
|
|
24
|
-
for (let rawLine of lines) {
|
|
25
|
-
const line = rawLine.trim();
|
|
26
|
-
// Skip blank lines
|
|
27
|
-
if (line === "")
|
|
28
|
-
continue;
|
|
29
|
-
// 1) Detect the play title (first non-empty line before any Act)
|
|
30
|
-
if (!play.title && /^The\s+/i.test(line)) {
|
|
31
|
-
play.title = line;
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
// 2) Detect Act headings: “Actus Primus. Scoena Prima.” or “Actus Secundus. Scoena Secunda.”, etc.
|
|
35
|
-
const actMatch = line.match(/^(Actus\s+[IVXLC]+)\.\s*(Scoena\s+[IVXLC]+)/i);
|
|
36
|
-
if (actMatch) {
|
|
37
|
-
// Finalize any previous blocks/scenes
|
|
38
|
-
finalizeBlock();
|
|
39
|
-
// Start a new Act
|
|
40
|
-
currentAct = {
|
|
41
|
-
title: actMatch[1], // e.g. “Actus Primus”
|
|
42
|
-
sceneHead: actMatch[2], // e.g. “Scoena Prima”
|
|
43
|
-
scenes: []
|
|
44
|
-
};
|
|
45
|
-
play.acts.push(currentAct);
|
|
46
|
-
// Immediately start the first Scene within this act
|
|
47
|
-
currentScene = {
|
|
48
|
-
title: actMatch[2],
|
|
49
|
-
blocks: []
|
|
50
|
-
};
|
|
51
|
-
currentAct.scenes.push(currentScene);
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
// 3) Detect a new Scene within the same Act (in case acts contain multiple scenes).
|
|
55
|
-
// If the line starts with “Scoena...” and we already have an act open, start a new scene.
|
|
56
|
-
const sceneMatch = line.match(/^Scoena\s+[IVXLC]+(?:\.\s*.*)?$/i);
|
|
57
|
-
if (sceneMatch && currentAct) {
|
|
58
|
-
finalizeBlock();
|
|
59
|
-
currentScene = {
|
|
60
|
-
title: line,
|
|
61
|
-
blocks: []
|
|
62
|
-
};
|
|
63
|
-
currentAct.scenes.push(currentScene);
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
// 4) Detect stage directions: lines beginning with keywords like “Enter”, “Exit”, “Exeunt”, “Sennet”, “Flourish”
|
|
67
|
-
const directionMatch = line.match(/^(Enter|Exit|Exeunt|Sennet|Flourish|Exeunt\.)/i);
|
|
68
|
-
if (directionMatch && currentScene) {
|
|
69
|
-
// Finalize any prior block
|
|
70
|
-
finalizeBlock();
|
|
71
|
-
currentBlock = {
|
|
72
|
-
type: "direction",
|
|
73
|
-
text: line
|
|
74
|
-
};
|
|
75
|
-
// Immediately finalize this direction block
|
|
76
|
-
finalizeBlock();
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
// 5) Detect a speech line: “Flauius. Hence: home you idle Creatures, get you home:”
|
|
80
|
-
// Speaker name is everything before the first period followed by space.
|
|
81
|
-
const speechMatch = line.match(/^([A-Za-z][A-Za-z0-9\.\-]*)\.\s*(.*)$/);
|
|
82
|
-
if (speechMatch && currentScene) {
|
|
83
|
-
// If there was a previous block (speech or direction), finalize it first
|
|
84
|
-
finalizeBlock();
|
|
85
|
-
const speaker = speechMatch[1];
|
|
86
|
-
const text = speechMatch[2];
|
|
87
|
-
currentBlock = {
|
|
88
|
-
type: "speech",
|
|
89
|
-
speaker: speaker,
|
|
90
|
-
lines: [text]
|
|
91
|
-
};
|
|
92
|
-
continue;
|
|
93
|
-
}
|
|
94
|
-
// 6) If the line doesn't match any of the above, it is a continuation:
|
|
95
|
-
// - Either part of the previous speech’s lines
|
|
96
|
-
// - Or, in some rare cases, a direction extension
|
|
97
|
-
if (currentBlock) {
|
|
98
|
-
// Append to the current speech block’s lines
|
|
99
|
-
if (currentBlock.type === "speech") {
|
|
100
|
-
currentBlock.lines.push(line);
|
|
101
|
-
}
|
|
102
|
-
// If it were somehow a multi-line direction, we could append, but for now we treat each direction as single-line.
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
// 7) Any other text outside known contexts: treat as unparsed or metadata. We’ll lump it as a “misc” block.
|
|
106
|
-
if (currentScene) {
|
|
107
|
-
currentBlock = {
|
|
108
|
-
type: "misc",
|
|
109
|
-
text: line
|
|
110
|
-
};
|
|
111
|
-
finalizeBlock();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Finalize any leftover block at end of input
|
|
115
|
-
finalizeBlock();
|
|
116
|
-
return play;
|
|
117
|
-
}
|
|
118
|
-
// Example usage:
|
|
119
|
-
const rawText = `
|
|
120
|
-
The Tragedie of Julius Caesar
|
|
121
|
-
|
|
122
|
-
Actus Primus. Scoena Prima.
|
|
123
|
-
|
|
124
|
-
Enter Flauius, Murellus, and certaine Commoners ouer the Stage.
|
|
125
|
-
|
|
126
|
-
Flauius. Hence: home you idle Creatures, get you home:
|
|
127
|
-
Is this a Holiday? What, know you not
|
|
128
|
-
(Being Mechanicall) you ought not walke
|
|
129
|
-
Vpon a labouring day, without the signe
|
|
130
|
-
Of your Profession? Speake, what Trade art thou?
|
|
131
|
-
Car. Why Sir, a Carpenter
|
|
132
|
-
|
|
133
|
-
Mur. Where is thy Leather Apron, and thy Rule?
|
|
134
|
-
What dost thou with thy best Apparrell on?
|
|
135
|
-
You sir, what Trade are you?
|
|
136
|
-
Cobl. Truely Sir, in respect of a fine Workman, I am
|
|
137
|
-
but as you would say, a Cobler
|
|
138
|
-
|
|
139
|
-
Mur. But what Trade art thou? Answer me directly
|
|
140
|
-
|
|
141
|
-
Cob. A Trade Sir, that I hope I may vse, with a safe
|
|
142
|
-
Conscience, which is indeed Sir, a Mender of bad soules
|
|
143
|
-
|
|
144
|
-
Fla. What Trade thou knaue? Thou naughty knaue,
|
|
145
|
-
what Trade?
|
|
146
|
-
Cobl. Nay I beseech you Sir, be not out with me: yet
|
|
147
|
-
if you be out Sir, I can mend you
|
|
148
|
-
|
|
149
|
-
Mur. What mean'st thou by that? Mend mee, thou
|
|
150
|
-
sawcy Fellow?
|
|
151
|
-
Cob. Why sir, Cobble you
|
|
152
|
-
|
|
153
|
-
Fla. Thou art a Cobler, art thou?
|
|
154
|
-
Cob. Truly sir, all that I liue by, is with the Aule: I
|
|
155
|
-
meddle with no Tradesmans matters, nor womens matters;
|
|
156
|
-
but withal I am indeed Sir, a Surgeon to old shooes:
|
|
157
|
-
when they are in great danger, I recouer them. As proper
|
|
158
|
-
men as euer trod vpon Neats Leather, haue gone vpon
|
|
159
|
-
my handy-worke
|
|
160
|
-
|
|
161
|
-
Fla. But wherefore art not in thy Shop to day?
|
|
162
|
-
Why do'st thou leade these men about the streets?
|
|
163
|
-
Cob. Truly sir, to weare out their shooes, to get my
|
|
164
|
-
selfe into more worke. But indeede sir, we make Holyday
|
|
165
|
-
to see Caesar, and to reioyce in his Triumph
|
|
166
|
-
|
|
167
|
-
Mur. Wherefore reioyce?
|
|
168
|
-
What Conquest brings he home?
|
|
169
|
-
What Tributaries follow him to Rome,
|
|
170
|
-
To grace in Captiue bonds his Chariot Wheeles?
|
|
171
|
-
You Blockes, you stones, you worse then senslesse things:
|
|
172
|
-
O you hard hearts, you cruell men of Rome,
|
|
173
|
-
Knew you not Pompey many a time and oft?
|
|
174
|
-
Haue you climb'd vp to Walles and Battlements,
|
|
175
|
-
To Towres and Windowes? Yea, to Chimney tops,
|
|
176
|
-
Your Infants in your Armes, and there haue sate
|
|
177
|
-
The liue-long day, with patient expectation,
|
|
178
|
-
To see great Pompey passe the streets of Rome:
|
|
179
|
-
And when you saw his Chariot but appeare,
|
|
180
|
-
Haue you not made an Vniuersall shout,
|
|
181
|
-
That Tyber trembled vnderneath her bankes
|
|
182
|
-
To heare the replication of your sounds,
|
|
183
|
-
Made in her Concaue Shores?
|
|
184
|
-
And do you now put on your best attyre?
|
|
185
|
-
And do you now cull out a Holyday?
|
|
186
|
-
And do you now strew Flowers in his way,
|
|
187
|
-
That comes in Triumph ouer Pompeyes blood?
|
|
188
|
-
Be gone,
|
|
189
|
-
Runne to your houses, fall vpon your knees,
|
|
190
|
-
Pray to the Gods to intermit the plague
|
|
191
|
-
That needs must light on this Ingratitude
|
|
192
|
-
|
|
193
|
-
Fla. Go, go, good Countrymen, and for this fault
|
|
194
|
-
Assemble all the poore men of your sort;
|
|
195
|
-
Draw them to Tyber bankes, and weepe your teares
|
|
196
|
-
Into the Channell, till the lowest streame
|
|
197
|
-
Do kisse the most exalted Shores of all.
|
|
198
|
-
|
|
199
|
-
Exeunt. all the Commoners.
|
|
200
|
-
|
|
201
|
-
See where their basest mettle be not mou'd,
|
|
202
|
-
They vanish tongue-tyed in their guiltinesse:
|
|
203
|
-
Go you downe that way towards the Capitoll,
|
|
204
|
-
This way will I: Disrobe the Images,
|
|
205
|
-
If you do finde them deckt with Ceremonies
|
|
206
|
-
|
|
207
|
-
Mur. May we do so?
|
|
208
|
-
You know it is the Feast of Lupercall
|
|
209
|
-
|
|
210
|
-
Fla. It is no matter, let no Images
|
|
211
|
-
Be hung with Caesars Trophees: Ile about,
|
|
212
|
-
And driue away the Vulgar from the streets;
|
|
213
|
-
So do you too, where you perceiue them thicke.
|
|
214
|
-
These growing Feathers, pluckt from Caesars wing,
|
|
215
|
-
Will make him flye an ordinary pitch,
|
|
216
|
-
Who else would soare aboue the view of men,
|
|
217
|
-
And keepe vs all in seruile fearefulnesse.
|
|
218
|
-
|
|
219
|
-
Exeunt.
|
|
220
|
-
|
|
221
|
-
Enter Caesar, Antony for the Course, Calphurnia, Portia, Decius,
|
|
222
|
-
Cicero,
|
|
223
|
-
Brutus, Cassius, Caska, a Soothsayer: after them Murellus and
|
|
224
|
-
Flauius.
|
|
225
|
-
|
|
226
|
-
Caes. Calphurnia
|
|
227
|
-
|
|
228
|
-
Cask. Peace ho, Caesar speakes
|
|
229
|
-
|
|
230
|
-
Caes. Calphurnia
|
|
231
|
-
|
|
232
|
-
Calp. Heere my Lord
|
|
233
|
-
|
|
234
|
-
Caes. Stand you directly in Antonio's way,
|
|
235
|
-
When he doth run his course. Antonio
|
|
236
|
-
|
|
237
|
-
Ant. Cæsar, my Lord
|
|
238
|
-
|
|
239
|
-
Caes. Forget not in your speed Antonio,
|
|
240
|
-
To touch Calphurnia: for our Elders say,
|
|
241
|
-
The Barren touched in this holy chace,
|
|
242
|
-
Shake off their sterrile curse
|
|
243
|
-
|
|
244
|
-
Ant. I shall remember,
|
|
245
|
-
When Caesar sayes, Do this; it is perform'd
|
|
246
|
-
|
|
247
|
-
Caes. Set on, and leaue no Ceremony out
|
|
248
|
-
|
|
249
|
-
Sooth. Caesar
|
|
250
|
-
|
|
251
|
-
Caes. Ha? Who calles?
|
|
252
|
-
Cask. Bid euery noyse be still: peace yet againe
|
|
253
|
-
|
|
254
|
-
Caes. Who is it in the presse, that calles on me?
|
|
255
|
-
I heare a Tongue shriller then all the Musicke
|
|
256
|
-
Cry, Caesar: Speake, Caesar is turn'd to heare
|
|
257
|
-
|
|
258
|
-
Sooth. Beware the Ides of March
|
|
259
|
-
|
|
260
|
-
Caes. What man is that?
|
|
261
|
-
Br. A Sooth-sayer bids you beware the Ides of March
|
|
262
|
-
Caes. Set him before me, let me see his face
|
|
263
|
-
|
|
264
|
-
Cassi. Fellow, come from the throng, look vpon Caesar
|
|
265
|
-
|
|
266
|
-
Caes. What sayst thou to me now? Speak once againe,
|
|
267
|
-
Sooth. Beware the Ides of March
|
|
268
|
-
|
|
269
|
-
Caes. He is a Dreamer, let vs leaue him: Passe.
|
|
270
|
-
|
|
271
|
-
Sennet
|
|
272
|
-
|
|
273
|
-
Exeunt. Manet Brut. & Cass.
|
|
274
|
-
|
|
275
|
-
Cassi. Will you go see the order of the course?
|
|
276
|
-
Brut. Not I
|
|
277
|
-
`;
|
|
278
|
-
const parsed = parsePlay(rawText);
|
|
279
|
-
console.log(JSON.stringify(parsed, null, 2));
|
|
280
|
-
export {};
|
|
281
|
-
//# sourceMappingURL=playparser.js.map
|