farmcontrol-ui/public/gcode-worker.js

85 lines
2.4 KiB
JavaScript

// gcode-worker.js
self.onmessage = function (event) {
const { configString } = event.data
const configObject = {}
let isThumbnailSection = false
let base64ImageData = ''
const lines = configString.split('\n')
const totalLines = lines.length
for (let i = 0; i < totalLines; i++) {
const line = lines[i]
let trimmedLine = line.trim()
// Skip empty lines or lines that are not part of the config
if (!trimmedLine || !trimmedLine.startsWith(';')) {
continue
}
// Remove the leading semicolon and trim the line
trimmedLine = trimmedLine.substring(1).trim()
// Handle thumbnail section
if (trimmedLine.startsWith('thumbnail begin')) {
isThumbnailSection = true
base64ImageData = '' // Reset image data
continue
} else if (trimmedLine.startsWith('thumbnail end')) {
isThumbnailSection = false
configObject.thumbnail = base64ImageData // Store base64 string as-is
continue
}
if (isThumbnailSection) {
base64ImageData += trimmedLine // Accumulate base64 data
continue
}
// Split the line into key and value parts
let [key, ...valueParts] = trimmedLine.split('=').map((part) => part.trim())
if (!key || !valueParts.length) {
continue
}
if (
key === 'end_gcode' ||
key === 'start_gcode' ||
key === 'start_filament_gcode' ||
key === 'end_filament_gcode'
) {
continue
}
const value = valueParts.join('=').trim()
// Handle multi-line values (assuming they start and end with curly braces)
if (value.startsWith('{')) {
let multiLineValue = value
while (!multiLineValue.endsWith('}')) {
// Read the next line
const nextLine = lines[++i].trim()
multiLineValue += '\n' + nextLine
}
// Remove the starting and ending braces
configObject[key.replace(/\s+/g, '_').replace('(', '').replace(')', '')] =
multiLineValue.substring(1, multiLineValue.length - 1).trim()
} else {
key = key.replace('[', '').replace(']', '')
key = key.replace('(', '').replace(')', '')
// Regular key-value pair
configObject[key.replace(/\s+/g, '_')] = value
.replace('"', '')
.replace('"', '')
}
// Report progress
const progress = ((i + 1) / totalLines) * 100
self.postMessage({ type: 'progress', progress })
}
// Post the result back to the main thread
self.postMessage({ type: 'result', configObject })
}