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/final_classify_scanImp_pas.js |  264 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 264 insertions(+), 0 deletions(-)

diff --git a/scripts/final_classify_scanImp_pas.js b/scripts/final_classify_scanImp_pas.js
new file mode 100644
index 0000000..564adc6
--- /dev/null
+++ b/scripts/final_classify_scanImp_pas.js
@@ -0,0 +1,264 @@
+const fs = require('fs');
+const path = require('path');
+
+const JSON_FILES = [
+  'doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.BusinessLogic.json',
+  'doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ImageProcessor.json',
+  'doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.ScannerController.json',
+  'doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.TransportManager.json',
+  'doc/curtis/prompt/scanimpl_analysis/scanimpl_annalysis.UIView.json'
+];
+
+// 1.優先
+// team_task_classification 團隊分工覆寫
+const PRIM_TAGS_TO_FIE = {
+  // // ScannerController
+  // 'ScannerController.acquisitionHandler': 'scan/acquisition.pas',
+  // 'ScannerController.twainWrapper': 'scan/twain.pas',
+  //
+  // // ImageProcessor
+  // 'ImageProcessor.transformer': 'img/transformer.pas',
+  // 'ImageProcessor.converter': 'img/converter.pas',
+  // 'ImageProcessor.anchorAnalyzer': 'img/anchor.pas',
+  // 'ImageProcessor.payloadArchiver': 'img/imgArchiver.pas',
+  
+  '初始化與生命週期': 'CB_IMGPSScanImp.lfcycle.pas',
+  'API 呼叫相關': 'CB_IMGPSScanImp.api.pas',
+  '轉換區(名稱/格式轉換)': 'CB_IMGPSScanImp.convert.pas',
+  '案件管理(TreeView / 案件操作)': 'CB_IMGPSScanImp.caseMgr.pas',
+  '清單管理': 'CB_IMGPSScanImp.listMgr.pas',
+  '檔案操作': 'CB_IMGPSScanImp.fileOp.pas',
+  '上傳前置資料產生': 'CB_IMGPSScanImp.prUpload.pas',
+  '文件份數/頁數/查詢': 'CB_IMGPSScanImp.docq.pas',
+  '自訂文件': 'CB_IMGPSScanImp.custdoc.pas',
+  '舊案/異動件處理': 'CB_IMGPSScanImp.docmod.pas',
+  '入庫文件/可見性': 'CB_IMGPSScanImp.inbound.pas',
+  // '影像瀏覽/顯示': 'CB_IMGPSScanImp.image.pas',
+  'OMR 檢核': 'CB_IMGPSScanImp.omr.pas',
+  '縮圖預覽(PreViewISB)': 'CB_IMGPSScanImp.preview.pas',
+  '其他內部': 'CB_IMGPSScanImp.misc.pas',
+}
+
+// 2.若 1未定義到, 則從這裡分類
+const TAGS_TO_FILE = {
+  // ScannerController
+  'ScannerController.acquisitionHandler': 'scan/acquisition.pas',
+  'ScannerController.twainWrapper': 'scan/twain.pas',
+
+  // ImageProcessor
+  'ImageProcessor.transformer': 'img/transformer.pas',
+  'ImageProcessor.converter': 'img/converter.pas',
+  'ImageProcessor.anchorAnalyzer': 'img/anchor.pas',
+  'ImageProcessor.payloadArchiver': 'img/imgArchiver.pas',
+
+  // TransportManager
+  'TransportManager.apiClient': 'transp/apiClient.pas',
+  'TransportManager.fileTransfer': 'transp/fileClient.pas',
+  'TransportManager.certificateManager': 'transp/certManager.pas',
+  'TransportManager.payloadArchiver': 'transp/payloadArchiver.pas',
+
+  // BusinessLogic
+  'BusinessLogic.systemInternal': 'bloc/sys.pas',
+  'BusinessLogic.configRepository': 'bloc/cfg.pas',
+  'BusinessLogic.ormRuleEngine': 'bloc/ormRuleEngine.pas',
+  'BusinessLogic.entityMapping': 'bloc/entityMapping.pas',
+  'BusinessLogic.fileManager': 'bloc/fileManager.pas',
+  'BusinessLogic.caseManager': 'bloc/caseManager.pas',
+  'BusinessLogic.entityModel': 'bloc/entityModel.pas',
+  'BusinessLogic.activeXWrapper': 'bloc/ocx.pas',
+
+  // UIView
+  'UIView.statusMessenger': 'view/msger.pas',
+  'UIView.events': 'view/events.pas',
+  'UIView.i18n': 'view/i18n.pas',
+  'UIView.inputHandler': 'view/input.pas',
+  'UIView.configRepository': 'view/cfg.pas',
+  'UIView.treeView': 'view/treeView.pas',
+  'UIView.toolBar': 'view/toolBar.pas',
+  'UIView.imageScrollBox': 'view/isb.pas',
+  'UIView.popupMenu': 'view/popupMenu.pas',
+  'UIView.listView': 'view/listView.pas',
+  'UIView.scrollView': 'view/scrollView.pas',
+  'UIView.misc': 'view/misc.pas'
+};
+
+const SRC_FILE = 'CB_IMGPSScanImp.pas.bk';
+const DEST_FILE = 'CB_IMGPSScanImp.pas';
+const OUTPUT_DEST = 'reassemble';
+const REMAININGS_FILE = 'scripts/dist/scanimpl_annalysis.remainings.txt';
+
+function getVisualWidth(str) {
+  let width = 0;
+  for (let i = 0; i < str.length; i++) {
+    const code = str.charCodeAt(i);
+    if (code >= 0x4e00 && code <= 0x9fff) {
+      width += 2;
+    } else {
+      width += 1;
+    }
+  }
+  return width;
+}
+
+function wrapText(text, limit, wrapIndent) {
+  if (!text) return "";
+  
+  // 處理 1. 2. 3. 這種標示點,先進行初步換行
+  // 尋找符合 "數字." 的模式,並在其前面加上換行符(如果不是在開頭的話)
+  let formattedText = text.replace(/(\d+\.)/g, (match, p1, offset) => {
+    return offset === 0 ? match : "\n" + match;
+  });
+
+  const segments = formattedText.split('\n');
+  let resultLines = [];
+
+  segments.forEach(segment => {
+    let currentLine = "";
+    let currentLineWidth = 0;
+    
+    // 將 segment 依字元處理
+    for (let i = 0; i < segment.length; i++) {
+      const char = segment[i];
+      const charWidth = getVisualWidth(char);
+      
+      if (currentLineWidth + charWidth > limit) {
+        resultLines.push(currentLine);
+        currentLine = char;
+        currentLineWidth = charWidth;
+      } else {
+        currentLine += char;
+        currentLineWidth += charWidth;
+      }
+    }
+    if (currentLine) resultLines.push(currentLine);
+  });
+
+  return resultLines.join("\n" + wrapIndent);
+}
+
+function getDocString(m) {
+  const methodName = m.matcher.match(/^(procedure|function)\s+TCB_IMGPSScanX\.([\w\.]+)/i)?.[2] || m.matcher;
+  const deps = (m.deps || []).join(', ');
+  const wrappedDeps = wrapText(deps, 68, "            ");
+  const desc = m.description || '';
+  const wrappedDesc = wrapText(desc, 68, "            ");
+
+  return `{ ==============================================================================
+  方法名稱:${methodName}
+  引用相依:${wrappedDeps}
+  方法描述:${wrappedDesc}
+============================================================================== }\n`;
+}
+
+function main() {
+  console.log('Copying ' + SRC_FILE + ' to ' + DEST_FILE);
+  fs.copyFileSync(SRC_FILE, DEST_FILE);
+
+  const originalContent = fs.readFileSync(DEST_FILE, 'utf8');
+  const lines = originalContent.split(/\r?\n/);
+
+  const allMethods = [];
+  JSON_FILES.forEach(jsonFile => {
+    if (!fs.existsSync(jsonFile)) return;
+    const data = JSON.parse(fs.readFileSync(jsonFile, 'utf8'));
+    data.forEach(m => {
+      const lIndex = parseInt(m.lIndex);
+      const rIndex = parseInt(m.rIndex);
+      if (lIndex > 0 && rIndex > 0) {
+        allMethods.push({
+          ...m,
+          lIndex,
+          rIndex
+        });
+      }
+    });
+  });
+
+  const lineToTargetFile = new Array(lines.length + 1).fill(null);
+  const fileToMethods = {};
+
+  allMethods.forEach(m => {
+    let targetFile = null;
+    // team_task_classification 團隊分工覆寫
+    if (!targetFile) {
+      for (const tag of m.tags) {
+        if (PRIM_TAGS_TO_FIE[tag]) {
+          targetFile = PRIM_TAGS_TO_FIE[tag];
+          break;
+        }
+      }
+    }
+    if (!targetFile) {
+      for (const tag of m.tags) {
+        if (TAGS_TO_FILE[tag]) {
+          targetFile = TAGS_TO_FILE[tag];
+          break;
+        }
+      }
+    }
+
+    if (!targetFile) targetFile = 'view/misc.pas';
+
+    if (!fileToMethods[targetFile]) {
+      fileToMethods[targetFile] = [];
+    }
+    fileToMethods[targetFile].push(m);
+    
+    for (let i = m.lIndex; i <= m.rIndex; i++) {
+      if (i <= lines.length) {
+        lineToTargetFile[i] = targetFile;
+      }
+    }
+  });
+
+  // Create sub-files
+  for (const targetFile in fileToMethods) {
+    const methods = fileToMethods[targetFile];
+    methods.sort((a, b) => a.lIndex - b.lIndex);
+    
+    let subFileContent = '';
+    methods.forEach(m => {
+      const methodLines = lines.slice(m.lIndex - 1, m.rIndex);
+      subFileContent += getDocString(m) + methodLines.join('\n') + '\n\n';
+    });
+    
+    const fullPath = path.join(OUTPUT_DEST, targetFile);
+    fs.mkdirSync(path.dirname(fullPath), { recursive: true });
+    fs.writeFileSync(fullPath, subFileContent);
+    console.log(`Saved ${methods.length} methods to ${fullPath}`);
+  }
+
+  // Rewrite main file and generate remainings
+  const newMainLines = [];
+  const remainingsLines = [];
+  const includedFiles = new Set();
+
+  for (let i = 1; i <= lines.length; i++) {
+    const targetFile = lineToTargetFile[i];
+    if (targetFile) {
+      if (!includedFiles.has(targetFile)) {
+        newMainLines.push(`{$I ${OUTPUT_DEST}/${targetFile}}`);
+        includedFiles.add(targetFile);
+      }
+    } else {
+      newMainLines.push(lines[i - 1]);
+      remainingsLines.push(lines[i - 1]);
+    }
+  }
+
+  const finalContent = newMainLines.join('\n');
+  fs.writeFileSync(DEST_FILE, finalContent);
+  
+  if (!fs.existsSync(path.dirname(REMAININGS_FILE))) {
+    fs.mkdirSync(path.dirname(REMAININGS_FILE), { recursive: true });
+  }
+  fs.writeFileSync(REMAININGS_FILE, remainingsLines.join('\n'));
+  
+  console.log('\n--- Content of ' + DEST_FILE + ' after disaggregation ---\n');
+  console.log(finalContent.substring(0, 1000) + '\n...');
+  console.log('\n--- End of Preview ---\n');
+  console.log('Remainings saved to: ' + REMAININGS_FILE);
+  console.log('Done.');
+}
+
+main();

--
Gitblit v1.8.0