| 4927 | 4927 | } |
| 4928 | 4928 | |
| 4929 | 4929 | const params = await itemizedParams(itemizedPrompts, thisPromptSet); |
| 4930 | + const flatten = (rawPrompt) => Array.isArray(rawPrompt) ? rawPrompt.map(x => x.content).join('\n') : rawPrompt; |
| 4930 | 4931 | |
| 4931 | 4932 | const template = params.this_main_api == 'openai' |
| 4932 | 4933 | ? await renderTemplateAsync('itemizationChat', params) |
| 4933 | 4934 | : await renderTemplateAsync('itemizationText', params); |
| 4934 | 4935 | |
| 4935 | 4936 | const popup = new Popup(template, POPUP_TYPE.TEXT); |
| 4937 | + |
| 4938 | + /** @type {HTMLElement} */ |
| 4939 | + const diffPrevPrompt = popup.dlg.querySelector('#diffPrevPrompt'); |
| 4936 | 4940 | if (priorPromptArrayItemForRawPromptDisplay) { |
| 4937 | 4941 | popup.dlg.querySelector('#diffPrevPrompt').style.display = ''; |
| 4938 | 4942 | popup.dlg.querySelector('#diffPrevPrompt').addEventListener('click', function () { |
| 4939 | 4943 | varconst dmp = new diff_match_patch(); |
| 4940 | 4944 | varconst text1 = flatten(itemizedPrompts[priorPromptArrayItemForRawPromptDisplay].rawPrompt); |
| 4941 | 4945 | varconst text2 = flatten(itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt); |
| 4942 | 4946 | |
| 4943 | 4947 | dmp.Diff_Timeout = 2.0; |
| 4944 | 4948 | |
| 4945 | 4949 | varconst d = dmp.diff_main(text1, text2); |
| 4946 | 4950 | varlet ds = dmp.diff_prettyHtml(d); |
| 4947 | | - |
| 4948 | 4951 | // make it readable |
| 4949 | 4952 | ds = ds.replaceAll("'background:#e6ffe6;"', "'background:#b9f3b9; color:black;"'); |
| 4950 | 4953 | ds = ds.replaceAll("'background:#ffe6e6;"', "'background:#f5b4b4; color:black;"'); |
| 4951 | 4954 | ds = ds.replaceAll("'¶"', ""''); |
| 4952 | | - ds = "<div style='display:block;'>" + ds + "</div>"; |
| 4955 | + const container = document.createElement('div'); |
| 4956 | + container.innerHTML = DOMPurify.sanitize(ds); |
| 4953 | 4957 | const rawPromptWrapper = document.getElementById('rawPromptWrapper'); |
| 4954 | | - rawPromptWrapper.innerHTML = ds; |
| 4958 | + rawPromptWrapper.replaceChildren(container); |
| 4955 | 4959 | $('#rawPromptPopup').slideToggle(); |
| 4956 | 4960 | }); |
| 4957 | 4961 | } else { |
| 4958 | 4962 | popup.dlg.querySelector('#diffPrevPrompt').style.display = 'none'; |
| 4959 | 4963 | } |
| 4960 | 4964 | popup.dlg.querySelector('#copyPromptToClipboard').addEventListener('click', function () { |
| 4961 | 4965 | let rawPrompt = itemizedPrompts[PromptArrayItemForRawPromptDisplay].rawPrompt; |