vscode-xml/src/formatting/xml-formatting-edit-provider.ts
2018-01-27 20:30:03 -05:00

66 lines
2.8 KiB
TypeScript

import { commands, languages } from "vscode";
import {
CancellationToken, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, ExtensionContext,
FormattingOptions, ProviderResult, Range, TextDocument, TextEdit, TextEditor, WorkspaceConfiguration
} from "vscode";
import * as extension from "../extension";
import { XmlFormatter } from "./xml-formatter";
import { ClassicXmlFormatter } from "./formatters/classic-xml-formatter";
extension.onActivate((context: ExtensionContext, config: WorkspaceConfiguration) => {
const xmlFormatterImplementationSetting = config.get<string>("xmlFormatterImplementation");
let xmlFormatterImplementation: XmlFormatter;
switch (xmlFormatterImplementationSetting) {
case "classic":
default: xmlFormatterImplementation = new ClassicXmlFormatter(); break;
}
// tslint:disable-next-line:no-use-before-declare
const xmlFormattingEditProvider = new XmlFormattingEditProvider(config, xmlFormatterImplementation);
const formatAsXmlCommand = commands.registerTextEditorCommand("xmlTools.formatAsXml", (textEditor) => {
// TODO: implement command
});
const minifyXmlCommand = commands.registerTextEditorCommand("xmlTools.minifyXml", (textEditor: TextEditor) => {
// TODO: implement command
});
context.subscriptions.push(
formatAsXmlCommand,
minifyXmlCommand,
languages.registerDocumentFormattingEditProvider("xml", xmlFormattingEditProvider),
languages.registerDocumentRangeFormattingEditProvider("xml", xmlFormattingEditProvider)
);
});
export class XmlFormattingEditProvider implements DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider {
constructor(
public workspaceConfiguration: WorkspaceConfiguration,
public xmlFormatter: XmlFormatter
) { }
provideDocumentFormattingEdits(document: TextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult<TextEdit[]> {
const lastLine = document.lineAt(document.lineCount - 1);
const documentRange = new Range(document.positionAt(0), lastLine.range.end);
return this.provideDocumentRangeFormattingEdits(document, documentRange, options, token);
}
provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult<TextEdit[]> {
let xml = document.getText(range);
xml = this.xmlFormatter.formatXml(xml, {
editorOptions: options,
newLine: document.eol.toString(),
removeCommentsOnMinify: this.workspaceConfiguration.get<boolean>("removeCommentsOnMinify"),
splitXmlnsOnFormat: this.workspaceConfiguration.get<boolean>("splitXmlnsOnFormat")
});
return [ TextEdit.replace(range, xml) ];
}
}