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