@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({