Add XQuery Execution

This commit is contained in:
Josh Johnson 2016-01-08 12:35:50 -05:00
parent 0b4ccf8956
commit 98028898ac
5 changed files with 105 additions and 2 deletions

View File

@ -44,6 +44,10 @@
{ {
"command": "xmlTools.evaluateXPath", "command": "xmlTools.evaluateXPath",
"title": "XML Tools: Evaluate XPath" "title": "XML Tools: Evaluate XPath"
},
{
"command": "xmlTools.executeXQuery",
"title": "XML Tools: Execute XQuery"
} }
], ],
"configuration": { "configuration": {
@ -64,6 +68,16 @@
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"description": "Put each xmlns attribute on a new line when fromatting XML." "description": "Put each xmlns attribute on a new line when fromatting XML."
},
"xmlTools.xqueryExecutionEngine": {
"type": "string",
"default": "",
"description": "The full path to the execution engine executable."
},
"xmlTools.xqueryExecutionArguments": {
"type": "array",
"default": ["-xquery", "$(script)", "-in", "$(input)", "-out", "$(input).output.xml"],
"description": "Arguments to be passed to the execution engine. '$(script)' and '$(input)' refer to the XQuery script and input XML file, respectively."
} }
} }
}, },

View File

@ -6,6 +6,7 @@ import * as xpath from 'xpath';
import { RangeUtil } from './utils/RangeUtil'; import { RangeUtil } from './utils/RangeUtil';
import { XmlFormatter } from './services/XmlFormatter'; import { XmlFormatter } from './services/XmlFormatter';
import { XPathFeatureProvider } from './providers/XPath'; import { XPathFeatureProvider } from './providers/XPath';
import { XQueryExecutionProvider } from './providers/Execution';
const CFG_SECTION: string = 'xmlTools'; const CFG_SECTION: string = 'xmlTools';
const CFG_REMOVE_COMMENTS: string = 'removeCommentsOnMinify'; const CFG_REMOVE_COMMENTS: string = 'removeCommentsOnMinify';
@ -30,4 +31,8 @@ export class TextEditorCommands {
static evaluateXPath(editor: vsc.TextEditor, edit: vsc.TextEditorEdit): void { static evaluateXPath(editor: vsc.TextEditor, edit: vsc.TextEditorEdit): void {
XPathFeatureProvider.evaluateXPathAsync(editor, edit); XPathFeatureProvider.evaluateXPathAsync(editor, edit);
} }
static executeXQuery(editor: vsc.TextEditor, edit: vsc.TextEditorEdit): void {
XQueryExecutionProvider.executeXQueryAsync(editor);
}
} }

View File

@ -22,7 +22,9 @@ export function activate(ctx: vsc.ExtensionContext) {
ctx.subscriptions.push( ctx.subscriptions.push(
vsc.commands.registerTextEditorCommand('xmlTools.minifyXml', TextEditorCommands.minifyXml), vsc.commands.registerTextEditorCommand('xmlTools.minifyXml', TextEditorCommands.minifyXml),
vsc.commands.registerTextEditorCommand('xmlTools.formatXml', TextEditorCommands.formatXml), vsc.commands.registerTextEditorCommand('xmlTools.formatXml', TextEditorCommands.formatXml),
vsc.commands.registerTextEditorCommand('xmlTools.evaluateXPath', TextEditorCommands.evaluateXPath) vsc.commands.registerTextEditorCommand('xmlTools.evaluateXPath', TextEditorCommands.evaluateXPath),
vsc.commands.registerTextEditorCommand('xmlTools.executeXQuery', TextEditorCommands.executeXQuery)
); );
// register language feature providers // register language feature providers

View File

@ -0,0 +1,59 @@
'use strict';
import * as vsc from 'vscode';
import { ChildProcess } from '../services/ChildProcess';
const CFG_SECTION: string = 'xmlTools';
const CFG_XQEXEC: string = 'xqueryExecutionEngine';
const CFG_XQARGS: string = 'xqueryExecutionArguments';
export class XQueryExecutionProvider {
static async executeXQueryAsync(editor: vsc.TextEditor): Promise<void> {
if (editor.document.languageId !== 'xquery') {
vsc.window.showErrorMessage('This action can only be performed on an XQuery file.');
return;
}
let executable = vsc.workspace.getConfiguration(CFG_SECTION).get<string>(CFG_XQEXEC, null);
let args = vsc.workspace.getConfiguration(CFG_SECTION).get<string[]>(CFG_XQARGS, []);
if (!executable || executable == '') {
let action = await vsc.window.showWarningMessage('An XQuery execution engine has not been defined.', 'Define Now');
if (action == 'Define Now') {
vsc.commands.executeCommand('workbench.action.openGlobalSettings');
}
return;
}
let files: vsc.Uri[] = await vsc.workspace.findFiles('**/*.xml', '', 100);
let qpItems: any[] = new Array<any>();
files.forEach((file) => {
let filename: string = file.fsPath.replace('\\', '/');
qpItems.push({ // must implement vscode.QuickPickItem
label: filename.substring(filename.lastIndexOf('/') + 1),
description: file.fsPath,
file: file
});
});
let selection = await vsc.window.showQuickPick(qpItems, { placeHolder: 'Please select an input file.' });
if (!selection) {
return;
}
let disposable: vsc.Disposable = vsc.window.setStatusBarMessage('Executing XQuery Script...');
args = args.map<string>((value: string) => {
return value
.replace('$(script)', editor.document.uri.fsPath)
.replace('$(input)', selection.file.fsPath);
});
await ChildProcess.spawnAsync(executable, args);
disposable.dispose();
}
}

View File

@ -0,0 +1,23 @@
'use strict';
let child_process = require('child_process');
export class ChildProcess {
static async spawnAsync(executable: string, args: string[]): Promise<void> {
return new Promise<void>((resolve, reject) => {
let handle = child_process.spawn(executable, args);
handle.on('close', (code: string) => {
if (code == '0') {
resolve();
}
else {
reject(code);
}
});
});
}
}