@iiatlas/hledger-fmt
2.0.22.0.3
dist/cli.js~
dist/cli.jsModified+17−27
Index: package/dist/cli.js
===================================================================
--- package/dist/cli.js
+++ package/dist/cli.js
@@ -3458,10 +3458,8 @@
Object.defineProperty(exports2, "__esModule", { value: true });
exports2.TRANSACTION_DATE_PREFIX = exports2.DEFAULT_FORMATTER_OPTIONS = void 0;
exports2.normalizeFormatterOptions = normalizeFormatterOptions;
exports2.isCommentLine = isCommentLine;
- exports2.isMetadataPostingLine = isMetadataPostingLine;
- exports2.isMetadataPostingAccount = isMetadataPostingAccount;
exports2.isTransactionHeaderLine = isTransactionHeaderLine;
exports2.extractPostingDetail = extractPostingDetail;
exports2.extractDateComponents = extractDateComponents;
exports2.formatHledgerJournal = formatHledgerJournal2;
@@ -3499,24 +3497,8 @@
function isCommentLine(line) {
const trimmed = line.trim();
return trimmed.startsWith(";") || trimmed.startsWith("#") || trimmed.startsWith("*");
}
- function isMetadataPostingLine(trimmedLine) {
- if (!trimmedLine) {
- return false;
- }
- if (/\s{2,}|\t/.test(trimmedLine)) {
- return false;
- }
- return /^[A-Za-z0-9_.-]+:(\s+.*)?$/.test(trimmedLine);
- }
- function isMetadataPostingAccount(account) {
- if (!account) {
- return false;
- }
- const trimmedAccount = account.trim();
- return trimmedAccount.endsWith(":") || /:\s/.test(trimmedAccount);
- }
function isCommentBlockStart(line) {
return line.trim() === "comment";
}
function isCommentBlockEnd(line) {
@@ -3619,8 +3601,16 @@
const trimmedAmount = amount.trimStart();
const matchIndex = trimmedAmount.search(/[0-9]/);
return matchIndex === -1 ? trimmedAmount.length : matchIndex;
}
+ var FULLWIDTH_CHARACTER = /[\u1100-\u115F\u2329-\u232A\u2E80-\u303E\u3040-\u3247\u3250-\u4DBF\u4E00-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6\u{1B000}-\u{1B2FF}\u{1F200}-\u{1F251}\u{20000}-\u{3FFFD}]/u;
+ function getAccountDisplayWidth(account) {
+ let width = 0;
+ for (const character of account) {
+ width += FULLWIDTH_CHARACTER.test(character) ? 2 : character.length;
+ }
+ return width;
+ }
function formatTransactionHeader(headerLine, options) {
const commentRegex = /\s*;.*$/;
const commentIndex = headerLine.search(commentRegex);
const commentPart = commentIndex !== -1 ? headerLine.slice(commentIndex) : "";
@@ -3712,15 +3702,21 @@
});
const referenceAccountLength = preparedPostings.reduce((max, prepared) => {
const account = prepared.detail.account;
if (account) {
- return Math.max(max, account.length);
+ return Math.max(max, getAccountDisplayWidth(account));
}
return max;
}, 0);
let baseDigitsColumn;
if (options.amountAlignment === "widest") {
- const digitColumnCandidates = preparedPostings.filter((prepared) => prepared.detail.account && prepared.formattedAmount).map((prepared) => indentWidth + prepared.detail.account.length + prepared.digitsPrefixLength + 2);
+ const digitColumnCandidates = preparedPostings.flatMap((prepared) => {
+ const account = prepared.detail.account;
+ if (!account || !prepared.formattedAmount) {
+ return [];
+ }
+ return [indentWidth + getAccountDisplayWidth(account) + prepared.digitsPrefixLength + 2];
+ });
const fallbackColumn = indentWidth + referenceAccountLength + 2;
baseDigitsColumn = digitColumnCandidates.length > 0 ? Math.max(fallbackColumn, ...digitColumnCandidates) : fallbackColumn;
} else {
baseDigitsColumn = options.amountColumnPosition;
@@ -3736,9 +3732,9 @@
formattedLines.push(`${indentStr}${detail.trimmed}`);
continue;
}
const digitsPrefixLength = prepared.digitsPrefixLength;
- const paddingTarget = baseDigitsColumn - (indentWidth + detail.account.length) - digitsPrefixLength;
+ const paddingTarget = baseDigitsColumn - (indentWidth + getAccountDisplayWidth(detail.account)) - digitsPrefixLength;
const paddingNeeded = Math.max(2, paddingTarget);
formattedLines.push(`${indentStr}${detail.account}${" ".repeat(paddingNeeded)}${amount}`);
}
return formattedLines;
@@ -4042,18 +4038,12 @@
const trimmed = line.trim();
if (!trimmed || isCommentLine(trimmed)) {
continue;
}
- if (isMetadataPostingLine(trimmed)) {
- continue;
- }
const detail = extractPostingDetail(line);
if (!detail.account) {
continue;
}
- if (isMetadataPostingAccount(detail.account)) {
- continue;
- }
if (detail.amount) {
const parsed = parseAmount(detail.amount);
if (parsed) {
postings.push({