分享和討論倉頡輸入法相關的資訊和内容
版面规则
公正客觀講理,杜絶廢話連篇
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

「婧婊」似乎應該調換位置。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

「縹」是常用字,如「縹渺、縹緲」。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

「糌」應改為fdho,現在是fdhy。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

把「垸」調至「埞」前。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

「秽」仍應放到後面,改成hdun。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

陨和预一樣也都沒改。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

發現「氳」是錯碼,應該為onwo,之前為onwk。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

倾應為opmo
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

躖應改為rmvi
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

躅應置前
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

改進:
當輸入一個單字時,如這個單字的編碼為abcd,則程式會列出「a,ab,abc,abcd」所對應的字。這時如果再輸入「abef」,則之前不要清除,而是加上「abe,abef」。只有點擊finish後才會清除。

「save to undostack」以及「更新比對」等相關受影響的代碼也要進行更改。

需要給出所有更改的地方和所要替換的代碼,不用給出全部代碼。所有的代碼和注釋都要使用英文。

代码: 全选

改進:
當輸入一個單字時,如這個單字的編碼為abcd,則程式會列出「a,ab,abc,abcd」所對應的字。這時如果再輸入「abef」,則之前不要清除,而是加上「abe,abef」。只有點擊finish後才會清除。

「save to undostack」以及「更新比對」等相關受影響的代碼也要進行更改。

需要給出所有更改的地方和所要替換的代碼,不用給出全部代碼。所有的代碼和注釋都要使用英文。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

改進:
當輸入一個單字時,如這個單字的編碼為abcd,則程式會列出「a,ab,abc,abcd」所對應的字。這時如果再輸入「abef」,則之前不要清除,而是加上「abe,abef」。只有點擊finish(頁面上已有)後才會清除。

「save to undostack」以及「更新比對」等相關受影響的代碼也要進行更改。

需要給出所有更改的地方和所要替換的代碼,不用給出全部代碼。所有的代碼和注釋都要使用英文。

代码: 全选

改進:
當輸入一個單字時,如這個單字的編碼為abcd,則程式會列出「a,ab,abc,abcd」所對應的字。這時如果再輸入「abef」,則之前不要清除,而是加上「abe,abef」。只有點擊finish(頁面上已有)後才會清除。

「save to undostack」以及「更新比對」等相關受影響的代碼也要進行更改。

需要給出所有更改的地方和所要替換的代碼,不用給出全部代碼。所有的代碼和注釋都要使用英文。

gemini pro:

代码: 全选

Here are the required modifications to make the code sequences accumulate correctly without clearing the display until "Finish" is clicked. This also ensures that the undo/redo stack and diffing engine accurately track the cumulative interface state.

Please find the specific functions below and replace the corresponding blocks in your code.

### 1. Update `handleEditSubmit()`

This change stops `activeEditKeys` from resetting on every input. It also wraps `originalSnapshotState` in a condition so that the diffing baseline is preserved across cumulative edits, keeping your comparison highlights intact.

**Replace this block:**

```javascript
        if (isSingleWordMode) {
          activeEditKeys.clear(); // Only show sequences for this code
          for (let i = 1; i <= singleWordActiveCode.length; i++) {
            activeEditKeys.add(singleWordActiveCode.substring(0, i));
          }
          originalSnapshotState = getSystemState();
        } else {

```

**With this code:**

```javascript
        if (isSingleWordMode) {
          // Do not clear activeEditKeys to allow cumulative display
          for (let i = 1; i <= singleWordActiveCode.length; i++) {
            activeEditKeys.add(singleWordActiveCode.substring(0, i));
          }
          // Only initialize the baseline snapshot once per session to maintain diffs
          // across multiple subsequent inputs.
          if (!originalSnapshotState || originalSnapshotState.size === 0) {
            originalSnapshotState = getSystemState();
          }
        } else {

```

---

### 2. Update `saveStateForUndo()`

To ensure the undo system remembers which lines were expanded when an edit occurred, we need to save the current state of `activeEditKeys` into the history stack.

**Replace the entire function with:**

```javascript
      function saveStateForUndo(description = 'Manual Edit') {
        let currentLines = mcc0string.split('\n').filter(l => l.trim() !== '');
        let charDefMapCopy = new Map();
        for (let [k, v] of charDefCodeMap.entries()) {
          charDefMapCopy.set(k, [...v]);
        }
        undoStack.push({
          lines: currentLines,
          filecontent: filecontent,
          charDefCodeMap: charDefMapCopy,
          activeKeys: new Set(activeEditKeys), // Save cumulative keys state
          desc: description
        });
        redoStack = []; // Clear redo stack whenever a new action occurs
        renderActionLogs(); // Update visual logs
      }

```

---

### 3. Update `handleUndo()`

When undoing an action, the UI must also restore the `activeEditKeys` that were visually present at that point in time.

**Replace this block:**

```javascript
        let lastActionDesc = undoStack[undoStack.length - 1].desc;
        redoStack.push({
          lines: currentLines,
          filecontent: filecontent,
          charDefCodeMap: charDefMapCopy,
          desc: `Undo: ${lastActionDesc}`
        });

        let prevState = undoStack.pop();
        let oldState = getSystemState();

```

**With this code:**

```javascript
        let lastActionDesc = undoStack[undoStack.length - 1].desc;
        redoStack.push({
          lines: currentLines,
          filecontent: filecontent,
          charDefCodeMap: charDefMapCopy,
          activeKeys: new Set(activeEditKeys), // Save active keys for redo
          desc: `Undo: ${lastActionDesc}`
        });

        let prevState = undoStack.pop();
        if (prevState.activeKeys) activeEditKeys = new Set(prevState.activeKeys); // Restore keys
        let oldState = getSystemState();

```

---

### 4. Update `handleRedo()`

Similar to undo, redoing an action should accurately push and pull the `activeEditKeys` state from the stack.

**Replace this block:**

```javascript
        let nextState = redoStack.pop();
        undoStack.push({
          lines: currentLines,
          filecontent: filecontent,
          charDefCodeMap: charDefMapCopy,
          desc: nextState.desc
        });

        let oldState = getSystemState();

```

**With this code:**

```javascript
        let nextState = redoStack.pop();
        undoStack.push({
          lines: currentLines,
          filecontent: filecontent,
          charDefCodeMap: charDefMapCopy,
          activeKeys: new Set(activeEditKeys), // Save active keys for undo
          desc: nextState.desc
        });

        if (nextState.activeKeys) activeEditKeys = new Set(nextState.activeKeys); // Restore keys
        let oldState = getSystemState();

```

---

### 5. Update `jumpToLog()`

This ensures that jumping back to a specific timeline point correctly cascades the active UI keys down the redo stack and restores the target layout.

**Replace this block:**

```javascript
        // Transfer chronological items into the redo stack from the trailing end down to the split boundary
        for (let i = undoStack.length - 1; i > index; i--) {
          redoStack.push({
            lines: i === undoStack.length - 1 ? currentLines : undoStack[i + 1].lines,
            filecontent: i === undoStack.length - 1 ? filecontent : undoStack[i + 1].filecontent,
            charDefCodeMap: i === undoStack.length - 1 ? charDefMapCopy : undoStack[i + 1].charDefCodeMap,
            desc: undoStack[i].desc
          });
        }

        // Keep the stack history slice up to and including the targeted executed action index
        undoStack = undoStack.slice(0, index + 1);
        let oldState = getSystemState();

```

**With this code:**

```javascript
        // Transfer chronological items into the redo stack from the trailing end down to the split boundary
        for (let i = undoStack.length - 1; i > index; i--) {
          redoStack.push({
            lines: i === undoStack.length - 1 ? currentLines : undoStack[i + 1].lines,
            filecontent: i === undoStack.length - 1 ? filecontent : undoStack[i + 1].filecontent,
            charDefCodeMap: i === undoStack.length - 1 ? charDefMapCopy : undoStack[i + 1].charDefCodeMap,
            activeKeys: i === undoStack.length - 1 ? new Set(activeEditKeys) : new Set(undoStack[i + 1].activeKeys),
            desc: undoStack[i].desc
          });
        }

        // Keep the stack history slice up to and including the targeted executed action index
        undoStack = undoStack.slice(0, index + 1);
        if (targetState && targetState.activeKeys) activeEditKeys = new Set(targetState.activeKeys); // Restore keys
        let oldState = getSystemState();

```
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

改進:
undo,redo只要log高亮,不去掉log的項目。reset相當於undo到最開始,亦不會刪除log的項目。只有在某個undostack進行新的操作,才會把其後面的log去掉。

只需給出所要修改的地方以及替換的代碼,不用給出全部代碼,所有的注釋都要使用英文。

代码: 全选

改進:
undo,redo只要log高亮,不去掉log的項目。reset相當於undo到最開始,亦不會刪除log的項目。只有在某個undostack進行新的操作,才會把其後面的log去掉。

只需給出所要修改的地方以及替換的代碼,不用給出全部代碼,所有的注釋都要使用英文。
上次由 ejsoon 在 2026年 6月 12日 09:05,总共编辑 1 次。
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

gemini thinking:

代码: 全选

為了實現您的需求(Undo/Redo 時保留所有 Log 項目僅作高亮切換、Reset 時返回初始狀態且不刪除 Log、僅在中間狀態進行新操作時才裁切後續 Log),您需要修改 **歷史紀錄渲染**、**重置(Reset)** 以及 **儲存歷史(Save)** 的相關函式。

以下是需要修改的地方與對應的替換代碼(註釋均已使用英文):

### 1. 修改 `renderLog` 函式

將原本只渲染到 `historyIndex` 的限制,改為走訪整個 `history` 陣列,使所有紀錄保持顯示,並僅對當前索引項目加上高亮。

**替換代碼:**

```javascript
function renderLog() {
  const logList = document.getElementById('logList');
  if (!logList) return;
  logList.innerHTML = '';

  // Loop through the entire history array to keep all log items visible
  for (let i = 0; i < history.length; i++) {
    const item = history[i];
    const li = document.createElement('li');
    li.textContent = item.action;

    // Highlight only the current active history index
    if (i === historyIndex) {
      li.classList.add('active');
    }

    logList.appendChild(li);
  }
}

```

### 2. 修改 `handleReset` 函式

移除原本會清空或裁切 `history` 陣列的程式碼,將其改為單純將 `historyIndex` 移回最開始(`0`)並還原初始數據,如同 Undo 到最底。

**替換代碼:**

```javascript
function handleReset() {
  if (history.length === 0) return;
  if (confirm('確定要重置嗎?')) {
    // Point back to the very first state without clearing or truncating the history array
    historyIndex = 0;
    
    // Restore the initial state data
    const state = history[historyIndex];
    cinHeader = JSON.parse(JSON.stringify(state.cinHeader));
    cinEntries = JSON.parse(JSON.stringify(state.cinEntries));

    // Refresh UI tables and log view
    renderTable();
    renderLog();
  }
}

```

### 3. 修改/確認 `saveHistory` (或新操作寫入歷史的函式)

確保只有在 `historyIndex` 小於最新進度(即執行過 Undo)且在此狀態下進行**新操作**時,才會將當前節點之後的歷史紀錄裁切掉。

**替換代碼:**

```javascript
function saveHistory(actionName) {
  // Truncate subsequent logs only when a new operation occurs from within an undostack position
  if (historyIndex < history.length - 1) {
    history = history.slice(0, historyIndex + 1);
  }

  // Append the new operation state
  history.push({
    action: actionName,
    cinHeader: JSON.parse(JSON.stringify(cinHeader)),
    cinEntries: JSON.parse(JSON.stringify(cinEntries))
  });
  historyIndex++;

  // Update log display
  renderLog();
}

```

*註:請根據您目前的程式碼,確保還原數據時的變數名稱(如 `cinHeader`, `cinEntries`, `renderTable` 等)與您檔案中的全域變數一致。*
https://ejsoon.vip/
弈趣極光:享受思維樂趣
头像
ejsoon
一枝独秀
一枝独秀
帖子: 5884
注册时间: 2022年 11月 18日 17:36
联系:

Re: 工欲善其事,必先利其器:準備更新哈哈倉頡

帖子 ejsoon »

gemini 3.1 pro preview來自oneaiplus

代码: 全选

Because the specific `undo`, `redo`, and `history` tracking variables are in the omitted part of your code (`...[中间内容已省略]...`), I will provide the exact modifications you need to make to those specific logical blocks. You will need to apply these to your actual variable names (e.g., `historyStack`, `currentIndex`, `logContainer`).

Here are the specific places to modify and the replacement code. All comments are in English as requested.

### 1. Modify the `resetPage` function
Instead of clearing the state entirely, make it jump back to the first state (Index 0) without deleting the history array or DOM logs.

**Locate:**
```javascript
          // Hide tab system when page is reset
          document.getElementById('mainTabSystem').style.display = 'none';
          originalSnapshotState.clear();
        }
```

**Replace with:**
```javascript
          // Hide tab system when page is reset
          document.getElementById('mainTabSystem').style.display = 'none';
          
          // Act as "Undo to the very beginning" instead of clearing history
          // Replace 'historyStack' and 'currentIndex' with your actual variable names
          if (typeof historyStack !== 'undefined' && historyStack.length > 0) {
              currentIndex = 0; 
              // Call your existing function that restores the state based on index
              // restoreState(historyStack[0]); 
              
              // Update UI to highlight the first log
              updateLogHighlight(); 
          } else {
              // Only clear if there is absolutely no history
              originalSnapshotState.clear();
          }
        }
```

### 2. Modify your Undo and Redo functions
Remove any logic that deletes log elements from the DOM or uses `.pop()` on your history array. Only change the index and update the visual highlight.

**Locate:** Your `undo()` and `redo()` functions.

**Replace the internal logic with:**
```javascript
function performUndo() {
    // Only move the pointer backward, do not delete the log item
    if (currentIndex > 0) {
        currentIndex--;
        
        // Restore the content state here using your existing state restoration logic
        // processContent(historyStack[currentIndex]);
        
        updateLogHighlight();
    }
}

function performRedo() {
    // Only move the pointer forward
    if (currentIndex < historyStack.length - 1) {
        currentIndex++;
        
        // Restore the content state here
        // processContent(historyStack[currentIndex]);
        
        updateLogHighlight();
    }
}
```

### 3. Modify the "Save New Action / Log" function
This is the **only** place where future logs should be deleted. If you undo 3 steps and then do a *new* action, the 3 future undone steps must be overwritten.

**Locate:** The function where you push a new state to your history stack and append a new log to the UI.

**Modify to include this logic before pushing:**
```javascript
function saveNewState(newState, logMessage) {
    // If we are currently not at the end of the stack (meaning we have undone previously)
    if (currentIndex < historyStack.length - 1) {
        // 1. Truncate the future history array
        historyStack.splice(currentIndex + 1);
        
        // 2. Remove the future log items from the DOM
        // Replace 'logListContainer' with the actual ID of your <ul> or <div> holding the logs
        const logList = document.getElementById('logListContainer'); 
        while (logList.children.length > currentIndex + 1) {
            logList.removeChild(logList.lastChild);
        }
    }

    // Now proceed with normal pushing
    historyStack.push(newState);
    currentIndex++;
    
    // Add your new log to the DOM here
    // appendLogToDOM(logMessage);
    
    updateLogHighlight();
}
```

### 4. Add the Log Highlighting UI logic
Add this helper function to handle the visual highlighting of your log items without removing them. 

**Add this new function:**
```javascript
// Add this helper function to update the visual state of the logs
function updateLogHighlight() {
    // Replace '.log-item' with the actual CSS class or tag of your log entries
    const logItems = document.querySelectorAll('.log-item'); 
    
    logItems.forEach((item, index) => {
        if (index === currentIndex) {
            // Highlight the current active state
            item.classList.add('active-log-highlight');
            
            // Optional: Scroll the active log into view
            item.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
        } else {
            // Remove highlight from previous/future states
            item.classList.remove('active-log-highlight');
        }
    });
}
```

*(Note: You will need to add `.active-log-highlight { background-color: yellow; font-weight: bold; }` or similar to your CSS block).*
https://ejsoon.vip/
弈趣極光:享受思維樂趣
回复
  • 相似主题
    回复总数
    阅读次数
    最新帖子

在线用户

正浏览此版面之用户: 没有注册用户 和 4 访客