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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +632 -0
  3. package/out/extension.d.ts +1 -0
  4. package/out/extension.d.ts.map +1 -0
  5. package/out/extension.js +2 -0
  6. package/out/extension.js.map +1 -0
  7. package/out/features/codeActions.d.ts +73 -0
  8. package/out/features/codeActions.d.ts.map +1 -0
  9. package/out/features/codeActions.js +417 -0
  10. package/out/features/codeActions.js.map +1 -0
  11. package/out/features/completion.d.ts +94 -0
  12. package/out/features/completion.d.ts.map +1 -0
  13. package/out/features/completion.js +323 -0
  14. package/out/features/completion.js.map +1 -0
  15. package/out/features/definition.d.ts +12 -0
  16. package/out/features/definition.d.ts.map +1 -0
  17. package/out/features/definition.js +61 -0
  18. package/out/features/definition.js.map +1 -0
  19. package/out/features/documentLinks.d.ts +17 -0
  20. package/out/features/documentLinks.d.ts.map +1 -0
  21. package/out/features/documentLinks.js +68 -0
  22. package/out/features/documentLinks.js.map +1 -0
  23. package/out/features/findReferences.d.ts +33 -0
  24. package/out/features/findReferences.d.ts.map +1 -0
  25. package/out/features/findReferences.js +79 -0
  26. package/out/features/findReferences.js.map +1 -0
  27. package/out/features/foldingRanges.d.ts +27 -0
  28. package/out/features/foldingRanges.d.ts.map +1 -0
  29. package/out/features/foldingRanges.js +111 -0
  30. package/out/features/foldingRanges.js.map +1 -0
  31. package/out/features/formatter.d.ts +70 -0
  32. package/out/features/formatter.d.ts.map +1 -0
  33. package/out/features/formatter.js +373 -0
  34. package/out/features/formatter.js.map +1 -0
  35. package/out/features/hover.d.ts +66 -0
  36. package/out/features/hover.d.ts.map +1 -0
  37. package/out/features/hover.js +387 -0
  38. package/out/features/hover.js.map +1 -0
  39. package/out/features/inlayHints.d.ts +43 -0
  40. package/out/features/inlayHints.d.ts.map +1 -0
  41. package/out/features/inlayHints.js +221 -0
  42. package/out/features/inlayHints.js.map +1 -0
  43. package/out/features/selectionRange.d.ts +47 -0
  44. package/out/features/selectionRange.d.ts.map +1 -0
  45. package/out/features/selectionRange.js +273 -0
  46. package/out/features/selectionRange.js.map +1 -0
  47. package/out/features/semanticTokens.d.ts +83 -0
  48. package/out/features/semanticTokens.d.ts.map +1 -0
  49. package/out/features/semanticTokens.js +370 -0
  50. package/out/features/semanticTokens.js.map +1 -0
  51. package/out/features/symbols.d.ts +47 -0
  52. package/out/features/symbols.d.ts.map +1 -0
  53. package/out/features/symbols.js +249 -0
  54. package/out/features/symbols.js.map +1 -0
  55. package/out/features/transactionAnalyzer.d.ts +63 -0
  56. package/out/features/transactionAnalyzer.d.ts.map +1 -0
  57. package/out/features/transactionAnalyzer.js +127 -0
  58. package/out/features/transactionAnalyzer.js.map +1 -0
  59. package/out/features/validator.d.ts +142 -0
  60. package/out/features/validator.d.ts.map +1 -0
  61. package/out/features/validator.js +633 -0
  62. package/out/features/validator.js.map +1 -0
  63. package/out/parser/ast.d.ts +37 -0
  64. package/out/parser/ast.d.ts.map +1 -0
  65. package/out/parser/ast.js +606 -0
  66. package/out/parser/ast.js.map +1 -0
  67. package/out/parser/includes.d.ts +25 -0
  68. package/out/parser/includes.d.ts.map +1 -0
  69. package/out/parser/includes.js +106 -0
  70. package/out/parser/includes.js.map +1 -0
  71. package/out/parser/index.d.ts +54 -0
  72. package/out/parser/index.d.ts.map +1 -0
  73. package/out/parser/index.js +146 -0
  74. package/out/parser/index.js.map +1 -0
  75. package/out/server/deps.d.ts +19 -0
  76. package/out/server/deps.d.ts.map +1 -0
  77. package/out/server/deps.js +77 -0
  78. package/out/server/deps.js.map +1 -0
  79. package/out/server/settings.d.ts +60 -0
  80. package/out/server/settings.d.ts.map +1 -0
  81. package/out/server/settings.js +110 -0
  82. package/out/server/settings.js.map +1 -0
  83. package/out/server.d.ts +3 -0
  84. package/out/server.d.ts.map +1 -0
  85. package/out/server.js +420 -0
  86. package/out/server.js.map +1 -0
  87. package/out/types.d.ts +84 -0
  88. package/out/types.d.ts.map +1 -0
  89. package/out/types.js +6 -0
  90. package/out/types.js.map +1 -0
  91. package/out/utils/index.d.ts +38 -0
  92. package/out/utils/index.d.ts.map +1 -0
  93. package/out/utils/index.js +89 -0
  94. package/out/utils/index.js.map +1 -0
  95. package/out/utils/uri.d.ts +32 -0
  96. package/out/utils/uri.d.ts.map +1 -0
  97. package/out/utils/uri.js +215 -0
  98. package/out/utils/uri.js.map +1 -0
  99. 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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"}