{"id":637,"date":"2025-09-18T16:23:38","date_gmt":"2025-09-18T21:23:38","guid":{"rendered":"http:\/\/129.153.53.180\/?page_id=637"},"modified":"2025-11-05T11:52:36","modified_gmt":"2025-11-05T16:52:36","slug":"speler","status":"publish","type":"page","link":"https:\/\/brainwashed.me\/index.php\/speler\/","title":{"rendered":"\u0421\u043f\u044d\u043b\u044d\u0440"},"content":{"rendered":"\n<p>\u041d\u0435-<a href=\"https:\/\/yandex.ru\/dev\/speller\/\" target=\"_blank\" rel=\"noopener\" title=\"\">\u042f\u043d\u0434\u0435\u043a\u0441<\/a> \u0421\u043f\u044d\u043b\u044d\u0440 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0444\u0440\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430\u0445. \u042f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u044d\u043b\u044c \u0421\u043f\u044d\u043b\u044d\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 (\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442) \u0445\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u0438 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u041e\u0446\u0435\u043d\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0421\u043f\u044d\u043b\u044d\u0440\u0430<\/h2>\n\n\n\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438: \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <em>\u0430\u0442\u0430\u0431\u0430\u0441\u043a\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 (\u0437\u0430\u043f\u0430\u0434\u043d\u044b\u0435 \u0430\u043f\u0430\u0447\u0438 \u0438 \u043d\u0430\u0432\u0430\u0445\u043e)<\/em> &#8211; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<title>Editable Highlighter<\/title>\n<style>\n  .mismatch {\n    background-color: #ffb3b3;\n    cursor: pointer;\n    position: relative;\n    padding: 2px 4px;\n    border-radius: 3px;\n  }\n\n  .tooltip {\n    display: none;\n    position: absolute;\n    background: #fff;\n    border: 1px solid #000;\n    padding: 2px 5px;\n    white-space: nowrap;\n    z-index: 10;\n  }\n\n  .tooltip div {\n    padding: 2px 4px;\n    cursor: pointer;\n  }\n\n  .tooltip div:hover {\n    background: #eee;\n  }\n\n  \/* Loading spinner styles *\/\n  .spinner {\n    border: 2px solid #f3f3f3;\n    border-top: 2px solid #007bff;\n    border-radius: 50%;\n    width: 16px;\n    height: 16px;\n    animation: spin 1s linear infinite;\n    display: inline-block;\n    margin-right: 8px;\n    vertical-align: middle;\n  }\n\n  @keyframes spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n  }\n\n  button:disabled {\n    opacity: 0.6;\n    cursor: not-allowed;\n  }\n\n  \/* Language display styles - ABOVE the text box *\/\n  .language-display {\n    position: absolute;\n    top: -30px; \/* Position above the text box *\/\n    right: 0;\n    background: #f0f0f0;\n    padding: 4px 8px;\n    border-radius: 4px;\n    font-size: 12px;\n    border: 1px solid #ccc;\n  }\n\n  .container {\n    position: relative;\n    width: 500px;\n    margin: 40px auto;\n  }\n\n  \/* Add some top margin to the container to make space for the language display *\/\n  body {\n    padding: 20px;\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"container\">\n  <div id=\"languageDisplay\" class=\"language-display\" style=\"display: none;\">\n    Language: <span id=\"languageValue\"><\/span>\n  <\/div>\n  \n  <div id=\"editor\" contenteditable=\"true\" \n       style=\"width: 500px; min-height: 100px; border:1px solid #ccc; padding:5px; white-space: pre-line;\"><\/div>\n  <br>\n  <button id=\"processBtn\" style=\"background-color: yellow; color: black;\" onclick=\"processText()\">\n    \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442\n  <\/button>\n<\/div>\n\n<script>\nconst lambdaUrl = \"https:\/\/2xwr6npajmapahgb37nrmju7km0pflph.lambda-url.us-east-2.on.aws\/\";\n\nfunction showLoading(button) {\n  button.disabled = true;\n  button.innerHTML = '<span class=\"spinner\"><\/span>\u041d\u0430\u043f\u0440\u044f\u0433 \u0442\u0430\u043a \u043d\u0430\u043f\u0440\u044f\u0433...';\n}\n\nfunction hideLoading(button) {\n  button.disabled = false;\n  button.innerHTML = '\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442';\n}\n\nfunction showLanguage(language) {\n  const display = document.getElementById('languageDisplay');\n  const valueSpan = document.getElementById('languageValue');\n  \n  if (language && language !== 'unknown') {\n    valueSpan.textContent = language;\n    display.style.display = 'block';\n  } else {\n    display.style.display = 'none';\n  }\n}\n\nasync function getJSONfromLLM(text) {\n  if (!text) return;\n\n  try {\n    const res = await fetch(lambdaUrl, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ prompt: text })\n    });\n\n    const data = await res.json();\n    return data.output || \"No response\";\n    \n  } catch (err) {\n    throw new Error(\"Error: \" + err.message);\n  }\n}\n\nasync function processText() {\n  const button = document.getElementById('processBtn');\n  showLoading(button);\n  \n  try {\n    const editor = document.getElementById('editor');\n    const input = editor.innerText.trim();\n    \n    if (!input) {\n      alert(\"Please enter some text first\");\n      hideLoading(button);\n      return;\n    }\n    \n    const jsonResponse = await getJSONfromLLM(input);\n    const parsedResponse = JSON.parse(jsonResponse);\n    const wordData = parsedResponse[\"text\"];\n    \n    \/\/ Display the detected language\n    showLanguage(parsedResponse[\"language\"]);\n\n    \/\/ Split the input into words, spaces, and more punctuation\n    const tokens = input.split(\/(\\s+|[.,!?;:\"'()\\-])\/).filter(token => token !== '');\n    \n    let result = '';\n    \n    for (const token of tokens) {\n      \/\/ If it's whitespace or punctuation, add it directly\n      if (\/^\\s+$\/.test(token) || \/^[.,!?;:\"'()\\-]$\/.test(token)) {\n        result += token;\n        continue;\n      }\n      \n      \/\/ It's a word - check if it needs highlighting (case-insensitive lookup)\n      const word = token;\n      const lowerWord = word.toLowerCase();\n      let valueList = null;\n      \n      for (const key in wordData) {\n        if (key.toLowerCase() === lowerWord) {\n          valueList = wordData[key];\n          break;\n        }\n      }\n      \n      if (valueList && !valueList.some(v => v.toLowerCase() === lowerWord)) {\n        const tooltipId = \"tip-\" + Math.random().toString(36).substr(2, 9);\n        let tooltipHTML = `<div id=\"${tooltipId}\" class=\"tooltip\">`;\n        for (const v of valueList) {\n          tooltipHTML += `<div onclick=\"replaceWord(this, '${v.replace(\/'\/g, \"\\\\'\")}')\">${v}<\/div>`;\n        }\n        tooltipHTML += \"<\/div>\";\n        result += `<span class=\"mismatch\" onmouseenter=\"showTooltip(event, '${tooltipId}')\" \n                   onmouseleave=\"hideTooltip('${tooltipId}')\">${word}${tooltipHTML}<\/span>`;\n      } else {\n        result += word;\n      }\n    }\n\n    editor.innerHTML = result;\n    \n  } catch (err) {\n    console.error(\"Error:\", err);\n    alert(\"Processing error: \" + err.message);\n  } finally {\n    hideLoading(button);\n  }\n}\n\nfunction showTooltip(event, id) {\n  const tooltip = document.getElementById(id);\n  if (tooltip) {\n    tooltip.style.display = \"block\";\n    tooltip.style.left = \"0px\";\n    tooltip.style.top = \"1.5em\";\n  }\n}\n\nfunction hideTooltip(id) {\n  const tooltip = document.getElementById(id);\n  if (tooltip) {\n    tooltip.style.display = \"none\";\n  }\n}\n\nfunction replaceWord(el, newWord) {\n  const span = el.closest(\".mismatch\");\n  if (span) {\n    span.outerHTML = newWord;\n  }\n}\n<\/script>\n\n<\/body>\n<\/html>\n\n\n\n<p>\u041d\u0438\u0431\u0438\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439<strong> API Endpoint:<\/strong>&nbsp;<br><code>POST https:\/\/2xwr6npajmapahgb37nrmju7km0pflph.lambda-url.us-east-2.on.aws\/<\/code><br><br><strong>Request<\/strong>:&nbsp;<br><code>{\"prompt\": \"your text\"}<\/code><br><strong>Response<\/strong>:<br>{<br>  &#8220;language&#8221;: &#8220;detected language&#8221;,<br>  &#8220;text&#8221;: {&#8220;word&#8221;: [&#8220;suggestion1&#8221;, &#8220;suggestion2&#8221;, &#8220;suggestion3&#8221;]}<br>}<br><br><strong>Example:<\/strong><br>{ &#8220;language&#8221;: &#8220;Russian&#8221;, &#8220;text&#8221;: { &#8220;\u041d\u0435-\u042f\u043d\u0434\u0435\u043a\u0441&#8221;: [&#8220;\u041d\u0435-\u042f\u043d\u0434\u0435\u043a\u0441&#8221;, &#8220;\u041d\u0435\u044f\u043d\u0434\u0435\u043a\u0441&#8221;], &#8221; &#8220;: [&#8221; &#8220;], &#8220;\u0421\u043f\u044d\u043b\u044d\u0440&#8221;: [&#8220;\u0421\u043f\u0435\u043b\u043b\u0435\u0440&#8221;, &#8220;\u0421\u043f\u0435\u043b\u043b\u0435\u0440&#8221;], &#8220;\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442&#8221;: [&#8220;\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442&#8221;, &#8220;\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442&#8221;], &#8220;\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c&#8221;: [&#8220;\u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c&#8221;], &#8220;\u0438&#8221;: [&#8220;\u0438&#8221;], &#8220;\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c&#8221;: [&#8220;\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c&#8221;], &#8220;\u0430\u0440\u0444\u0430\u0433\u0440\u043e\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445&#8221;: [&#8220;\u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445&#8221;], &#8220;\u043e\u0448\u0438\u0431\u043a\u0438&#8221;: [&#8220;\u043e\u0448\u0438\u0431\u043a\u0438&#8221;], &#8220;\u0432&#8221;: [&#8220;\u0432&#8221;], &#8220;\u043a\u0430\u043a\u0438\u0445-\u0442\u043e&#8221;: [&#8220;\u043a\u0430\u043a\u0438\u0445-\u0442\u043e&#8221;], &#8220;\u0442\u0435\u043a\u0441\u0442\u0430\u0445&#8221;: [&#8220;\u0442\u0435\u043a\u0441\u0442\u0430\u0445&#8221;], &#8220;.&#8221;: [&#8220;.&#8221;], &#8220;\u042f\u0437\u044b\u043a\u043e\u0432\u0430\u044f&#8221;: [&#8220;\u042f\u0437\u044b\u043a\u043e\u0432\u0430\u044f&#8221;], &#8220;\u043c\u043e\u0434\u044d\u043b\u044c&#8221;: [&#8220;\u043c\u043e\u0434\u0435\u043b\u044c&#8221;], &#8220;\u0421\u043f\u044d\u043b\u044d\u0440\u0430&#8221;: [&#8220;\u0421\u043f\u0435\u043b\u043b\u0435\u0440\u0430&#8221;], &#8220;\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442&#8221;: [&#8220;\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442&#8221;], &#8220;(&#8220;: [&#8220;(&#8220;], &#8220;\u0438&#8221;: [&#8220;\u0438&#8221;], &#8220;\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442)&#8221;: [&#8220;\u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442)&#8221;], &#8220;\u0445\u0437&#8221;: [&#8220;\u0445\u043e\u0442\u044c&#8221;, &#8220;\u043a\u0430\u043a&#8221;], &#8220;\u0441\u043a\u043e\u043b\u044c\u043a\u043e&#8221;: [&#8220;\u0441\u043a\u043e\u043b\u044c\u043a\u043e&#8221;], &#8220;\u0441\u043b\u043e\u0432&#8221;: [&#8220;\u0441\u043b\u043e\u0432&#8221;], &#8220;\u0438&#8221;: [&#8220;\u0438&#8221;], &#8220;\u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439&#8221;: [&#8220;\u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439&#8221;] } }<br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041d\u0435-\u042f\u043d\u0434\u0435\u043a\u0441 \u0421\u043f\u044d\u043b\u044d\u0440 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0444\u0440\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430\u0445. \u042f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u044d\u043b\u044c \u0421\u043f\u044d\u043b\u044d\u0440\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 (\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442) \u0445\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u0438 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0439. \u041e\u0446\u0435\u043d\u0438\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0421\u043f\u044d\u043b\u044d\u0440\u0430 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438: \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u0442\u0430\u0431\u0430\u0441\u043a\u0441\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 (\u0437\u0430\u043f\u0430\u0434\u043d\u044b\u0435 \u0430\u043f\u0430\u0447\u0438 \u0438 \u043d\u0430\u0432\u0430\u0445\u043e) &#8211; \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c. Editable Highlighter Language: \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u041d\u0438\u0431\u0438\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 API Endpoint:&nbsp;POST https:\/\/2xwr6npajmapahgb37nrmju7km0pflph.lambda-url.us-east-2.on.aws\/ Request:&nbsp;{&#8220;prompt&#8221;: &#8220;your text&#8221;}Response:{ &#8220;language&#8221;: &#8220;detected language&#8221;, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-637","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/pages\/637","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/comments?post=637"}],"version-history":[{"count":40,"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/pages\/637\/revisions"}],"predecessor-version":[{"id":703,"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/pages\/637\/revisions\/703"}],"wp:attachment":[{"href":"https:\/\/brainwashed.me\/index.php\/wp-json\/wp\/v2\/media?parent=637"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}