דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. JS מחרוזת טקסט עברית הפוך עבור מדפסת קופה

JS מחרוזת טקסט עברית הפוך עבור מדפסת קופה

מתוזמן נעוץ נעול הועבר תכנות
14 פוסטים 2 כותבים 478 צפיות 1 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ח חוקר

    @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

    @חוקר
    https://github.com/lojjic/bidi-js

    האם השתמש פעם? אחרת התמודד להבין ולנסות לבד. לא בשביל שתטרח.
    אין שום דוגמאות אמיתיות, קשה לי להבין בדיוק איך עלי להשתמש

    yossizY מנותק
    yossizY מנותק
    yossiz
    כתב ב נערך לאחרונה על ידי
    #4

    @חוקר לא השתמשתי, אל תעבוד קשה, בל"נ אכתוב הסבר עוד מעט אם יעלה בידי

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    תגובה 1 תגובה אחרונה
    4
    • ח חוקר

      @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

      @חוקר
      https://github.com/lojjic/bidi-js

      האם השתמש פעם? אחרת התמודד להבין ולנסות לבד. לא בשביל שתטרח.
      אין שום דוגמאות אמיתיות, קשה לי להבין בדיוק איך עלי להשתמש

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #5

      @חוקר סליחה על האיחור... זה היה קצת מסובך גם לי...

      const { getEmbeddingLevels, getReorderSegments, getMirroredCharacter } = require("bidi-js")()
      
      const str = 'ימין hashem (עושה) חיל'
      
      function logical2visual(str) {
          const embeddingLevels = getEmbeddingLevels(str, 'rtl')
          const arr = str.split('').map((c, i) => embeddingLevels.levels[i] & 1 ? getMirroredCharacter(c) || c : c)
          for (const [start, end] of getReorderSegments(str, embeddingLevels)) {
              const tempArr = arr.slice(start, end + 1)
              tempArr.reverse()
              for (let i = start; i <= end; i++) {
                  arr[i] = tempArr[i - start]
              }
          }
          return arr.join('')
      }
      
      logical2visual(str) // "ליח (השוע) hashem ןימי"
      

      נראה לי שזה מושלם (עובד גם על משפט משולב של עברית ערבית וסינית, מספרים ותווים מיוחדים)
      אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה

      https://runkit.com/yossizahn/bidi-js

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      ח תגובה 1 תגובה אחרונה
      10
      • yossizY yossiz

        @חוקר סליחה על האיחור... זה היה קצת מסובך גם לי...

        const { getEmbeddingLevels, getReorderSegments, getMirroredCharacter } = require("bidi-js")()
        
        const str = 'ימין hashem (עושה) חיל'
        
        function logical2visual(str) {
            const embeddingLevels = getEmbeddingLevels(str, 'rtl')
            const arr = str.split('').map((c, i) => embeddingLevels.levels[i] & 1 ? getMirroredCharacter(c) || c : c)
            for (const [start, end] of getReorderSegments(str, embeddingLevels)) {
                const tempArr = arr.slice(start, end + 1)
                tempArr.reverse()
                for (let i = start; i <= end; i++) {
                    arr[i] = tempArr[i - start]
                }
            }
            return arr.join('')
        }
        
        logical2visual(str) // "ליח (השוע) hashem ןימי"
        

        נראה לי שזה מושלם (עובד גם על משפט משולב של עברית ערבית וסינית, מספרים ותווים מיוחדים)
        אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה

        https://runkit.com/yossizahn/bidi-js

        ח מנותק
        ח מנותק
        חוקר
        כתב ב נערך לאחרונה על ידי
        #6

        @yossiz
        מעריך מאוד מאוד!!
        אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות
        משהו כן מעניין סיטואציה כזו:
        07/11/2022 22:48

        07/11/2022 22:48
        

        כפי שאתה יכול לראות אפילו כאן זה משתנה.. והייתי חייב לעשות על מצב קוד להראות את הטקסט הנכון.
        אם אני רוצה להיצמד כמו בתצוגת קוד שהתאריך בצד שמאל ואח"כ השעה בצד ימין (סדר ההקדה היה תאריך אוח"כ רווח ואח"כ שעה)
        למעשה הוא כן הדפיס את זה כך:
        07/11/2022 22:48
        אך מעבר לכך נראה בינתיים שהוא מתמודד מאוד יפה

        yossizY 2 תגובות תגובה אחרונה
        1
        • ח חוקר

          @yossiz
          מעריך מאוד מאוד!!
          אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות
          משהו כן מעניין סיטואציה כזו:
          07/11/2022 22:48

          07/11/2022 22:48
          

          כפי שאתה יכול לראות אפילו כאן זה משתנה.. והייתי חייב לעשות על מצב קוד להראות את הטקסט הנכון.
          אם אני רוצה להיצמד כמו בתצוגת קוד שהתאריך בצד שמאל ואח"כ השעה בצד ימין (סדר ההקדה היה תאריך אוח"כ רווח ואח"כ שעה)
          למעשה הוא כן הדפיס את זה כך:
          07/11/2022 22:48
          אך מעבר לכך נראה בינתיים שהוא מתמודד מאוד יפה

          yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי
          #7

          @חוקר בשורה 6 של הקוד שלי אני מעביר את המחרוזת 'rtl' כארגומנט, זה אומר לפוקנציה לקבוע את כיוון הקטע ל-RTL, בקטע שכיוונו ימין לשמאל באמת זה נכון להציג בצורה זו
          גם בפורום כיוון הקטע מוגדר ימין לשמאל, לקטעים רגילים שאינם של קוד
          אם יש לך קטע שאתה רוצה להתייחס אליו כשמאל לימין, אז תעביר שם את הארגומנט 'ltr'
          או אפשר להשמיט את הארגומנט כדי שכיוון הקטע יזוהה אוטומטית לפי התו הראשון שיש לו כיווניות חזקה

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          תגובה 1 תגובה אחרונה
          5
          • ח חוקר

            @yossiz
            מעריך מאוד מאוד!!
            אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות
            משהו כן מעניין סיטואציה כזו:
            07/11/2022 22:48

            07/11/2022 22:48
            

            כפי שאתה יכול לראות אפילו כאן זה משתנה.. והייתי חייב לעשות על מצב קוד להראות את הטקסט הנכון.
            אם אני רוצה להיצמד כמו בתצוגת קוד שהתאריך בצד שמאל ואח"כ השעה בצד ימין (סדר ההקדה היה תאריך אוח"כ רווח ואח"כ שעה)
            למעשה הוא כן הדפיס את זה כך:
            07/11/2022 22:48
            אך מעבר לכך נראה בינתיים שהוא מתמודד מאוד יפה

            yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי yossiz
            #8

            למעשה שיקרתי, אמרתי שאני הולך לכתוב הסבר ולמעשה כתבתי מימוש בלי הסבר...

            ההסבר קצת מסובך, בקיצור, הספרייה הוא מימוש של ה-unicode bidi algorithm שהוא אלגוריתם שיודע להמיר מחרוזת מסדר לוגי לסדר ויזואלי
            מדובר באלגוריתם קצת מסובכת, אפשר לקרוא עליה כאן
            התוצאה היא חלוקה של הטקסט ל"פלחים" מקוננים בשכבות כאשר בכל שכבה מסדרים את הקטסט בנפרד לפי הכיוון של ה"שכבה". הספרייה מביאה את הפלחים לפי הסדר מהפנימי לחיצון (getReorderSegments), ואתה אמור להפוך את הסדר לבד לפי המידע הזה, זה מה שהפונקציה שלי עושה בגדול,
            יש גם כללים להפיכת תווים כאשר הם מוצגים בתוך פלח שהכיוון שלו RTL (getMirroredCharacter)
            האלגוריתם מושפע גם ממשתנה חיצוני, שזה כיוון הבסיס של הקטע, זה הארגומנט השנייה ל-getEmbeddingLevels

            @חוקר כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

            אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות

            אני מאמין שההפתעות שיהיו לך במידה ויהיו, יהיו מחסרון הכירות באלגוריתם דו-כיווניות של יוניקוד ואופן הפעולה שלו. זה נראה שהקוד מממש את האלגוריתם בצורה נכונה לפי טענת המחבר, (יש לו סוויטה של טסטים)

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            תגובה 1 תגובה אחרונה
            5
            • ח מנותק
              ח מנותק
              חוקר
              כתב ב נערך לאחרונה על ידי חוקר
              #9

              עוד משהו שהוא לא מתמודד נכון

              שם מסוף                         שבת קדושים
              מספר מסוף                          1345678
              גרסת תוכנה                      WEB001623i
              מספר עסק בחברת האשראי              1345678
              תאריך ושעת העסקה            04/11/22 12:06
              שם כרטיס                        ויזה  תייר
              מספר כרטיס                            0202
              מספר שובר                         13456781
              UID                13456781345678134567814
              RRN                           134561345678
              סוג עסקה                              חובה
              מספר אישור מנפיק                    123456
              גורם מאשר                             חברה
              אופן ביצוע העסקה                    טלפוני
              סוג אשראי                             רגיל
              סכום העסקה                           80.00
              מטבע                                   ILS
              חתימת הלקוח        
              ___________________
              מספר טלפון של הלקוח
              ___________________
              

              הפלט הוא:

              
              תשק ד    םישו                   ם מס
              וף  שבמספר מסוף                          1345678
              גרסת תוכנה                      WEB001623i
              מספר עסק בחברת האשראי              1345678
              תאריך ושעת העסקה            04/11/22 12:06
              שם כרטיס                        ויזה  תייר
              מספר כרטיס                            0202
              מספר שובר                         13456781
              UID                13456781345678134567814
              RRN                           134561345678
              סוג עסקה                              חובה
              מספר אישור מנפיק                    123456
              גורם מאשר                             חברה
              אופן ביצוע העסקה                    טלפוני
              סוג אשראי                             רגיל
              סכום העסקה                           80.00
              מטבע                                   ILS
              חתימת הלקוח
              ___________________
              מספר טלפון של הלקוח
              ___________________
              
              

              אל תתבלבל הפלט בתוצאה היה אמור להיות לא קריא, והבעיה היא שזה כן קריא..
              בגלל הקושי לשקף נכון את הקלט אני מצרף תמונה
              30c731a6-bce7-49cf-b1bb-9f3a6c9e5e5f-image.png
              וכן של הפלט
              b2a691b1-534d-432c-b771-efe066be263d-image.png

              yossizY תגובה 1 תגובה אחרונה
              0
              • ח חוקר

                עוד משהו שהוא לא מתמודד נכון

                שם מסוף                         שבת קדושים
                מספר מסוף                          1345678
                גרסת תוכנה                      WEB001623i
                מספר עסק בחברת האשראי              1345678
                תאריך ושעת העסקה            04/11/22 12:06
                שם כרטיס                        ויזה  תייר
                מספר כרטיס                            0202
                מספר שובר                         13456781
                UID                13456781345678134567814
                RRN                           134561345678
                סוג עסקה                              חובה
                מספר אישור מנפיק                    123456
                גורם מאשר                             חברה
                אופן ביצוע העסקה                    טלפוני
                סוג אשראי                             רגיל
                סכום העסקה                           80.00
                מטבע                                   ILS
                חתימת הלקוח        
                ___________________
                מספר טלפון של הלקוח
                ___________________
                

                הפלט הוא:

                
                תשק ד    םישו                   ם מס
                וף  שבמספר מסוף                          1345678
                גרסת תוכנה                      WEB001623i
                מספר עסק בחברת האשראי              1345678
                תאריך ושעת העסקה            04/11/22 12:06
                שם כרטיס                        ויזה  תייר
                מספר כרטיס                            0202
                מספר שובר                         13456781
                UID                13456781345678134567814
                RRN                           134561345678
                סוג עסקה                              חובה
                מספר אישור מנפיק                    123456
                גורם מאשר                             חברה
                אופן ביצוע העסקה                    טלפוני
                סוג אשראי                             רגיל
                סכום העסקה                           80.00
                מטבע                                   ILS
                חתימת הלקוח
                ___________________
                מספר טלפון של הלקוח
                ___________________
                
                

                אל תתבלבל הפלט בתוצאה היה אמור להיות לא קריא, והבעיה היא שזה כן קריא..
                בגלל הקושי לשקף נכון את הקלט אני מצרף תמונה
                30c731a6-bce7-49cf-b1bb-9f3a6c9e5e5f-image.png
                וכן של הפלט
                b2a691b1-534d-432c-b771-efe066be263d-image.png

                yossizY מנותק
                yossizY מנותק
                yossiz
                כתב ב נערך לאחרונה על ידי
                #10

                @חוקר האם שמת לב לזה:

                @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

                אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                ח תגובה 1 תגובה אחרונה
                3
                • yossizY yossiz

                  @חוקר האם שמת לב לזה:

                  @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

                  אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה

                  ח מנותק
                  ח מנותק
                  חוקר
                  כתב ב נערך לאחרונה על ידי
                  #11

                  @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

                  @חוקר האם שמת לב לזה:

                  @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

                  אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה

                  צדיק אתה
                  לא שמתי לב
                  f2c7bf31-d2d6-4dc3-bdf6-4b2616a288b5-image.png , אכן כעת זה תקין 🙏 🙏 🙏

                  תגובה 1 תגובה אחרונה
                  4
                  • ח מנותק
                    ח מנותק
                    חוקר
                    כתב ב נערך לאחרונה על ידי
                    #12

                    @yossiz
                    נתקלתי במקרה של שורה ארוכה.
                    (יש ללקוח אפשרות של שדה חופשי להודעות מזדמנות.)
                    אולי יש לך איזו הברקה איך להתמודד עם זה.
                    הן שזה חותך מילים באמצע והן שזה חותך בסוף המשפט ההפוך.
                    ס"ה המדפסת צודקת היא מקבלת תווים משמאל לימין ומדפיסה בהתאם..
                    bf79aecf-a062-45a9-b3dd-3db91bb6baa2-image.png
                    ייתכן והדרך היחידה היא להגיע לאיזה שהיא אמת מידה של אורך התווים האפשרי, והאורך שלוקח כל תו ולבצע חישובים ולהכין מראש שורות הפוכות חתוכות..
                    זה לא בשביל להשתגע, כי אם לא אמצא פיתרון בקלות יהיה על הלקוח לוודא שהוא עושה ירידות שורה..
                    תודה

                    yossizY תגובה 1 תגובה אחרונה
                    0
                    • ח חוקר

                      @yossiz
                      נתקלתי במקרה של שורה ארוכה.
                      (יש ללקוח אפשרות של שדה חופשי להודעות מזדמנות.)
                      אולי יש לך איזו הברקה איך להתמודד עם זה.
                      הן שזה חותך מילים באמצע והן שזה חותך בסוף המשפט ההפוך.
                      ס"ה המדפסת צודקת היא מקבלת תווים משמאל לימין ומדפיסה בהתאם..
                      bf79aecf-a062-45a9-b3dd-3db91bb6baa2-image.png
                      ייתכן והדרך היחידה היא להגיע לאיזה שהיא אמת מידה של אורך התווים האפשרי, והאורך שלוקח כל תו ולבצע חישובים ולהכין מראש שורות הפוכות חתוכות..
                      זה לא בשביל להשתגע, כי אם לא אמצא פיתרון בקלות יהיה על הלקוח לוודא שהוא עושה ירידות שורה..
                      תודה

                      yossizY מנותק
                      yossizY מנותק
                      yossiz
                      כתב ב נערך לאחרונה על ידי
                      #13

                      @חוקר זה לא גופן שכל התווים ברוחב זהה? אם כן תוכל לדעת מראש איפה הוא יגלוש לשורה הבאה, ולחפש אחורה לרווח ושם לשבור שורה

                      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                      ח תגובה 1 תגובה אחרונה
                      3
                      • yossizY yossiz

                        @חוקר זה לא גופן שכל התווים ברוחב זהה? אם כן תוכל לדעת מראש איפה הוא יגלוש לשורה הבאה, ולחפש אחורה לרווח ושם לשבור שורה

                        ח מנותק
                        ח מנותק
                        חוקר
                        כתב ב נערך לאחרונה על ידי
                        #14

                        @yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:

                        @חוקר זה לא גופן שכל התווים ברוחב זהה? אם כן תוכל לדעת מראש איפה הוא יגלוש לשורה הבאה, ולחפש אחורה לרווח ושם לשבור שורה

                        בסוף הגענו לזה..
                        אכן במדפסת זו (80mm) ניתן להכניס בגופן הרגיל 48 תווים
                        לקחתי מכאן פונקציה לפיצול מילים
                        וב"ה זה התוצאה

                                                await printer.text(typeof row.value === 'string' ? row.value.split('\n').map((line) => {
                                                    return line.match(/\S.{1,48}(?=\s|$)/g).map(reverseRTLchars).join('\n');
                                                }).join('\n') : row.value);
                        
                        

                        7da2565c-84ce-482a-88a8-88473223c77d-image.png
                        3f1b0133-0f94-4e04-ac78-a5e380bc7cb5-image.png

                        תגובה 1 תגובה אחרונה
                        4
                        תגובה
                        • תגובה כנושא
                        התחברו כדי לפרסם תגובה
                        • מהישן לחדש
                        • מהחדש לישן
                        • הכי הרבה הצבעות


                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום