Ivan Polyakov
2 years ago
2 changed files with 77 additions and 16 deletions
@ -1,17 +1,64 @@
@@ -1,17 +1,64 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// Copyright 2022 Ivan Polyakov
|
||||
const { spawn } = require('child_process'); |
||||
const { validate } = require('schema-utils'); |
||||
|
||||
const schema = { |
||||
type: 'object', |
||||
properties: { |
||||
interpreter: { |
||||
type: 'string', |
||||
default: 'chicken-csi', |
||||
}, |
||||
flags: { |
||||
type: 'array', |
||||
default: ['-e'], |
||||
}, |
||||
expr: { |
||||
type: 'string', |
||||
default: '(import sxml-serializer)(display (serialize-sxml SXML_LOADER_CONTENT))', |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
module.exports = function(content, map, meta) { |
||||
const cb = this.async(); |
||||
const expr = `(import sxml-serializer)(display (serialize-sxml ${content}))`; |
||||
const scheme = spawn('chicken-csi', ['-e', expr]); |
||||
const options = this.getOptions(); |
||||
validate(schema, options, { |
||||
name: 'SXML Loader', |
||||
baseDataPath: 'options', |
||||
}); |
||||
|
||||
let interpreter = schema.properties.interpreter.default; |
||||
if (options.interpreter) |
||||
interpreter = options.interpreter; |
||||
|
||||
let flags = schema.properties.flags.default; |
||||
if (options.flags) |
||||
flags = options.flags; |
||||
|
||||
scheme.stdout.on('data', data => { |
||||
let expr = schema.properties.expr.default; |
||||
if (options.expr) |
||||
expr = options.expr; |
||||
expr = expr.replace('SXML_LOADER_CONTENT', content); |
||||
flags.push(expr); |
||||
|
||||
const cb = this.async(); |
||||
runScheme(interpreter, flags).then(data => { |
||||
cb(null, data, map, meta); |
||||
}).catch(err => { |
||||
console.error(err); |
||||
}); |
||||
} |
||||
|
||||
function runScheme(interpreter, flags) { |
||||
return new Promise((resolve, reject) => { |
||||
const scheme = spawn(interpreter, flags); |
||||
|
||||
scheme.stderr.on('data', data => { |
||||
console.error(data); |
||||
scheme.stdout.on('data', (data) => { |
||||
resolve(data); |
||||
}); |
||||
scheme.stderr.on('data', (data) => { |
||||
reject(data.toString()); |
||||
}); |
||||
}); |
||||
} |
||||
|
Loading…
Reference in new issue