hledger-lsp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +632 -0
- package/out/extension.d.ts +1 -0
- package/out/extension.d.ts.map +1 -0
- package/out/extension.js +2 -0
- package/out/extension.js.map +1 -0
- package/out/features/codeActions.d.ts +73 -0
- package/out/features/codeActions.d.ts.map +1 -0
- package/out/features/codeActions.js +417 -0
- package/out/features/codeActions.js.map +1 -0
- package/out/features/completion.d.ts +94 -0
- package/out/features/completion.d.ts.map +1 -0
- package/out/features/completion.js +323 -0
- package/out/features/completion.js.map +1 -0
- package/out/features/definition.d.ts +12 -0
- package/out/features/definition.d.ts.map +1 -0
- package/out/features/definition.js +61 -0
- package/out/features/definition.js.map +1 -0
- package/out/features/documentLinks.d.ts +17 -0
- package/out/features/documentLinks.d.ts.map +1 -0
- package/out/features/documentLinks.js +68 -0
- package/out/features/documentLinks.js.map +1 -0
- package/out/features/findReferences.d.ts +33 -0
- package/out/features/findReferences.d.ts.map +1 -0
- package/out/features/findReferences.js +79 -0
- package/out/features/findReferences.js.map +1 -0
- package/out/features/foldingRanges.d.ts +27 -0
- package/out/features/foldingRanges.d.ts.map +1 -0
- package/out/features/foldingRanges.js +111 -0
- package/out/features/foldingRanges.js.map +1 -0
- package/out/features/formatter.d.ts +70 -0
- package/out/features/formatter.d.ts.map +1 -0
- package/out/features/formatter.js +373 -0
- package/out/features/formatter.js.map +1 -0
- package/out/features/hover.d.ts +66 -0
- package/out/features/hover.d.ts.map +1 -0
- package/out/features/hover.js +387 -0
- package/out/features/hover.js.map +1 -0
- package/out/features/inlayHints.d.ts +43 -0
- package/out/features/inlayHints.d.ts.map +1 -0
- package/out/features/inlayHints.js +221 -0
- package/out/features/inlayHints.js.map +1 -0
- package/out/features/selectionRange.d.ts +47 -0
- package/out/features/selectionRange.d.ts.map +1 -0
- package/out/features/selectionRange.js +273 -0
- package/out/features/selectionRange.js.map +1 -0
- package/out/features/semanticTokens.d.ts +83 -0
- package/out/features/semanticTokens.d.ts.map +1 -0
- package/out/features/semanticTokens.js +370 -0
- package/out/features/semanticTokens.js.map +1 -0
- package/out/features/symbols.d.ts +47 -0
- package/out/features/symbols.d.ts.map +1 -0
- package/out/features/symbols.js +249 -0
- package/out/features/symbols.js.map +1 -0
- package/out/features/transactionAnalyzer.d.ts +63 -0
- package/out/features/transactionAnalyzer.d.ts.map +1 -0
- package/out/features/transactionAnalyzer.js +127 -0
- package/out/features/transactionAnalyzer.js.map +1 -0
- package/out/features/validator.d.ts +142 -0
- package/out/features/validator.d.ts.map +1 -0
- package/out/features/validator.js +633 -0
- package/out/features/validator.js.map +1 -0
- package/out/parser/ast.d.ts +37 -0
- package/out/parser/ast.d.ts.map +1 -0
- package/out/parser/ast.js +606 -0
- package/out/parser/ast.js.map +1 -0
- package/out/parser/includes.d.ts +25 -0
- package/out/parser/includes.d.ts.map +1 -0
- package/out/parser/includes.js +106 -0
- package/out/parser/includes.js.map +1 -0
- package/out/parser/index.d.ts +54 -0
- package/out/parser/index.d.ts.map +1 -0
- package/out/parser/index.js +146 -0
- package/out/parser/index.js.map +1 -0
- package/out/server/deps.d.ts +19 -0
- package/out/server/deps.d.ts.map +1 -0
- package/out/server/deps.js +77 -0
- package/out/server/deps.js.map +1 -0
- package/out/server/settings.d.ts +60 -0
- package/out/server/settings.d.ts.map +1 -0
- package/out/server/settings.js +110 -0
- package/out/server/settings.js.map +1 -0
- package/out/server.d.ts +3 -0
- package/out/server.d.ts.map +1 -0
- package/out/server.js +420 -0
- package/out/server.js.map +1 -0
- package/out/types.d.ts +84 -0
- package/out/types.d.ts.map +1 -0
- package/out/types.js +6 -0
- package/out/types.js.map +1 -0
- package/out/utils/index.d.ts +38 -0
- package/out/utils/index.d.ts.map +1 -0
- package/out/utils/index.js +89 -0
- package/out/utils/index.js.map +1 -0
- package/out/utils/uri.d.ts +32 -0
- package/out/utils/uri.d.ts.map +1 -0
- package/out/utils/uri.js +215 -0
- package/out/utils/uri.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Folding ranges provider for hledger journal files
|
|
3
|
+
*
|
|
4
|
+
* Allows collapsing:
|
|
5
|
+
* - Transactions (collapse all postings)
|
|
6
|
+
* - Multi-line comment blocks
|
|
7
|
+
*/
|
|
8
|
+
import { FoldingRange } from 'vscode-languageserver/node';
|
|
9
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
10
|
+
import { ParsedDocument } from '../types';
|
|
11
|
+
export declare class FoldingRangesProvider {
|
|
12
|
+
/**
|
|
13
|
+
* Provide folding ranges for a document
|
|
14
|
+
*/
|
|
15
|
+
provideFoldingRanges(document: TextDocument, parsedDoc: ParsedDocument): FoldingRange[];
|
|
16
|
+
/**
|
|
17
|
+
* Get folding ranges for transactions
|
|
18
|
+
* Transactions can be folded to hide their postings
|
|
19
|
+
*/
|
|
20
|
+
private getTransactionFoldingRanges;
|
|
21
|
+
/**
|
|
22
|
+
* Get folding ranges for multi-line comment blocks
|
|
23
|
+
*/
|
|
24
|
+
private getCommentFoldingRanges;
|
|
25
|
+
}
|
|
26
|
+
export declare const foldingRangesProvider: FoldingRangesProvider;
|
|
27
|
+
//# sourceMappingURL=foldingRanges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foldingRanges.d.ts","sourceRoot":"","sources":["../../src/features/foldingRanges.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAoB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,qBAAa,qBAAqB;IAChC;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,GAAG,YAAY,EAAE;IAavF;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IA4CnC;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAwChC;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Folding ranges provider for hledger journal files
|
|
4
|
+
*
|
|
5
|
+
* Allows collapsing:
|
|
6
|
+
* - Transactions (collapse all postings)
|
|
7
|
+
* - Multi-line comment blocks
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.foldingRangesProvider = exports.FoldingRangesProvider = void 0;
|
|
11
|
+
const node_1 = require("vscode-languageserver/node");
|
|
12
|
+
const index_1 = require("../utils/index");
|
|
13
|
+
class FoldingRangesProvider {
|
|
14
|
+
/**
|
|
15
|
+
* Provide folding ranges for a document
|
|
16
|
+
*/
|
|
17
|
+
provideFoldingRanges(document, parsedDoc) {
|
|
18
|
+
const foldingRanges = [];
|
|
19
|
+
const lines = document.getText().split('\n');
|
|
20
|
+
// Add folding ranges for transactions
|
|
21
|
+
foldingRanges.push(...this.getTransactionFoldingRanges(lines, parsedDoc));
|
|
22
|
+
// Add folding ranges for comment blocks
|
|
23
|
+
foldingRanges.push(...this.getCommentFoldingRanges(lines));
|
|
24
|
+
return foldingRanges;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get folding ranges for transactions
|
|
28
|
+
* Transactions can be folded to hide their postings
|
|
29
|
+
*/
|
|
30
|
+
getTransactionFoldingRanges(lines, parsedDoc) {
|
|
31
|
+
const ranges = [];
|
|
32
|
+
for (const transaction of parsedDoc.transactions) {
|
|
33
|
+
if (transaction.line === undefined)
|
|
34
|
+
continue;
|
|
35
|
+
// Find the last posting line for this transaction
|
|
36
|
+
const startLine = transaction.line;
|
|
37
|
+
let endLine = startLine;
|
|
38
|
+
// Find where the transaction ends (last posting or comment)
|
|
39
|
+
let foundPostings = false;
|
|
40
|
+
for (let i = startLine + 1; i < lines.length; i++) {
|
|
41
|
+
const line = lines[i];
|
|
42
|
+
const trimmed = line.trim();
|
|
43
|
+
// Empty line marks end of transaction
|
|
44
|
+
if (!trimmed) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
// If it's a posting or transaction-level comment, extend the range
|
|
48
|
+
if ((0, index_1.isPosting)(line) || (trimmed.startsWith(';') || trimmed.startsWith('#'))) {
|
|
49
|
+
endLine = i;
|
|
50
|
+
foundPostings = true;
|
|
51
|
+
}
|
|
52
|
+
else if ((0, index_1.isTransactionHeader)(trimmed)) {
|
|
53
|
+
// Hit the next transaction, stop here
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Only create folding range if there are postings to fold
|
|
58
|
+
if (foundPostings && endLine > startLine) {
|
|
59
|
+
ranges.push({
|
|
60
|
+
startLine: startLine,
|
|
61
|
+
endLine: endLine,
|
|
62
|
+
kind: node_1.FoldingRangeKind.Region
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return ranges;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get folding ranges for multi-line comment blocks
|
|
70
|
+
*/
|
|
71
|
+
getCommentFoldingRanges(lines) {
|
|
72
|
+
const ranges = [];
|
|
73
|
+
let commentBlockStart = null;
|
|
74
|
+
for (let i = 0; i < lines.length; i++) {
|
|
75
|
+
const line = lines[i];
|
|
76
|
+
const trimmed = line.trim();
|
|
77
|
+
if ((0, index_1.isComment)(trimmed)) {
|
|
78
|
+
// Start a new comment block if not already in one
|
|
79
|
+
if (commentBlockStart === null) {
|
|
80
|
+
commentBlockStart = i;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// End the comment block if we were in one
|
|
85
|
+
if (commentBlockStart !== null) {
|
|
86
|
+
// Only create folding range if block has multiple lines
|
|
87
|
+
if (i - commentBlockStart > 1) {
|
|
88
|
+
ranges.push({
|
|
89
|
+
startLine: commentBlockStart,
|
|
90
|
+
endLine: i - 1,
|
|
91
|
+
kind: node_1.FoldingRangeKind.Comment
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
commentBlockStart = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Handle comment block that extends to end of file
|
|
99
|
+
if (commentBlockStart !== null && lines.length - commentBlockStart > 1) {
|
|
100
|
+
ranges.push({
|
|
101
|
+
startLine: commentBlockStart,
|
|
102
|
+
endLine: lines.length - 1,
|
|
103
|
+
kind: node_1.FoldingRangeKind.Comment
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return ranges;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.FoldingRangesProvider = FoldingRangesProvider;
|
|
110
|
+
exports.foldingRangesProvider = new FoldingRangesProvider();
|
|
111
|
+
//# sourceMappingURL=foldingRanges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foldingRanges.js","sourceRoot":"","sources":["../../src/features/foldingRanges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting provider for hledger journal files
|
|
3
|
+
*/
|
|
4
|
+
import { TextEdit, Range, Position, FormattingOptions as LSPFormattingOptions } from 'vscode-languageserver';
|
|
5
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
6
|
+
import { ParsedDocument } from '../types';
|
|
7
|
+
export interface FormattingOptions {
|
|
8
|
+
/** Number of spaces for posting indentation (default: 4) */
|
|
9
|
+
indentation?: number;
|
|
10
|
+
/** Maximum width for account names (default: 42) */
|
|
11
|
+
maxAccountWidth?: number;
|
|
12
|
+
/** Maximum width for commodity symbols (default: 4) */
|
|
13
|
+
maxCommodityWidth?: number;
|
|
14
|
+
/** Maximum width for amount numbers (default: 12) */
|
|
15
|
+
maxAmountWidth?: number;
|
|
16
|
+
/** Minimum spaces between account and amount (default: 2) */
|
|
17
|
+
minSpacing?: number;
|
|
18
|
+
/** Target column for decimal alignment (default: 52) */
|
|
19
|
+
decimalAlignColumn?: number;
|
|
20
|
+
/** Target column for assertion decimal alignment (default: 70) */
|
|
21
|
+
assertionDecimalAlignColumn?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class FormattingProvider {
|
|
24
|
+
/**
|
|
25
|
+
* Format an entire document
|
|
26
|
+
*/
|
|
27
|
+
formatDocument(document: TextDocument, parsed: ParsedDocument, _lspOptions: LSPFormattingOptions, userOptions?: Partial<FormattingOptions>): TextEdit[];
|
|
28
|
+
/**
|
|
29
|
+
* Format a range of lines
|
|
30
|
+
*/
|
|
31
|
+
formatRange(document: TextDocument, _range: Range, parsed: ParsedDocument, _lspOptions: LSPFormattingOptions, userOptions?: Partial<FormattingOptions>): TextEdit[];
|
|
32
|
+
/**
|
|
33
|
+
* Format on type (after pressing Enter)
|
|
34
|
+
*/
|
|
35
|
+
formatOnType(document: TextDocument, _position: Position, ch: string, parsed: ParsedDocument, _lspOptions: LSPFormattingOptions, userOptions?: Partial<FormattingOptions>): TextEdit[];
|
|
36
|
+
/**
|
|
37
|
+
* Format a transaction header
|
|
38
|
+
*/
|
|
39
|
+
private formatTransactionHeader;
|
|
40
|
+
/**
|
|
41
|
+
* Format a directive
|
|
42
|
+
*/
|
|
43
|
+
private formatDirective;
|
|
44
|
+
/**
|
|
45
|
+
* Parse a posting into its layout components
|
|
46
|
+
*/
|
|
47
|
+
private parsePostingLayout;
|
|
48
|
+
/**
|
|
49
|
+
* Parse an amount into its components for column alignment
|
|
50
|
+
*/
|
|
51
|
+
private parseAmount;
|
|
52
|
+
/**
|
|
53
|
+
* Parse a cost into its components for formatting
|
|
54
|
+
*/
|
|
55
|
+
private parseCost;
|
|
56
|
+
/**
|
|
57
|
+
* Format all postings in a transaction with column alignment
|
|
58
|
+
*/
|
|
59
|
+
private formatTransactionPostings;
|
|
60
|
+
/**
|
|
61
|
+
* Get the number of decimal places in a number
|
|
62
|
+
*/
|
|
63
|
+
private getDecimalPlaces;
|
|
64
|
+
/**
|
|
65
|
+
* Find the commodity format from parsed document
|
|
66
|
+
*/
|
|
67
|
+
private findCommodity;
|
|
68
|
+
}
|
|
69
|
+
export declare const formattingProvider: FormattingProvider;
|
|
70
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/features/formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAU,cAAc,EAAsB,MAAM,UAAU,CAAC;AAItE,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AA4CD,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,cAAc,CACZ,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,oBAAoB,EACjC,WAAW,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAC3C,QAAQ,EAAE;IAuFb;;OAEG;IACH,WAAW,CACT,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,oBAAoB,EACjC,WAAW,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAC3C,QAAQ,EAAE;IAMb;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,QAAQ,EACnB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,oBAAoB,EACjC,WAAW,GAAE,OAAO,CAAC,iBAAiB,CAAM,GAC3C,QAAQ,EAAE;IAUb;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiC1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAgDnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAYjB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkIjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,CAAC,aAAa;CAGtB;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Formatting provider for hledger journal files
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formattingProvider = exports.FormattingProvider = void 0;
|
|
7
|
+
const ast_1 = require("../parser/ast");
|
|
8
|
+
const index_1 = require("../utils/index");
|
|
9
|
+
const DEFAULT_OPTIONS = {
|
|
10
|
+
indentation: 4,
|
|
11
|
+
maxAccountWidth: 42,
|
|
12
|
+
maxCommodityWidth: 4,
|
|
13
|
+
maxAmountWidth: 12,
|
|
14
|
+
minSpacing: 2,
|
|
15
|
+
decimalAlignColumn: 52,
|
|
16
|
+
assertionDecimalAlignColumn: 70
|
|
17
|
+
};
|
|
18
|
+
class FormattingProvider {
|
|
19
|
+
/**
|
|
20
|
+
* Format an entire document
|
|
21
|
+
*/
|
|
22
|
+
formatDocument(document, parsed, _lspOptions, userOptions = {}) {
|
|
23
|
+
const options = { ...DEFAULT_OPTIONS, ...userOptions };
|
|
24
|
+
const text = document.getText();
|
|
25
|
+
const lines = text.split('\n');
|
|
26
|
+
// Format line by line, tracking transactions
|
|
27
|
+
const formattedLines = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
while (i < lines.length) {
|
|
30
|
+
const line = lines[i];
|
|
31
|
+
const trimmed = line.trim();
|
|
32
|
+
if ((0, index_1.isTransactionHeader)(trimmed)) {
|
|
33
|
+
// Format the transaction header
|
|
34
|
+
formattedLines.push(this.formatTransactionHeader(trimmed));
|
|
35
|
+
// Find the corresponding transaction in the parsed document
|
|
36
|
+
// to get inferred costs and other parsing results
|
|
37
|
+
const transaction = parsed.transactions.find(t => t.line === i);
|
|
38
|
+
// Collect and format all postings in this transaction
|
|
39
|
+
const postingLayouts = [];
|
|
40
|
+
i++;
|
|
41
|
+
while (i < lines.length) {
|
|
42
|
+
const postingLine = lines[i];
|
|
43
|
+
const postingTrimmed = postingLine.trim();
|
|
44
|
+
// Stop at empty line, next transaction, or directive
|
|
45
|
+
if (!postingTrimmed || (0, index_1.isTransactionHeader)(postingTrimmed) || (0, index_1.isDirective)(postingTrimmed)) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
if ((0, index_1.isComment)(postingTrimmed)) {
|
|
49
|
+
// Preserve comments between postings as-is
|
|
50
|
+
formattedLines.push(postingTrimmed);
|
|
51
|
+
}
|
|
52
|
+
else if ((0, index_1.isPosting)(postingLine)) { // Check with original line, not trimmed
|
|
53
|
+
// Use the parsed transaction's postings if available (includes inferred costs)
|
|
54
|
+
if (transaction && postingLayouts.length < transaction.postings.length) {
|
|
55
|
+
const posting = transaction.postings[postingLayouts.length];
|
|
56
|
+
const layout = this.parsePostingLayout(posting, parsed, options);
|
|
57
|
+
postingLayouts.push(layout);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Fallback to parsing from text if transaction not found
|
|
61
|
+
const posting = (0, ast_1.parsePosting)(postingLine);
|
|
62
|
+
if (posting) {
|
|
63
|
+
const layout = this.parsePostingLayout(posting, parsed, options);
|
|
64
|
+
postingLayouts.push(layout);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
i++;
|
|
69
|
+
}
|
|
70
|
+
// Format all postings in the transaction together for alignment
|
|
71
|
+
const formattedPostings = this.formatTransactionPostings(postingLayouts, options);
|
|
72
|
+
formattedLines.push(...formattedPostings);
|
|
73
|
+
// Don't increment i here as we've already moved past the transaction
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
else if ((0, index_1.isDirective)(trimmed)) {
|
|
77
|
+
formattedLines.push(this.formatDirective(trimmed));
|
|
78
|
+
}
|
|
79
|
+
else if (trimmed === '') {
|
|
80
|
+
formattedLines.push('');
|
|
81
|
+
}
|
|
82
|
+
else if ((0, index_1.isComment)(trimmed)) {
|
|
83
|
+
formattedLines.push(trimmed);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Unknown line type, preserve as-is
|
|
87
|
+
formattedLines.push(line.trimEnd());
|
|
88
|
+
}
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
const formattedText = formattedLines.join('\n');
|
|
92
|
+
return [{
|
|
93
|
+
range: {
|
|
94
|
+
start: { line: 0, character: 0 },
|
|
95
|
+
end: { line: lines.length, character: 0 }
|
|
96
|
+
},
|
|
97
|
+
newText: formattedText
|
|
98
|
+
}];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format a range of lines
|
|
102
|
+
*/
|
|
103
|
+
formatRange(document, _range, parsed, _lspOptions, userOptions = {}) {
|
|
104
|
+
// For range formatting, we format the entire document and then extract the range
|
|
105
|
+
// This ensures consistency when formatting partial selections
|
|
106
|
+
return this.formatDocument(document, parsed, _lspOptions, userOptions);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Format on type (after pressing Enter)
|
|
110
|
+
*/
|
|
111
|
+
formatOnType(document, _position, ch, parsed, _lspOptions, userOptions = {}) {
|
|
112
|
+
// Only format on newline
|
|
113
|
+
if (ch !== '\n') {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
// Format the entire document to maintain alignment
|
|
117
|
+
return this.formatDocument(document, parsed, _lspOptions, userOptions);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Format a transaction header
|
|
121
|
+
*/
|
|
122
|
+
formatTransactionHeader(line) {
|
|
123
|
+
const header = (0, ast_1.parseTransactionHeader)(line);
|
|
124
|
+
if (!header) {
|
|
125
|
+
return line.trimEnd();
|
|
126
|
+
}
|
|
127
|
+
let result = header.date;
|
|
128
|
+
if (header.effectiveDate) {
|
|
129
|
+
result += '=' + header.effectiveDate;
|
|
130
|
+
}
|
|
131
|
+
if (header.status === 'cleared') {
|
|
132
|
+
result += ' *';
|
|
133
|
+
}
|
|
134
|
+
else if (header.status === 'pending') {
|
|
135
|
+
result += ' !';
|
|
136
|
+
}
|
|
137
|
+
if (header.code) {
|
|
138
|
+
result += ' (' + header.code + ')';
|
|
139
|
+
}
|
|
140
|
+
if (header.description) {
|
|
141
|
+
result += ' ' + header.description;
|
|
142
|
+
}
|
|
143
|
+
if (header.comment) {
|
|
144
|
+
result += ' ;' + header.comment;
|
|
145
|
+
}
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Format a directive
|
|
150
|
+
*/
|
|
151
|
+
formatDirective(line) {
|
|
152
|
+
const trimmed = line.trim();
|
|
153
|
+
// Extract comment if present
|
|
154
|
+
const commentMatch = trimmed.match(/^([^;]*);(.*)$/);
|
|
155
|
+
const mainPart = commentMatch ? commentMatch[1].trim() : trimmed;
|
|
156
|
+
const comment = commentMatch ? commentMatch[2].trim() : undefined;
|
|
157
|
+
// Normalize spacing in the directive
|
|
158
|
+
const parts = mainPart.split(/\s+/);
|
|
159
|
+
let result = parts.join(' ');
|
|
160
|
+
if (comment) {
|
|
161
|
+
result += ' ;' + comment;
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Parse a posting into its layout components
|
|
167
|
+
*/
|
|
168
|
+
parsePostingLayout(posting, parsed, options) {
|
|
169
|
+
const indent = ' '.repeat(options.indentation);
|
|
170
|
+
const account = posting.account;
|
|
171
|
+
const parsedAmount = posting.amount
|
|
172
|
+
? this.parseAmount(posting.amount, parsed)
|
|
173
|
+
: null;
|
|
174
|
+
const parsedCost = posting.cost
|
|
175
|
+
? this.parseCost(posting.cost, parsed)
|
|
176
|
+
: null;
|
|
177
|
+
const parsedAssertion = posting.assertion
|
|
178
|
+
? this.parseAmount(posting.assertion, parsed)
|
|
179
|
+
: null;
|
|
180
|
+
const comment = posting.comment || '';
|
|
181
|
+
return {
|
|
182
|
+
posting,
|
|
183
|
+
indent,
|
|
184
|
+
account,
|
|
185
|
+
parsedAmount,
|
|
186
|
+
parsedCost,
|
|
187
|
+
parsedAssertion,
|
|
188
|
+
comment
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Parse an amount into its components for column alignment
|
|
193
|
+
*/
|
|
194
|
+
parseAmount(amount, parsed) {
|
|
195
|
+
const commodity = this.findCommodity(amount.commodity, parsed);
|
|
196
|
+
const absQuantity = Math.abs(amount.quantity);
|
|
197
|
+
const isNegative = amount.quantity < 0;
|
|
198
|
+
// Determine precision
|
|
199
|
+
const actualPrecision = this.getDecimalPlaces(amount.quantity);
|
|
200
|
+
const usePrecision = commodity?.format?.precision !== null && commodity?.format?.precision !== undefined
|
|
201
|
+
? Math.max(actualPrecision, commodity.format.precision)
|
|
202
|
+
: actualPrecision;
|
|
203
|
+
// Format the number
|
|
204
|
+
const formattedNumber = absQuantity.toFixed(usePrecision);
|
|
205
|
+
const decimalPos = formattedNumber.indexOf('.');
|
|
206
|
+
const decimalPosition = decimalPos >= 0 ? decimalPos : formattedNumber.length;
|
|
207
|
+
// Build amount string with negative sign
|
|
208
|
+
const amountNumber = (isNegative ? '-' : '') + formattedNumber;
|
|
209
|
+
// Determine commodity placement
|
|
210
|
+
const commoditySymbol = commodity?.format?.symbol || amount.commodity || '';
|
|
211
|
+
let commodityBefore = '';
|
|
212
|
+
let commodityAfter = '';
|
|
213
|
+
if (commodity?.format) {
|
|
214
|
+
if (commodity.format.symbolOnLeft) {
|
|
215
|
+
commodityBefore = commoditySymbol;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
commodityAfter = commoditySymbol;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (commoditySymbol) {
|
|
222
|
+
// Default heuristic: currencies go on left
|
|
223
|
+
const leftSymbols = ['$', '€', '£', '¥'];
|
|
224
|
+
if (leftSymbols.includes(commoditySymbol)) {
|
|
225
|
+
commodityBefore = commoditySymbol;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
commodityAfter = commoditySymbol;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
commodityBefore,
|
|
233
|
+
amountNumber,
|
|
234
|
+
commodityAfter,
|
|
235
|
+
decimalPosition: isNegative ? decimalPosition + 1 : decimalPosition // Adjust for minus sign
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Parse a cost into its components for formatting
|
|
240
|
+
*/
|
|
241
|
+
parseCost(cost, parsed) {
|
|
242
|
+
const parsedAmount = this.parseAmount(cost.amount, parsed);
|
|
243
|
+
return {
|
|
244
|
+
type: cost.type,
|
|
245
|
+
commodityBefore: parsedAmount.commodityBefore,
|
|
246
|
+
amountNumber: parsedAmount.amountNumber,
|
|
247
|
+
commodityAfter: parsedAmount.commodityAfter,
|
|
248
|
+
decimalPosition: parsedAmount.decimalPosition
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Format all postings in a transaction with column alignment
|
|
253
|
+
*/
|
|
254
|
+
formatTransactionPostings(layouts, options) {
|
|
255
|
+
if (layouts.length === 0) {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
// Calculate column widths for this transaction
|
|
259
|
+
let maxAccountLen = 0;
|
|
260
|
+
let maxCommodityBeforeLen = 0;
|
|
261
|
+
let maxCommodityAfterLen = 0;
|
|
262
|
+
let maxAssertionCommodityBeforeLen = 0;
|
|
263
|
+
let maxAssertionCommodityAfterLen = 0;
|
|
264
|
+
for (const layout of layouts) {
|
|
265
|
+
maxAccountLen = Math.max(maxAccountLen, layout.account.length);
|
|
266
|
+
if (layout.parsedAmount) {
|
|
267
|
+
maxCommodityBeforeLen = Math.max(maxCommodityBeforeLen, layout.parsedAmount.commodityBefore.length);
|
|
268
|
+
maxCommodityAfterLen = Math.max(maxCommodityAfterLen, layout.parsedAmount.commodityAfter.length);
|
|
269
|
+
}
|
|
270
|
+
if (layout.parsedAssertion) {
|
|
271
|
+
maxAssertionCommodityBeforeLen = Math.max(maxAssertionCommodityBeforeLen, layout.parsedAssertion.commodityBefore.length);
|
|
272
|
+
maxAssertionCommodityAfterLen = Math.max(maxAssertionCommodityAfterLen, layout.parsedAssertion.commodityAfter.length);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Apply maximum constraints
|
|
276
|
+
maxAccountLen = Math.min(maxAccountLen, options.maxAccountWidth);
|
|
277
|
+
maxCommodityBeforeLen = Math.min(maxCommodityBeforeLen, options.maxCommodityWidth);
|
|
278
|
+
maxCommodityAfterLen = Math.min(maxCommodityAfterLen, options.maxCommodityWidth);
|
|
279
|
+
maxAssertionCommodityBeforeLen = Math.min(maxAssertionCommodityBeforeLen, options.maxCommodityWidth);
|
|
280
|
+
maxAssertionCommodityAfterLen = Math.min(maxAssertionCommodityAfterLen, options.maxCommodityWidth);
|
|
281
|
+
// Format each posting
|
|
282
|
+
return layouts.map(layout => {
|
|
283
|
+
let result = layout.indent + layout.account;
|
|
284
|
+
// If no amount, just return account with comment if any
|
|
285
|
+
if (!layout.parsedAmount) {
|
|
286
|
+
if (layout.comment) {
|
|
287
|
+
result += ' ;' + layout.comment;
|
|
288
|
+
}
|
|
289
|
+
return result;
|
|
290
|
+
}
|
|
291
|
+
// Calculate spacing to reach decimal align column
|
|
292
|
+
const accountEnd = layout.indent.length + layout.account.length;
|
|
293
|
+
// Target position for the decimal point
|
|
294
|
+
let decimalTargetCol = options.decimalAlignColumn;
|
|
295
|
+
// Calculate where amount needs to start to align decimal at target
|
|
296
|
+
const amountStartCol = decimalTargetCol - layout.parsedAmount.decimalPosition;
|
|
297
|
+
// Calculate where commodity-before needs to start (right-aligned before amount)
|
|
298
|
+
const commodityBeforeStartCol = amountStartCol - (layout.parsedAmount.commodityBefore.length > 0 ? layout.parsedAmount.commodityBefore.length : 0);
|
|
299
|
+
// Calculate spacing needed after account
|
|
300
|
+
let spacingAfterAccount = commodityBeforeStartCol - accountEnd;
|
|
301
|
+
// Ensure minimum spacing
|
|
302
|
+
if (spacingAfterAccount < options.minSpacing) {
|
|
303
|
+
spacingAfterAccount = options.minSpacing;
|
|
304
|
+
}
|
|
305
|
+
// Add spacing
|
|
306
|
+
result += ' '.repeat(spacingAfterAccount);
|
|
307
|
+
// Add commodity-before (right-aligned in its column)
|
|
308
|
+
if (layout.parsedAmount.commodityBefore) {
|
|
309
|
+
result += layout.parsedAmount.commodityBefore;
|
|
310
|
+
}
|
|
311
|
+
// Add amount
|
|
312
|
+
result += layout.parsedAmount.amountNumber;
|
|
313
|
+
// Add commodity-after (left-aligned in its column)
|
|
314
|
+
if (layout.parsedAmount.commodityAfter) {
|
|
315
|
+
result += ' ' + layout.parsedAmount.commodityAfter;
|
|
316
|
+
}
|
|
317
|
+
// Add cost notation if present
|
|
318
|
+
if (layout.parsedCost) {
|
|
319
|
+
// Add @ or @@ operator
|
|
320
|
+
result += layout.parsedCost.type === 'unit' ? ' @ ' : ' @@ ';
|
|
321
|
+
// Add cost commodity-before
|
|
322
|
+
if (layout.parsedCost.commodityBefore) {
|
|
323
|
+
result += layout.parsedCost.commodityBefore;
|
|
324
|
+
}
|
|
325
|
+
// Add cost amount
|
|
326
|
+
result += layout.parsedCost.amountNumber;
|
|
327
|
+
// Add cost commodity-after
|
|
328
|
+
if (layout.parsedCost.commodityAfter) {
|
|
329
|
+
result += ' ' + layout.parsedCost.commodityAfter;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Add balance assertion if present
|
|
333
|
+
if (layout.parsedAssertion) {
|
|
334
|
+
result += ' = ';
|
|
335
|
+
// Add assertion commodity-before
|
|
336
|
+
if (layout.parsedAssertion.commodityBefore) {
|
|
337
|
+
result += layout.parsedAssertion.commodityBefore;
|
|
338
|
+
}
|
|
339
|
+
// Add assertion amount
|
|
340
|
+
result += layout.parsedAssertion.amountNumber;
|
|
341
|
+
// Add assertion commodity-after
|
|
342
|
+
if (layout.parsedAssertion.commodityAfter) {
|
|
343
|
+
result += ' ' + layout.parsedAssertion.commodityAfter;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Add comment if present
|
|
347
|
+
if (layout.comment) {
|
|
348
|
+
result += ' ;' + layout.comment;
|
|
349
|
+
}
|
|
350
|
+
return result;
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Get the number of decimal places in a number
|
|
355
|
+
*/
|
|
356
|
+
getDecimalPlaces(value) {
|
|
357
|
+
const str = value.toString();
|
|
358
|
+
const decimalIndex = str.indexOf('.');
|
|
359
|
+
if (decimalIndex === -1) {
|
|
360
|
+
return 0;
|
|
361
|
+
}
|
|
362
|
+
return str.length - decimalIndex - 1;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Find the commodity format from parsed document
|
|
366
|
+
*/
|
|
367
|
+
findCommodity(commodityName, parsed) {
|
|
368
|
+
return parsed.commodities.find(c => c.name === commodityName);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
exports.FormattingProvider = FormattingProvider;
|
|
372
|
+
exports.formattingProvider = new FormattingProvider();
|
|
373
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/features/formatter.ts"],"names":[],"mappings":"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"}
|