יום חמישי, 5 בספטמבר 2024

ChatGPT - תיקון ימין-שמאל בכתיבת עברית

כתבתי כמה תיקונים לעבודה נוחה יותר עם chatGpt.
ניתן להוריד את התוסף מחנות גוגל כרום

במידה ואין אפשרות להתקנת תוספים בדפדפן שלך, אפשר להשתמש בתוסף באחת מהדרכים הבאות:

דרך ראשונה
  • יש ללחוץ ctrl+D כדי להוסיף bookmark, ואז לערוך את הבוקמרק ולשנות את שדה "כתובת האתר" לקוד שכתבתי כאן:

  1. לחץ כאן כדי להעתיק את הקוד
  2. לחץ ctrl+d
  3. שנה את שם הסימניה, ובמקום כתובת, הדבק את הטקסט שהעתקת בסעיף 1

javascript:(function(){let textareaDirection='rtl';function toggleDirection(){textareaDirection=textareaDirection==='rtl'?'ltr':'rtl';const textarea=document.querySelector('#prompt-textarea');if(textarea){textarea.style.direction=textareaDirection;}const img=document.querySelector('#direction-toggle-button img');if(img){img.style.transform=textareaDirection==='ltr'?'scaleX(-1)':'scaleX(1)';}}function toggleMarkdownDirection(){const markdowns=document.querySelectorAll('.markdown');markdowns.forEach(el=>{el.dir=el.dir==='rtl'?'ltr':'rtl';});const img=document.querySelector('#markdown-toggle-button img');if(img){img.style.transform=img.style.transform==='scaleX(-1)'?'scaleX(1)':'scaleX(-1)';}}function toggleWhitespaceStyle(){document.querySelectorAll('.whitespace-pre-wrap').forEach(el=>{const isActive=el.classList.contains('styled-q');if(isActive){el.classList.remove('styled-q');el.style.border='';el.style.borderRadius='';el.style.background='';}else{el.classList.add('styled-q');el.style.border='1px solid red';el.style.borderRadius='10px';el.style.background='lightyellow';}});}function jumpToNext(){const messages=document.querySelectorAll('[data-message-author-role]');let current=[...messages].findIndex(m=>m.getBoundingClientRect().top>100);if(current!==-1&&messages[current]){messages[current].scrollIntoView({behavior:'smooth',block:'start'});}}function jumpToPrevious(){const messages=[...document.querySelectorAll('[data-message-author-role]')];if(messages.length===0)return;let index=messages.findIndex(m=>m.getBoundingClientRect().top>=10);if(index===-1){index=messages.length;}if(index>0){messages[index-1].scrollIntoView({behavior:'smooth',block:'start'});}}function toggleQButtonGlow(){const qButton=document.querySelector('#q-style-toggle-button');if(!qButton)return;const glowing=qButton.classList.toggle('glowing-q');if(glowing){qButton.style.boxShadow='0 0 10px 4px yellow';}else{qButton.style.boxShadow='0 2px 6px rgba(0,0,0,0.2)';}}function createTooltip(btn){let tooltip=document.createElement('div');tooltip.textContent='Snir Elgabsi';tooltip.style.cssText=`position:absolute;bottom:120%;left:50%;transform:translateX(-50%) scale(0.5);padding:5px 10px;background:rgba(0,0,0,0.7);color:white;border-radius:6px;font-size:0.9rem;opacity:0;transition:opacity 0.3s ease, transform 0.3s ease;pointer-events:auto;cursor:pointer;z-index:10000;white-space:nowrap;`;tooltip.onclick=()=>{window.open('https://snir.blogspot.com','_blank');};btn.appendChild(tooltip);setTimeout(()=>{tooltip.style.opacity='1';tooltip.style.transform='translateX(-50%) scale(1)';},30);setTimeout(()=>{tooltip.style.opacity='0';tooltip.style.transform='translateX(-50%) scale(0.5)';setTimeout(()=>{if(tooltip.parentElement){tooltip.remove();}},300);},5030);btn._tooltip=tooltip;}function removeTooltip(btn){if(btn._tooltip){btn._tooltip.style.opacity='0';btn._tooltip.style.transform='translateX(-50%) scale(0.5)';setTimeout(()=>{if(btn._tooltip){btn._tooltip.remove();btn._tooltip=null;}},300);}}function addTooltipEvents(btn){let hoverTimeout=null;let leaveTimeout=null;btn.addEventListener('mouseenter',()=>{clearTimeout(leaveTimeout);hoverTimeout=setTimeout(()=>createTooltip(btn),1500);});btn.addEventListener('mouseleave',()=>{clearTimeout(hoverTimeout);leaveTimeout=setTimeout(()=>removeTooltip(btn),1000);});}function makeButtonImage(id,title,imgSrc,imgAlt,clickHandler){const btn=document.createElement('button');btn.id=id;btn.title=title;btn.style.cssText='width:2.2rem;height:2.2rem;border-radius:50%;background:white;color:black;border:1px solid lightgray;font-size:1.2rem;box-shadow:0 2px 6px rgba(0,0,0,0.2);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;position:relative;';btn.onmouseover=()=>btn.style.backgroundColor='#f0f0f0';btn.onmouseout=()=>btn.style.backgroundColor='white';btn.onclick=(e)=>{e.preventDefault();clickHandler();};const img=document.createElement('img');img.src=imgSrc;img.alt=imgAlt;img.style.cssText='width:1.5rem;height:1.5rem;object-fit:contain;pointer-events:none;';btn.appendChild(img);addTooltipEvents(btn);return btn;}const imgPromptDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD/UExURenp6c7OzrKysnl5eVZWVpOTkwAAAAEBAaGhoW1tbQMDA5ycnI2NjVtbW8bGxsjIyMrKyrGxscXFxd3d3dLS0ubm5ujo6IuLi3d3d+Li4uTk5E1NTezs7CYmJicnJ1BQUI6OjtXV1ZKSknZ2dpqamgICAt/f36ampnJyclxcXDk5OaqqqrCwsK+vr7+/v66urnR0dMPDw29vb+7u7rW1tSwsLIWFhUJCQkRERMTExNTU1AYGBsfHx3FxcWtra8nJybOzswQEBE5OTjMzM6mpqa2trdzc3OXl5UxMTKWlpUtLS52dnUlJSZ6enuPj40hISMvLy0ZGRqSkpOvr6wAAAKVmCqgAAABVdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCwoQfPAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgNS4xLjgbaeqoAAAAtmVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAACAAAAMQECABAAAABaAAAAaYcEAAEAAABqAAAAAAAAANl2AQDoAwAA2XYBAOgDAABQYWludC5ORVQgNS4xLjgAAwAAkAcABAAAADAyMzABoAMAAQAAAAEAAAAFoAQAAQAAAJQAAAAAAAAAAgABAAIABAAAAFI5OAACAAcABAAAADAxMDAAAAAA5X1phWJRlb4AAAFhSURBVEhL5ZRXV8JAEIUpurEiorGAHdGIxoYo9i5WbPP/f4uzmZFkl6xsXuV7yHLP3C9kYU9SkJh/rqTSmWyfQponRKfSLxBHXtoM8IjoUAa5PxSUHUeGYZ4RujLCXSFGc2P5cVwz+cIEDwlNmaS6JIvRxXWKJiGaMh3uYgbjLK5FmoRoSonqEktlbp7qEltlgeoS2wdbpLrEVllKvv1lqktsFVhp/5XWCpR/D5i9AquBUEmiwNq6t1FN9C0Bm8mVreSK36vKtievO0Ls4mKl7AmxXwM4qFcPMRWPGg2XBiGacoy3FSccDKhKQRp5DiYUxcpQlBwKpwUOZiLKmTzy9bJ3HsfFJbeiCv6gFe31HeWKa1GlVhLXfyg+15QHc2/Qub3L+HHcP3BL3X7zEe/2xMFMVIHmMzovHIwoChRf0XnjYEJVoPWOzgcHA5oCrU/xxR9N6Ap8dzmUMUp3eloB+AGGLqjp2OH2dAAAAABJRU5ErkJggg==';  const imgMarkdownDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAABOCAIAAAAByLdKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALeSURBVHhe7ZsxjuIwFIZTU+0RKLkBJWlX4gLT0SPtDZBAokFcAYFoqaDZFiqQQKKAHi5ARUvB/orfWCSZOF7ivDHM+ypiXvL7ix2HSCG4/xhE9R2xVV0ul61Wq1qtBiyEYXg+nynbEVaqCKYuMILT6tY2XzXtiU6UCsW4ts1R7Xa7FBsE+Ox8UqXBZUJ5EQ5tTarIoMAgwLVKrSWTUAWubE2qk8lEhWE8qal8tCpC9WR2YmtS1bP3W1Qxj4BDW5PqYyo1lU8i1KGt76rAle0LqAIntq+hCorbvowqKGj7SqqgiK2/qrirU1Ocp229U9W/W5BOTSmes/VOFVkqFBgcnrD1ThVoB/NT6//a+qiKTmsHAGH05Esey3JtfVQFjyNmj/m3uqeqAEOUGLdcUE87f4W/qhqkA6zMWegnsJdXzQXdU/0UVUJUI0TVO0Q1iahGiGqMTqdTq9VQ87s0cHBEIIgiU3CojkYjVcAD4ig4Dofq4XBQBTwcj0cKjsOhCi6Xy5oFBFFkCiZVHxDVJKIakat6vV7VnYaBRqOBOAqOw6E6GAxUAQ+Io+A4HKq3263ZbKoazS9H0OE+QRDiKDgOh6oniGoSUY2wUT2dTn9ZQBBFpuBQ3W63qoAHxFFwHA7V6XSqCnhAHAXH4VAFw+GwXq+j5qM0cHBEIIgiUzCp+oCoJhHVCBvV8Xj8x5per0e7RUsaWjabDW0XgEN1NpupAnva7TZ2nM/ntB0EWc8r9nCorlYrVWBPv9/Hjuv1Wm1WKhV1qCJwqILdboepaMlisaDd7vf9fo+W4kMKmFR9QFSTiGqEqHqHqCYR1QhR9Q5RTSKqET9RdZLxGr0nWP6hzaQKQ3UI89n6drSqeUhMqpgY+nVcb+ewnr2AmjLI+VqfMIDPue/HM5PoHrVmkKMKnnixnB90krqbTb4q0OuTn1guJVaqAFd8GIY4ef4Msvqnhv0iYqv6Bojq+3G//wN9rsRvy4i5OAAAAABJRU5ErkJggg==';  const imgPrevBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAfBJREFUaEPtmbtKxEAYheMFLdRCsRC0ULQTES+NPoBvoGAraKGlhdhaqGglgq1voAg2ViIi2KiVKIhY+wCijZdzMpOQ3WwmS8i/mV3ng4+Z2SXZPUn+mU3WczgcmemBx/AOrvMFm2nSbTkMcQ5n/JFiD26orpE+uAyT9p0XW7pNpBvewN8K7sI0pmClbfPWiClEYFqYCfgNK22bp4lUEyJwByZRyBkJrmOGYE3M+qPq4JnZVN0SBuE2bIaxD8yRRd2G9MJbWJ64GvehFfCotcIOf6S+HHmBT6obcgU/VTck2M4aOGXeQwZ5g8PwTI8Dl+BCZHwIrWQAnsAxf+R5FzAaZBWSFXiguvVBUhArMa2+DDKnuj5r8Eh1jbTBftUVhSUQIhFkHF7DFsgzKUWnblPJemlNwuh2UpbA6bchkAjyAz/gF+S6I2UJEjXSDjmVS/Oq21Tqavp1NWIbLohtSMxaQ5A3XdIHaV63qWSdtQq51ZU4alwQaU2RCMJ91rz2JGrEmgd0AW5lLwIXxDYaJojErNUFpyH3HVu4cuRSt6lknbUa6p499kHSSAWRXgxjSNTIKDyF0s+1RnTrIxGEZ5kPIKSJPUlJwv1EKQJTEP4BFIXXvLWYgjzDR/gA+e/VO7QWU7Hzvej7Qa04HP8Hz/sDd3810jpBBHcAAAAASUVORK5CYII=';  const imgNextBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAgVJREFUaEPtmT0vBEEYxw8JChJUEgoSNAoJKhIFn4HQShRIJKLSKBSiFSFK30BDR0RES0EkJOJTeCkE///uzGX2bs2eu3325TK/5Jdn9jY3e8/uM3O7swWHQ4YGFcPgPnP/jzJ3HMEHeAsf4RzMLLYrcgWn/KbHGtz3m1a64RK09R0H2ypGcg51OdEVWAlj0PyelAEaVYyTb2WiSCTCPiX6tWKrY5bWjN/0WIWHftNKH9yBTKasBGJkQcVIqh0jqZB4CUjhEskadZOIxKzVDHv8piivKnpIJDICr2ETlJx+21SMpNrpdxSa35MygBvsFnif9QY/4YegASTGSAvs9ZuivKgYibtFSQOXSNaom0QkZq1+uAulT9KsipFUO2u5xYdakEiEfSY+9iTGSN0s0KVC4iUghUska/wnEenBWxPmj+MzBF8bbMF7eAGnoUbPWstwCK7DMNrhOGTfZX9cMXKpYgBOmXyhwwNzdWIAnqlt7SKcN7b3YBipPLMTJsErwJ38R2Z8hk+qreWLHz5imp8dwFKYiO5H0gAcI1+Qz9hEl9ogZPmY8O1Vq98s8q5iKYmPJ33ADngKJ72tyuAd7qbfDDAMT6D0uhbLv4h55johk5nwtuz8lQThVeYChDRlKykmTOYGltajKZPIBbZkcpOEJiyZ3CWh6YLH8A5u8AOHw5FXCoVfKaQOUfKxTTgAAAAASUVORK5CYII=';const dirBtn=makeButtonImage('direction-toggle-button',textareaDirection==='rtl'?'כיוון כתיבה מימין לשמאל - Ctrl+Shift':'כיוון כתיבה משמאל לימין - Ctrl+Shift',imgPromptDir,'כיוון כתיבה',toggleDirection);dirBtn.querySelector('img').style.transform=textareaDirection==="ltr"?"scaleX(-1)":"scaleX(1)";const mdBtn=makeButtonImage('markdown-toggle-button','החלף כיוון כתיבה של התשובות',imgMarkdownDir,'כיוון תשובות',toggleMarkdownDirection);const qBtn=document.createElement('button');qBtn.id='q-style-toggle-button';qBtn.title='הפעל/בטל עיצוב על whitespace-pre-wrap';qBtn.textContent='Q';qBtn.style.cssText=dirBtn.style.cssText;qBtn.onclick=(e)=>{e.preventDefault();toggleWhitespaceStyle();toggleQButtonGlow();};addTooltipEvents(qBtn);const nextBtn=makeButtonImage('next-snir-button','קפוץ לשאלה הבאה - Alt+↓',imgNextBtn,'קפוץ לשאלה הבאה',jumpToNext);const prevBtn=makeButtonImage('prev-snir-button','קפוץ לשאלה הקודמת - Alt+↑',imgPrevBtn,'קפוץ לשאלה הקודמת',jumpToPrevious);function createButtons(){if(document.querySelector('#direction-toggle-button'))return;const textarea=document.querySelector('#prompt-textarea');const buttonContainer=textarea?.closest('form')?.querySelector('div.flex > div.flex');if(!textarea||!buttonContainer)return;let btnGroup=document.querySelector('#custom-btn-group');if(!btnGroup){btnGroup=document.createElement('div');btnGroup.id='custom-btn-group';btnGroup.style.cssText='position:absolute;bottom:13px;right:95px;display:flex;gap:10px;z-index:9999;';buttonContainer.style.position='relative';buttonContainer.appendChild(btnGroup);}btnGroup.appendChild(prevBtn);btnGroup.appendChild(nextBtn);btnGroup.appendChild(mdBtn);btnGroup.appendChild(dirBtn);}document.addEventListener('keydown',function(e){if(e.key==='ArrowUp'&&e.altKey){e.preventDefault();jumpToPrevious();}if(e.key==='ArrowDown'&&e.altKey){e.preventDefault();jumpToNext();}});document.addEventListener('keydown',function(e){if(e.ctrlKey&&e.shiftKey&&!e.altKey){e.preventDefault();toggleDirection();}});const observer=new MutationObserver(()=>{createButtons();});observer.observe(document.body,{childList:true,subtree:true});createButtons();toggleDirection();toggleDirection();})();


  1. לחץ כאן כדי להעתיק את הקוד
  2. לחץ ctrl+d
  3. שנה את שם הסימניה, ובמקום כתובת, הדבק את הטקסט שהעתקת בסעיף 1

דרך שניה

תוסף לדפדפן גוגל כרום

יש ליצור תיקיה חדשה ולשמור בתוכה את הקבצים הבאים:
  1. manifest.json
    {
      "manifest_version": 3,
      "name": "כיוון כתיבת עברית ב-ChatGPT",
      "version": "1.2",
      "author": "Snir Elgabsi",
      "description": "הוספת תפריט קטן לשינוי כיוון כתיבה ב-ChatGPT",
      "icons": {
        "16": "icon.png",
        "48": "icon.png",
        "128": "icon.png"
      },
      "content_scripts": [
        {
          "matches": [
            "https://chat.openai.com/*",
            "https://chatgpt.com/*"
          ],
          "js": [
            "content.js"
          ]
        }
      ],
      "permissions": [],
      "host_permissions": [
        "https://chat.openai.com/*"
        "https://chatgpt.com/*"
      ]
    }
    לחץ כאן כדי להעתיק את הקוד
  2. content.js
    javascript:(function(){
    let textareaDirection = localStorage.getItem('snir-textarea-direction') || 'rtl';
    
    function toggleDirection(){
      textareaDirection = textareaDirection === 'rtl' ? 'ltr' : 'rtl';
      localStorage.setItem('snir-textarea-direction', textareaDirection);
      const textarea = document.querySelector('#prompt-textarea');
      if(textarea){ textarea.style.direction = textareaDirection; }
      const img = document.querySelector('#direction-toggle-button img');
      if(img){ img.style.transform = textareaDirection === 'ltr' ? 'scaleX(-1)' : 'scaleX(1)'; }
    }
    
    function toggleMarkdownDirection(){
      const markdowns=document.querySelectorAll('.markdown');
      markdowns.forEach(el=>{el.dir=el.dir==='rtl'?'ltr':'rtl';});
      const img=document.querySelector('#markdown-toggle-button img');
      if(img){img.style.transform=img.style.transform==='scaleX(-1)'?'scaleX(1)':'scaleX(-1)';}
    }
    
    function toggleWhitespaceStyle(){
      document.querySelectorAll('.whitespace-pre-wrap').forEach(el=>{
        const isActive=el.classList.contains('styled-q');
        if(isActive){
          el.classList.remove('styled-q');
          el.style.border='';el.style.borderRadius='';el.style.background='';
        }else{
          el.classList.add('styled-q');
          el.style.border='2px solid red';
          el.style.borderRadius='10px';
          el.style.boxShadow='0 0 8px 2px red';
          el.style.padding='5px';
        }
      });
    }
    
    function jumpToNext(){	
      const messages = document.querySelectorAll('[data-message-author-role]');
      let current = [...messages].findIndex(m => m.getBoundingClientRect().top > 100);
      if (current !== -1 && messages[current]) {
        messages[current].scrollIntoView({behavior: 'smooth', block: 'start'});
      }
    }
    
    function jumpToPrevious() {
      const messages = [...document.querySelectorAll('[data-message-author-role]')];
      if (messages.length === 0) return;
      let index = messages.findIndex(m => m.getBoundingClientRect().top >= 10);
      if (index === -1) index = messages.length;
      if (index > 0) {
        messages[index - 1].scrollIntoView({ behavior: 'smooth', block: 'start' });
      }
    }
    
    function toggleQButtonGlow(){
      const qButton=document.querySelector('#q-style-toggle-button');
      if(!qButton)return;
      const glowing=qButton.classList.toggle('glowing-q');
      if(glowing){qButton.style.boxShadow='0 0 10px 4px yellow';}
      else{qButton.style.boxShadow='0 2px 6px rgba(0,0,0,0.2)';}
    }
    
    function createTooltip(btn){
      let tooltip = document.createElement('div');
      tooltip.textContent = 'Snir Elgabsi';
      tooltip.style.cssText = `
        position:absolute;
        bottom:120%;
        left:50%;
        transform:translateX(-50%) scale(0.5);
        padding:5px 10px;
        background:rgba(0,0,0,0.7);
        color:white;
        border-radius:6px;
        font-size:0.9rem;
        opacity:0;
        transition:opacity 0.3s ease, transform 0.3s ease;
        pointer-events:auto;
        cursor:pointer;
        z-index:10000;
        white-space:nowrap;
      `;
      tooltip.onclick = () => {
        window.open('https://snir.blogspot.com', '_blank');
      };
      btn.appendChild(tooltip);
      setTimeout(() => {
        tooltip.style.opacity = '1';
        tooltip.style.transform = 'translateX(-50%) scale(1)';
      }, 500);
      setTimeout(() => {
        tooltip.style.opacity = '0';
        tooltip.style.transform = 'translateX(-50%) scale(0.5)';
        setTimeout(() => {
          if (tooltip.parentElement) {
            tooltip.remove();
          }
        }, 300);
      }, 5030);
      btn._tooltip = tooltip;
    }
    
    function removeTooltip(btn){
      if(btn._tooltip){
        btn._tooltip.style.opacity='0';
        btn._tooltip.style.transform='translateX(-50%) scale(0.5)';
        setTimeout(()=>{if(btn._tooltip){btn._tooltip.remove();btn._tooltip=null;}},300);
      }
    }
    
    function addTooltipEvents(btn){
      let hoverTimeout=null;
      let leaveTimeout=null;
      btn.addEventListener('mouseenter',()=>{
        clearTimeout(leaveTimeout);
        hoverTimeout=setTimeout(()=>createTooltip(btn),1500);
      });
      btn.addEventListener('mouseleave',()=>{
        clearTimeout(hoverTimeout);
        leaveTimeout=setTimeout(()=>removeTooltip(btn),1000);
      });
    }
    
    function makeButtonImage(id,title,imgSrc,imgAlt,clickHandler){
      const btn=document.createElement('button');
      btn.id=id;
      btn.title=title;
      btn.style.cssText='width:2.2rem;height:2.2rem;border-radius:50%;background:white;color:black;border:1px solid lightgray;font-size:1.2rem;box-shadow:0 2px 6px rgba(0,0,0,0.2);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;position:relative;';
      btn.onmouseover=()=>btn.style.backgroundColor='#f0f0f0';
      btn.onmouseout=()=>btn.style.backgroundColor='white';
      btn.onclick=(e)=>{e.preventDefault();clickHandler();};
      const img=document.createElement('img');
      img.src=imgSrc;
      img.alt=imgAlt;
      img.style.cssText='width:1.5rem;height:1.5rem;object-fit:contain;pointer-events:none;';
      btn.appendChild(img);
      addTooltipEvents(btn);
      return btn;
    }
    
    // BASE64 images:
    const imgPromptDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD/UExURenp6c7OzrKysnl5eVZWVpOTkwAAAAEBAaGhoW1tbQMDA5ycnI2NjVtbW8bGxsjIyMrKyrGxscXFxd3d3dLS0ubm5ujo6IuLi3d3d+Li4uTk5E1NTezs7CYmJicnJ1BQUI6OjtXV1ZKSknZ2dpqamgICAt/f36ampnJyclxcXDk5OaqqqrCwsK+vr7+/v66urnR0dMPDw29vb+7u7rW1tSwsLIWFhUJCQkRERMTExNTU1AYGBsfHx3FxcWtra8nJybOzswQEBE5OTjMzM6mpqa2trdzc3OXl5UxMTKWlpUtLS52dnUlJSZ6enuPj40hISMvLy0ZGRqSkpOvr6wAAAKVmCqgAAABVdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////wCwoQfPAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgNS4xLjgbaeqoAAAAtmVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAACAAAAMQECABAAAABaAAAAaYcEAAEAAABqAAAAAAAAANl2AQDoAwAA2XYBAOgDAABQYWludC5ORVQgNS4xLjgAAwAAkAcABAAAADAyMzABoAMAAQAAAAEAAAAFoAQAAQAAAJQAAAAAAAAAAgABAAIABAAAAFI5OAACAAcABAAAADAxMDAAAAAA5X1phWJRlb4AAAFhSURBVEhL5ZRXV8JAEIUpurEiorGAHdGIxoYo9i5WbPP/f4uzmZFkl6xsXuV7yHLP3C9kYU9SkJh/rqTSmWyfQponRKfSLxBHXtoM8IjoUAa5PxSUHUeGYZ4RujLCXSFGc2P5cVwz+cIEDwlNmaS6JIvRxXWKJiGaMh3uYgbjLK5FmoRoSonqEktlbp7qEltlgeoS2wdbpLrEVllKvv1lqktsFVhp/5XWCpR/D5i9AquBUEmiwNq6t1FN9C0Bm8mVreSK36vKtievO0Ls4mKl7AmxXwM4qFcPMRWPGg2XBiGacoy3FSccDKhKQRp5DiYUxcpQlBwKpwUOZiLKmTzy9bJ3HsfFJbeiCv6gFe31HeWKa1GlVhLXfyg+15QHc2/Qub3L+HHcP3BL3X7zEe/2xMFMVIHmMzovHIwoChRf0XnjYEJVoPWOzgcHA5oCrU/xxR9N6Ap8dzmUMUp3eloB+AGGLqjp2OH2dAAAAABJRU5ErkJggg==';
      const imgMarkdownDir = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE4AAABOCAIAAAAByLdKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALeSURBVHhe7ZsxjuIwFIZTU+0RKLkBJWlX4gLT0SPtDZBAokFcAYFoqaDZFiqQQKKAHi5ARUvB/orfWCSZOF7ivDHM+ypiXvL7ix2HSCG4/xhE9R2xVV0ul61Wq1qtBiyEYXg+nynbEVaqCKYuMILT6tY2XzXtiU6UCsW4ts1R7Xa7FBsE+Ox8UqXBZUJ5EQ5tTarIoMAgwLVKrSWTUAWubE2qk8lEhWE8qal8tCpC9WR2YmtS1bP3W1Qxj4BDW5PqYyo1lU8i1KGt76rAle0LqAIntq+hCorbvowqKGj7SqqgiK2/qrirU1Ocp229U9W/W5BOTSmes/VOFVkqFBgcnrD1ThVoB/NT6//a+qiKTmsHAGH05Esey3JtfVQFjyNmj/m3uqeqAEOUGLdcUE87f4W/qhqkA6zMWegnsJdXzQXdU/0UVUJUI0TVO0Q1iahGiGqMTqdTq9VQ87s0cHBEIIgiU3CojkYjVcAD4ig4Dofq4XBQBTwcj0cKjsOhCi6Xy5oFBFFkCiZVHxDVJKIakat6vV7VnYaBRqOBOAqOw6E6GAxUAQ+Io+A4HKq3263ZbKoazS9H0OE+QRDiKDgOh6oniGoSUY2wUT2dTn9ZQBBFpuBQ3W63qoAHxFFwHA7V6XSqCnhAHAXH4VAFw+GwXq+j5qM0cHBEIIgiUzCp+oCoJhHVCBvV8Xj8x5per0e7RUsaWjabDW0XgEN1NpupAnva7TZ2nM/ntB0EWc8r9nCorlYrVWBPv9/Hjuv1Wm1WKhV1qCJwqILdboepaMlisaDd7vf9fo+W4kMKmFR9QFSTiGqEqHqHqCYR1QhR9Q5RTSKqET9RdZLxGr0nWP6hzaQKQ3UI89n6drSqeUhMqpgY+nVcb+ewnr2AmjLI+VqfMIDPue/HM5PoHrVmkKMKnnixnB90krqbTb4q0OuTn1guJVaqAFd8GIY4ef4Msvqnhv0iYqv6Bojq+3G//wN9rsRvy4i5OAAAAABJRU5ErkJggg==';
      const imgPrevBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAeNJREFUaEPtmbtKxEAUhuMFLdRCsRC0ULQTES+VD2Bhr2AraKGljbYWXrASwdY3UAQbKxFRbFwrURCx9gFEK/U/mUmY7CaTEHLM7Ho++DgzG5Ldk7lkZ+IJgpCbHngM7+E6fVCPUBK38MdwD2ahT8c/pUlHk254Dmf8WhRKZkMVE5mCczDu2kWypWMslMQNNFui2l1oYwLGnVe0iWRJInAHJkEtEndO0UYImt/WnZKgltlUxQiDcBs2w5ovLJBFHUN64R2szjiL+9AJ6K61wg6/pn4c8QKfVDHkCn6qYkhwnjPQlFmBlMgbHIZnuh64BBeM+iF0kgF4Asf8muddQDORVUiswANVrA+SEnESGiMNge3pSy0yq4o+a/BIFa20wX5VZIXGcghHIuPwGrZA6pJcdOqYSt4xMgnN87iMwDFGvuEH/IL03OEyAkfXaoc0lXPzqmMqMv2WgSTiGpKIa3BMv0OQVo/cN2lex1TyTr+lrNmla1mg1eYytF27CKz7WibyZC8DScQ1JBHX4Jh+u+A0pGvXPLgK5FLHVPJOvw2zZi8Fjq41Ck8h93bQiI4+HIlQK9MGBDc1OylJyF+UMrAlQi+ATKjPO4stkWf4CB8gvb16h85iG+x0zDwejBVB+D943i8TrRfXoZttJgAAAABJRU5ErkJggg==';  
      const imgNextBtn='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuOBtp6qgAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuOAADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAACrgCETU544KAAAAfhJREFUaEPtmc0rBVEYhweFBYWVYkFhI8nHirKRjT1lLQskCytbC9mJIks7SxtZKUl3y4IUJf4JHwvh95tzzu3MnWvmds1rZnKeenrfubeZO+89Z87MOeM5HDLU6FgOfmd//6XNHQfwFl7BOzgLc8kFNK1AV2AltOv4p0R1rTM4qVKfZbiv0khG4DSMOnYSbOgYCwuxW2QJVsIQtPeTMkCtjkkiccxYJLpWF9yELCj0zyXInI6xVNu1UiGVbiCBKyRruEKyhsTwWw87VCrKk44+EoUMwktYByXvI006xlLtfWQY2vtJGUDiGvmEL/AdvgkaQKJrNcBOlYryqGMs7hElDVwhWcMVkjUkht9uuAWl/6QZHWOpdvjlKoq9n5QBXNeKgAt0CzDq2Ekgvq6VCm74zRr/shDpi/dX2IVwDnEMB/yt8ImbsXsRbqs0O5iT5ZB5CrmS/gyn4A7k6wHDPHyFR/6W5+3CVZUGaIajkMcO3bgS5FzHIiziBvJHOU1lfID3OjfyxQ+nmPZne7CU1ObsH5BzbGJaqBf2qbTIBGxUaRG2UCYwJ94CT+C4v1UZfDBcV2mAfshrTXo5qEdHH/uCboUsZszfiuanIghbmQsQ0oRWUmxYTAGW9kdbFpELoorJTRGGcsXkrghDGzyE13CNHzgcjrzied8Om+958SArgwAAAABJRU5ErkJggg==';
    
    // כפתורים:
    const dirBtn = makeButtonImage('direction-toggle-button', textareaDirection==='rtl'?'כיוון כתיבה מימין לשמאל - Ctrl+Shift':'כיוון כתיבה משמאל לימין - Ctrl+Shift', imgPromptDir, 'כיוון כתיבה', toggleDirection);
    dirBtn.querySelector('img').style.transform = textareaDirection === "ltr" ? "scaleX(-1)" : "scaleX(1)";
    
    const mdBtn = makeButtonImage('markdown-toggle-button', 'החלף כיוון כתיבה של התשובות', imgMarkdownDir, 'כיוון תשובות', toggleMarkdownDirection);
    
    const qBtn=document.createElement('button');
    qBtn.id='q-style-toggle-button';
    qBtn.title='הפעל/בטל עיצוב על whitespace-pre-wrap';
    qBtn.textContent='Q';
    qBtn.style.cssText=dirBtn.style.cssText;
    qBtn.onclick=(e)=>{e.preventDefault();toggleWhitespaceStyle();toggleQButtonGlow();};
    addTooltipEvents(qBtn);
    
    const nextBtn=makeButtonImage('next-snir-button','קפוץ לשאלה הבאה - Alt+↓',imgNextBtn,'קפוץ לשאלה הבאה',jumpToNext);
    const prevBtn=makeButtonImage('prev-snir-button','קפוץ לשאלה הקודמת - Alt+↑',imgPrevBtn,'קפוץ לשאלה הקודמת',jumpToPrevious);
    
    // יצירת כפתורים
    function createButtons(){
      if(document.querySelector('#direction-toggle-button')) return;
    
      const textarea=document.querySelector('#prompt-textarea');
      const buttonContainer=textarea?.closest('form')?.querySelector('div.flex > div.flex');
      if(!textarea||!buttonContainer) return;
    
      let btnGroup=document.querySelector('#custom-btn-group');
      if(!btnGroup){
        btnGroup=document.createElement('div');
        btnGroup.id='custom-btn-group';
        btnGroup.style.cssText='position:absolute;bottom:13px;right:95px;display:flex;gap:10px;z-index:9999;';
        buttonContainer.style.position='relative';
        buttonContainer.appendChild(btnGroup);
      }
    
      btnGroup.appendChild(prevBtn);
      btnGroup.appendChild(nextBtn);
      btnGroup.appendChild(mdBtn);
      btnGroup.appendChild(dirBtn);
    
      // החלת כיוון כתיבה מה־localStorage
      if (textarea) {
        textarea.style.direction = textareaDirection;
        const img = dirBtn.querySelector('img');
        if (img) img.style.transform = textareaDirection === 'ltr' ? 'scaleX(-1)' : 'scaleX(1)';
      }
    }
    
    document.addEventListener('keydown', function (e) {
      if (e.key === 'ArrowUp' && e.altKey) {
        e.preventDefault();
        jumpToPrevious();
      }
      if (e.key === 'ArrowDown' && e.altKey) {
        e.preventDefault();
        jumpToNext();
      }
      if(e.ctrlKey && e.shiftKey && !e.altKey) {
        e.preventDefault();
        toggleDirection();
      }
    });
    
    const observer=new MutationObserver(()=>{createButtons();});
    observer.observe(document.body,{childList:true,subtree:true});
    createButtons();
    })();
        
    
    
    לחץ כאן כדי להעתיק את הקוד
  3. שמור את התמונה הבאה בשם icon.png 

    התוסף מוכן, כעת נפעיל אותו ע"י הדפדפן:
  1. פתח את Chrome.
  2. :עבור לכתובת
  3. הפעל את Developer mode (בצד ימין למעלה).
  4. לחץ על Load unpacked ובחר את התיקייה עם הקבצים שלך.


יום שלישי, 16 ביולי 2024

c# החלפת משתמש בווינדוס / נעילת המחשב


[DllImport("user32.dll")]
public static extern void LockWorkStation();

// The function to switch user/lock the computer
void foo() { LockWorkStation(); } 
  

יום חמישי, 11 באפריל 2024

merge multiple docx

 בשביל לחבר קבצי docx צריך להוסיף reference לקבצים הבאים:

חלון Solution Explorer > לחיצה ימנית על References > לחיצה על Add References

להוריד NuGet או מהאינטרנט את הקבצים ולהוסיף:

Telerik.Windows.Documents.Flow.dll

קוד C#:

void MergeDocx(List<string> files, string result_file)
{
   RadFlowDocument target = new RadFlowDocument();
   RadFlowDocument source = new RadFlowDocument();
   DocxFormatProvider provider = new DocxFormatProvider();
   for (int i = 0; i < file.Count; i++)
  {
     using(Stream input = File.OpenRead(files[i]))
     {
          target.Merge(provider.Import(input));
      }
   }
   byte[] ba = provider.Export(target);
   File.WriteAllBytes(result_file, ba);
 }

convert docx to pdf telerik

 בשביל להמיר docx ל-pdf צריך להוסיף reference לקבצים הבאים:

חלון Solution Explorer > לחיצה ימנית על References > לחיצה על Add References

להוריד NuGet או מהאינטרנט את הקבצים ולהוסיף:

Telerik.Windows.Documents.Core.dll
Telerik.Windows.Documents.Flow.dll
Telerik.Windows.Documents.Flow.FormatProviders.Pdf.dll

קוד C#:

void ConvertDocxToPdf(string docxpath, string pdfpath)
{
  var docxProvider = new DocxFormatProvider();
  var pdfProvider = new PdfFormatProvider();
  byte[] docxByteArr = File.ReadAllBytes(docxpath);
  var doc = docxProvider.Import(docxByteArr);
  byte[] resultPdfByteArr = pdfProvider.Export(doc);
  File.WriteAllBytes(pdfpath, resultPdfByteArr);
}