forked from external/vscode-xml
		
	Merge pull request #233 from DotJoshJohnson/issue-131
Preserve Indent Context
This commit is contained in:
		
						commit
						7084872fc4
					
				
					 3 changed files with 41 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -29,7 +29,7 @@ export class V2XmlFormatter implements XmlFormatter {
 | 
			
		|||
 | 
			
		||||
        let output = "";
 | 
			
		||||
 | 
			
		||||
        let indentLevel = 0;
 | 
			
		||||
        let indentLevel = options.initialIndentLevel || 0;
 | 
			
		||||
        let attributeQuote = "";
 | 
			
		||||
        let lineBreakSpree = false;
 | 
			
		||||
        let lastWordCharacter: string | undefined;
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +194,7 @@ export class V2XmlFormatter implements XmlFormatter {
 | 
			
		|||
                && cc === "/"
 | 
			
		||||
                && pc !== " "
 | 
			
		||||
                && options.enforcePrettySelfClosingTagOnFormat) {
 | 
			
		||||
                    output += " /";
 | 
			
		||||
                output += " /";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // exiting StartTag or StartTag.StartTagName, entering Text
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,10 +22,43 @@ export class XmlFormattingEditProvider implements DocumentFormattingEditProvider
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult<TextEdit[]> {
 | 
			
		||||
        let xml = document.getText(range);
 | 
			
		||||
        const allXml = document.getText();
 | 
			
		||||
        let selectedXml = document.getText(range);
 | 
			
		||||
        const extFormattingOptions = XmlFormattingOptionsFactory.getXmlFormattingOptions(options, document);
 | 
			
		||||
 | 
			
		||||
        xml = this.xmlFormatter.formatXml(xml, XmlFormattingOptionsFactory.getXmlFormattingOptions(options, document));
 | 
			
		||||
        const selectionStartOffset = document.offsetAt(range.start);
 | 
			
		||||
        let tabCount = 0;
 | 
			
		||||
        let spaceCount = 0;
 | 
			
		||||
 | 
			
		||||
        return [ TextEdit.replace(range, xml) ];
 | 
			
		||||
        for (let i = (selectionStartOffset - 1); i >= 0; i--) {
 | 
			
		||||
            const cc = allXml.charAt(i);
 | 
			
		||||
 | 
			
		||||
            if (/\t/.test(cc)) {
 | 
			
		||||
                tabCount++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            else if (/ /.test(cc)) {
 | 
			
		||||
                spaceCount++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            else {
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (options.insertSpaces) {
 | 
			
		||||
            extFormattingOptions.initialIndentLevel = Math.ceil(spaceCount / (options.tabSize || 1));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        else {
 | 
			
		||||
            extFormattingOptions.initialIndentLevel = tabCount;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        selectedXml = this.xmlFormatter.formatXml(selectedXml, extFormattingOptions);
 | 
			
		||||
 | 
			
		||||
        // we need to remove the leading whitespace because the formatter will add an indent before the first element
 | 
			
		||||
        selectedXml = selectedXml.replace(/^\s+/, "");
 | 
			
		||||
 | 
			
		||||
        return [TextEdit.replace(range, selectedXml)];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ export interface XmlFormattingOptions {
 | 
			
		|||
    removeCommentsOnMinify: boolean;
 | 
			
		||||
    splitAttributesOnFormat: boolean;
 | 
			
		||||
    splitXmlnsOnFormat: boolean;
 | 
			
		||||
    initialIndentLevel?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class XmlFormattingOptionsFactory {
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +21,8 @@ export class XmlFormattingOptionsFactory {
 | 
			
		|||
            newLine: (document.eol === EndOfLine.CRLF) ? "\r\n" : "\n",
 | 
			
		||||
            removeCommentsOnMinify: Configuration.removeCommentsOnMinify(document.uri),
 | 
			
		||||
            splitAttributesOnFormat: Configuration.splitAttributesOnFormat(document.uri),
 | 
			
		||||
            splitXmlnsOnFormat: Configuration.splitXmlnsOnFormat(document.uri)
 | 
			
		||||
            splitXmlnsOnFormat: Configuration.splitXmlnsOnFormat(document.uri),
 | 
			
		||||
            initialIndentLevel: 0
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue