(maybeNotebook: MaybeNotebook<T>)
| 37 | |
| 38 | // Note: Assumes that all notebooks are Python. |
| 39 | export function computeTextAndOffsets<T>(maybeNotebook: MaybeNotebook<T>): TextAndOffsets { |
| 40 | const textModels = maybeNotebook.textModels ?? []; |
| 41 | const modelLanguage = maybeNotebook.getLanguage(maybeNotebook.currentTextModel, undefined); |
| 42 | const modelIsMarkdown = modelLanguage === Language.MARKDOWN; |
| 43 | const modelIsExpected = isAllowedLanguage(modelLanguage); |
| 44 | const relevantDocumentTexts: string[] = []; |
| 45 | let additionalUtf8ByteOffset = 0; |
| 46 | let found = false; |
| 47 | for (const [idx, previousModel] of textModels.entries()) { |
| 48 | if (modelIsExpected && maybeNotebook.currentTextModel === previousModel) { |
| 49 | // There is an offset for all previous cells and the \n\n spacing after each one. |
| 50 | additionalUtf8ByteOffset = |
| 51 | relevantDocumentTexts |
| 52 | .map((el) => numCodeUnitsToNumUtf8Bytes(el)) |
| 53 | .reduce((a, b) => a + b, 0) + |
| 54 | '\n\n'.length * relevantDocumentTexts.length; |
| 55 | found = true; |
| 56 | } |
| 57 | const previousModelLanguage = maybeNotebook.getLanguage(previousModel, idx); |
| 58 | if (modelIsExpected && !modelIsMarkdown) { |
| 59 | // Don't use markdown in the Python prompt construction. |
| 60 | // TODO(prem): Consider adding as comments. |
| 61 | if (previousModelLanguage === Language.MARKDOWN) { |
| 62 | continue; |
| 63 | } else if (previousModelLanguage === modelLanguage) { |
| 64 | relevantDocumentTexts.push(maybeNotebook.getText(previousModel)); |
| 65 | } |
| 66 | } else if (modelIsMarkdown) { |
| 67 | if (previousModelLanguage === Language.MARKDOWN) { |
| 68 | relevantDocumentTexts.push(maybeNotebook.getText(previousModel)); |
| 69 | } else if (isAllowedLanguage(previousModelLanguage)) { |
| 70 | relevantDocumentTexts.push( |
| 71 | `\`\`\`${ |
| 72 | NOTEBOOK_LANGUAGES[previousModelLanguage as AllowedLanguages] |
| 73 | }\n${maybeNotebook.getText(previousModel)}\n\`\`\`` |
| 74 | ); |
| 75 | } |
| 76 | } |
| 77 | } |
| 78 | const currentModelText = maybeNotebook.getText(maybeNotebook.currentTextModel); |
| 79 | const text = found ? relevantDocumentTexts.join('\n\n') : currentModelText; |
| 80 | const utf8ByteOffset = numCodeUnitsToNumUtf8Bytes( |
| 81 | currentModelText, |
| 82 | maybeNotebook.utf16CodeUnitOffset |
| 83 | ); |
| 84 | return { |
| 85 | text, |
| 86 | utf8ByteOffset, |
| 87 | additionalUtf8ByteOffset, |
| 88 | }; |
| 89 | } |
no test coverage detected