From 0756bf12d10cf1b7f78c571de0a9ad69cbaeb7ca Mon Sep 17 00:00:00 2001
From: curtis <curtis@i-mps.com>
Date: 星期一, 30 三月 2026 14:24:17 +0800
Subject: [PATCH] fix: 更新內部引用方法參照

---
 scripts/list_dependencies_run.js |   99 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/scripts/list_dependencies_run.js b/scripts/list_dependencies_run.js
new file mode 100644
index 0000000..f5eeca9
--- /dev/null
+++ b/scripts/list_dependencies_run.js
@@ -0,0 +1,99 @@
+const img = require('./list_image_dependencies')
+const io = require('./list_io_dependencies')
+const scan = require('./list_scan_dependencies')
+const transp = require('./list_transport_dependencies')
+const fs = require("fs");
+const path = require("path");
+const baseDir = path.join(process.cwd(), 'scripts/dist');
+
+const IMG_DEPS = img.listDependencies()
+const IO_DEPS = io.listDependencies()
+const SCAN_DEPS = scan.listDependencies()
+const TRANS_DEPS = transp.listDependencies()
+
+/**
+ * 解析單行 CSV 字串,能正確處理被引號包覆且內部含有逗號的欄位。
+ * @param {string} line - 要解析的單行 CSV 字串。
+ * @returns {string[]} 解析後的欄位陣列。
+ */
+function parseCsvLine(line) {
+  const fields = [];
+  let currentField = '';
+  let inQuotes = false;
+
+  for (let i = 0; i < line.length; i++) {
+    const char = line[i];
+    if (char === '"') {
+      // 處理 CSV 中用兩個雙引號來代表一個雙引號的轉義規則
+      if (inQuotes && line[i + 1] === '"') {
+        currentField += '"';
+        i++; // 跳過下一個引號
+      } else {
+        inQuotes = !inQuotes; // 進入或離開引號模式
+      }
+    } else if (char === ',' && !inQuotes) {
+      // 當不在引號內且遇到逗號時,才視為一個欄位的結束
+      fields.push(currentField);
+      currentField = '';
+    } else {
+      // 一般字元,直接附加到當前欄位
+      currentField += char;
+    }
+  }
+  // 將最後一個欄位加入陣列
+  fields.push(currentField);
+
+  return fields;
+}
+
+// 您可以這樣使用它:
+// const [pick, methodName, fileName, lineno, deps, desc, source] = parseCsvLine(line);
+function flatten(arrOStr) {
+  if (Array.isArray(arrOStr)) {
+    return arrOStr.reduce((acc, cur)=>{
+      if (typeof cur === 'string') acc.push(cur)
+      else acc.push(...flatten(cur))
+      return acc
+    }, [])
+  }
+  return arrOStr
+}
+async function main() {
+  const imgDeps = (await IMG_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n'))
+  const ioDeps = (await IO_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n'))
+  const scanDeps = (await SCAN_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n'))
+  const transDeps = (await TRANS_DEPS).filter((_) => _.csvContent).map((_) => _.csvContent.split('\n'))
+  const csvHeader = (await IMG_DEPS)[0].csvHeader
+  const allCsvContent = flatten([
+    ...imgDeps,
+    ...ioDeps,
+    ...scanDeps,
+    ...transDeps
+  ])
+  
+  const keep = {}
+  const results = []
+  allCsvContent.forEach((line)=>{
+    const [pick, methodName, fileName, lineno, deps, desc, source] = parseCsvLine(line)
+    const ident = `${fileName}-${methodName}`
+    keep[ident] ??= {}
+    if (keep[ident][deps])
+      return
+    keep[ident][deps] ??= {
+      source, lineno, desc
+    }
+    results.push({
+      pick, methodName, fileName, lineno, deps, desc, source
+    })
+  })
+
+  const csvContent = results.map(r =>
+    `${r.pick},${r.methodName},${r.fileName},${r.lineno},${r.deps},${r.desc},${r.source}`
+  ).join('\n');
+  const outputCsv = path.join(baseDir, `deps.all.csv`)
+  fs.writeFileSync(outputCsv, csvHeader + csvContent, 'utf8');
+}
+
+main()
+
+

--
Gitblit v1.8.0