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.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/scripts/list_dependencies.js b/scripts/list_dependencies.js
new file mode 100644
index 0000000..1522a09
--- /dev/null
+++ b/scripts/list_dependencies.js
@@ -0,0 +1,110 @@
+const fs = require('fs');
+const readline = require('readline');
+const path = require('path');
+
+/**
+ * 尋找 Pascal 檔案中的影像處理相關關鍵字,並生成 CSV 輸出。
+ * @param {string} filePath - Pascal 檔案路徑
+ * @param {string} outputCsv - 輸出的 CSV 檔案名稱
+ */
+async function findImageKeywords(filePath, keywordsStr, exclusionStr, outputCsv) {
+ const keeper = {}
+ // 拆分並使用 Set 移除重複的關鍵字
+ const keywords = [...new Set(keywordsStr.split('|'))];
+ const exclusion = exclusionStr ? [...new Set(exclusionStr.split('|'))] : [];
+
+ // 用於匹配 Delphi procedure 或 function 的正規表達式
+ const methodPattern = /^\s*(?:procedure|function)\s+([a-zA-Z0-9_\.]+)/i;
+
+ const results = [];
+ let currentMethod = "Global_Or_Interface"; // 預設狀態 (尚未進入任何方法)
+
+ if (!fs.existsSync(filePath)) {
+ console.error(`❌ 錯誤: 找不到指定的檔案 '${filePath}'`);
+ console.log("請確保檔案名稱正確,並與此腳本放在同一目錄下。");
+ return;
+ }
+
+ console.log(`🔍 開始掃描檔案: ${filePath} ...\n`);
+ const fileName = path.basename(filePath);
+
+ // 建立逐行讀取流 (使用 latin1 讀取以避免 Big5 中文字元在原生 Node 環境報錯)
+ // 由於我們只比對英文關鍵字,編碼不會影響比對結果
+ const fileStream = fs.createReadStream(filePath, {encoding: 'latin1'});
+ const rl = readline.createInterface({
+ input: fileStream,
+ crlfDelay: Infinity
+ });
+
+ let lineNum = 0;
+
+ for await (const line of rl) {
+ lineNum++;
+
+ // 檢查是否進入了新的方法實作區塊
+ const methodMatch = line.match(methodPattern);
+ if (methodMatch) {
+ currentMethod = methodMatch[1];
+ }
+
+ const lineLower = line.toLowerCase();
+
+ // 檢查該行是否包含我們關注的關鍵字
+ for (const kw of keywords) {
+ if (lineLower.includes(kw.toLowerCase()) && !exclusion.some((_)=>lineLower.includes(_.toLowerCase()))) {
+ keeper[currentMethod] ??= new Set([])
+ if (keeper[currentMethod].has(kw))
+ continue
+ keeper[currentMethod].add(kw)
+ results.push({
+ MethodName: currentMethod,
+ FileName: fileName,
+ LineNumber: lineNum,
+ Dependency: kw,
+ CodeSnippet: line.trim().replace(/"/g, '""') // 處理 CSV 雙引號跳脫
+ });
+ }
+ }
+ }
+
+ // 1. 輸出至 Console
+ console.log("-".repeat(90));
+
+ // 為了讓 Console 顯示更乾淨,我們按方法名稱進行分組顯示
+ const groupedResults = results.reduce((acc, curr) => {
+ if (!acc[curr.MethodName]) acc[curr.MethodName] = [];
+ acc[curr.MethodName].push(curr);
+ return acc;
+ }, {});
+
+ for (const [method, items] of Object.entries(groupedResults)) {
+ // 收集該方法內找到的所有相依關鍵字 (去重複)
+ const deps = [...new Set(items.map(i => i.Dependency))].join(', ');
+ const lines = [...new Set(items.map(i => i.LineNumber))].join(', ');
+
+ console.log(`${method.padEnd(30)} | ${fileName.padEnd(20)} | ${lines.padEnd(5)} | ${deps}`);
+ }
+
+ console.log(`\n✅ 掃描成功!共找到 ${results.length} 次相依引用。`);
+
+ // 2. 輸出至 CSV 檔案
+ // 加入 BOM 以確保 Excel 能正確解析 UTF-8 中文
+ const csvHeader = '\uFEFF[ ],方法名,所在檔名,行號,引用了什麼相依,方法描述(請手動填寫),原始程式碼片段\n';
+
+ const csvContent = results.map(r =>
+ `[V],"${r.MethodName}","${r.FileName}","${r.LineNumber}","${r.Dependency}","","${r.CodeSnippet}"`
+ ).join('\n');
+ if (results.length) {
+ fs.writeFileSync(outputCsv, csvHeader + csvContent, 'utf8');
+ }
+ console.log(`📁 詳細結果已匯出至: ${outputCsv} (可直接用 Excel 打開)`);
+ return {
+ csvHeader,
+ csvContent
+ }
+}
+
+module.exports = {
+ findImageKeywords
+}
+
--
Gitblit v1.8.0