diff --git a/content.js b/content.js index b0cdef7..5ab5c32 100644 --- a/content.js +++ b/content.js @@ -70,7 +70,6 @@ async function sendToOtherService(code) { } }) }) - console.log("[prompt]", JSON.stringify(prompt)); const data = await response.json(); if (/^\n/.test(data)) { data = data.replace(/^\n/, ''); @@ -79,14 +78,6 @@ async function sendToOtherService(code) { return data[0].generated_text; } -// 请求完毕后准备填入的代码 -let readyToFillCode = "" -// 是否正在请求(防止多次请求等问题) -let isRequtest = false -// 是否请求成功(防止用户在本次未请求完就按下Tab) -let isRequtestSuccess = false -// 请求时的输入框 (提供一边请求一边去别的单元格写代码的功能) -let requestingTextarea = null async function getCodeCompletion(code) { @@ -121,6 +112,58 @@ async function getOtherServiceUrlWrapper(code) { return await sendToOtherService(code) } +// Code to be filled in after request completion +let codeToFill = ""; +// Flag indicating whether a request is in progress (prevents multiple requests, etc.) +let isRequestInProgress = false; +// Flag indicating whether the request was successful (prevents filling in code before the request is complete) +let isRequestSuccessful = false; +// Textarea during the request (allows writing code in other cells while the request is in progress) +let activeRequestTextarea = null; + +// Adds an event listener for filling in code after the request is completed +const addFillCodeKeyListener = (event) => { + if (event.ctrlKey && !isRequestInProgress && isRequestSuccessful) { + event.preventDefault(); + + // Get the previously existing animated text element (if any) + // If it doesn't exist, it's assumed that the user doesn't need the code + const animationElementList = document.querySelectorAll(".per-insert-code"); + + // If the animated text element exists, it's assumed that the user wants to insert the code into the code block + if (animationElementList.length === 1) { + insertSuggestion(codeToFill); + } + + // Reset the request successful flag + isRequestSuccessful = false; + } +}; + +function insertSuggestion(suggestion) { + // Focus the textarea, otherwise, it is not possible to insert the suggestion using the Tab key from another location + activeRequestTextarea.focus(); + + // Get the current cursor position + const cursorPosition = activeRequestTextarea.selectionStart; + + // Insert the suggestion at the cursor position + const newValue = activeRequestTextarea.value.slice(0, cursorPosition) + suggestion + activeRequestTextarea.value.slice(cursorPosition); + activeRequestTextarea.value = newValue; + + // Update the cursor position after inserting the suggestion + const newCursorPosition = cursorPosition + suggestion.length; + activeRequestTextarea.selectionStart = activeRequestTextarea.selectionEnd = cursorPosition + suggestion.length; + + // Trigger an input event on the textarea to update the CodeMirror instance + const event = new Event('input', { bubbles: true, cancelable: true }); + activeRequestTextarea.dispatchEvent(event); + + // Trigger a keydown event with Tab key to perform auto-indentation + const tabEvent = new KeyboardEvent('keydown', { key: 'Tab' }); + activeRequestTextarea.dispatchEvent(tabEvent); +} + // Check if the current page is a Jupyter Notebook if (document.querySelector('body.notebook_app')) { @@ -130,32 +173,32 @@ if (document.querySelector('body.notebook_app')) { // 防止默认事件 event.preventDefault(); - if (isRequtest || isRequtestSuccess) { + if (isRequestInProgress || isRequestSuccessful) { return } // 获取当前输入框的Textarea const activeTextarea = document.activeElement; - requestingTextarea = activeTextarea + activeRequestTextarea = activeTextarea // 从当前输入框的Textarea获取当前输入框(单元格) const activeCell = activeTextarea.parentElement.parentElement if (activeCell) { // Retrieve the content of the active cell - const code = getCellContent(activeCell); + const code = getCellContentText(activeCell); // 开始动画 const [animationInterval, animationElement] = startWaitingAnimation(activeCell) - isRequtest = true + isRequestInProgress = true const suggestion = await getCodeCompletion(code) if (suggestion) { clearInterval(animationInterval) - isRequtestSuccess = true - isRequtest = false - readyToFillCode = suggestion + isRequestSuccessful = true + isRequestInProgress = false + codeToFill = suggestion // 将文字动画框的内容替换成code animationElement.innerHTML = suggestion @@ -165,102 +208,51 @@ if (document.querySelector('body.notebook_app')) { } } }); - - function getCellContent(cell) { - const allCells = document.querySelectorAll('.cell .input_area .CodeMirror'); - const codeMirrorLines = cell.querySelectorAll('.CodeMirror-code pre'); - const contextContent = getPreviousCellsContent(cell, allCells); - - const content = []; - - codeMirrorLines.forEach((line) => { - content.push(line.textContent); - }); - - const cellContent = content.join('\n'); - console.log("[context]", JSON.stringify(contextContent)) - console.log("[cell]", JSON.stringify(cellContent)) - if (contextContent) { - return contextContent + "" + cellContent; - } - return cellContent; - // return contextContent + '\n' + cellContent; - } -} - - -// 添加tab监听器,用户请求完毕后按下tab键填入代码 -const addTabEvent = (event) => { - if (event.ctrlKey && !isRequtest && isRequtestSuccess) { - event.preventDefault(); - - // 获取之前的动画文字Dom(有且只能存在一个或者不存在),如果之前的动画文字框不存在,则在逻辑中认为用户不需要这段代码 - const animationElementList = document.querySelectorAll(".per-insert-code") - - // 动画文字Dom存在,则在逻辑中认为用户想把这段代码插入到代码块中 - if(animationElementList.length == 1){ - insertSuggestion(readyToFillCode) - } - - //关闭请求成功的状态 - isRequtestSuccess = false - } + document.addEventListener('keydown', addFillCodeKeyListener); } +function getCellContentText(activeCell) { -document.addEventListener('keydown', addTabEvent) + const cellElements = Array.from(document.querySelectorAll('.cell')); + const activeCellIndex = cellElements.findIndex(cell => cell.contains(activeCell)); + // Check if there are at least 3 cells before the active cell -function insertSuggestion(suggestion) { - // 获取焦点,否则无法从其他位置按下Tab插入 - requestingTextarea.focus(); - - // Get the current cursor position - const cursorPosition = requestingTextarea.selectionStart; - - // Insert the suggestion at the cursor position - const newValue = requestingTextarea.value.slice(0, cursorPosition) + suggestion + requestingTextarea.value.slice(cursorPosition); - requestingTextarea.value = newValue; + let combinedContent = ""; - // Update the cursor position after inserting the suggestion - const newCursorPosition = cursorPosition + suggestion.length; - requestingTextarea.selectionStart = requestingTextarea.selectionEnd = cursorPosition + suggestion.length; + // Iterate through the last 3 cells before the active cell + const startIndex = activeCellIndex - 3 < 0 ? 0 : activeCellIndex - 3; + for (let i = startIndex; i <= activeCellIndex; i++) { + const cellElement = cellElements[i]; - // Trigger an input event on the textarea to update the CodeMirror instance - const event = new Event('input', { bubbles: true, cancelable: true }); - requestingTextarea.dispatchEvent(event); - - // Trigger a keydown event with Tab key to perform auto-indentation - const tabEvent = new KeyboardEvent('keydown', { key: 'Tab' }); - requestingTextarea.dispatchEvent(tabEvent); -} - - - -function getPreviousCellsContent(activeCell, allCells) { - const previousCellsContent = []; - let codeCellCount = 0; - - for (const cell of allCells) { - // Stop when the active cell is reached or when three code cells have been processed - if (cell === activeCell) break; - - // Check if the cell is a code cell - const isCodeCell = cell.closest('.cell').classList.contains('code_cell'); - if (isCodeCell) { - const cellContent = getCellContent(cell); - previousCellsContent.push(cellContent); // Add the content to the end of the array - codeCellCount++; + if (cellElement.classList.contains('code_cell')) { + const code = extractTextFromCell(cellElement); + combinedContent += `${code}`; + const outputElement = cellElement.querySelector('.output_subarea'); + if (outputElement) { + if (i !== activeCellIndex) { + combinedContent += ``; + combinedContent += outputElement.textContent; + } + } + } else if (cellElement.classList.contains('text_cell')) { + const text = extractTextFromCell(cellElement); + combinedContent += `${text}`; } } - // Reverse the array to have the content in the correct order - const lastThreeCellsContent = previousCellsContent.slice(-3); - - return lastThreeCellsContent.join(''); + return combinedContent; } +function extractTextFromCell(cell) { + const codeMirrorLines = cell.querySelectorAll('.CodeMirror-code pre'); + const content = []; + codeMirrorLines.forEach((line) => { + content.push(line.textContent); + }); + return content.join('\n'); +} // 开始等待动画,有30s等待时间,如果等待时间过了,出现“error”字体,返回两个值如下,接收:"const [animationInterval, animationElement] = startWaitingAnimation(activeCall)" // 1. animationInterval(interval, 动画计时器),可使用clearInterval(animationInterval)消除动画, 每次请求完毕必须要关掉 diff --git a/examples/sklearn_digits.ipynb b/examples/sklearn_digits.ipynb index fbd66e3..c5736c0 100644 --- a/examples/sklearn_digits.ipynb +++ b/examples/sklearn_digits.ipynb @@ -11,49 +11,31 @@ ] }, { - "cell_type": "code", - "execution_count": 2, - "id": "ffe12cc8", + "cell_type": "markdown", + "id": "bdc6d694", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of images: 1797\n", - "Number of labels: 1797\n" - ] - } - ], "source": [ - "# Print to show there are 1797 images (8 by 8 images for a dimensionality of 64)\n", - "# Print to show there are 1797 labels (integers from 0–9)\n" + "Print to show there are 1797 images (8 by 8 images for a dimensionality of 64)\n", + "\n", + "Print to show there are 1797 labels (integers from 0–9)" ] }, { "cell_type": "code", - "execution_count": 3, - "id": "be53a702", + "execution_count": null, + "id": "c164026e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f3c71c94", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], "source": [ - "# Showing the Images and the Labels (Digits Dataset)\n", - "# This section is really just to show what the images and labels\n", - "# look like. It usually helps to visualize your data to see\n", - "# what you are working with.\n" + "Showing the Images and the Labels (Digits Dataset)\n", + "\n", + "This section is really just to show what the images and labels look like. It usually helps to visualize your data to see what you are working with.\n" ] }, { @@ -86,4 +68,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +}