JS מחרוזת טקסט עברית הפוך עבור מדפסת קופה
-
@חוקר סליחה על האיחור... זה היה קצת מסובך גם לי...
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 ןימי"
נראה לי שזה מושלם (עובד גם על משפט משולב של עברית ערבית וסינית, מספרים ותווים מיוחדים)
אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה -
@yossiz
מעריך מאוד מאוד!!
אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות
משהו כן מעניין סיטואציה כזו:
07/11/2022 22:48
07/11/2022 22:48
כפי שאתה יכול לראות אפילו כאן זה משתנה.. והייתי חייב לעשות על מצב קוד להראות את הטקסט הנכון.
אם אני רוצה להיצמד כמו בתצוגת קוד שהתאריך בצד שמאל ואח"כ השעה בצד ימין (סדר ההקדה היה תאריך אוח"כ רווח ואח"כ שעה)
למעשה הוא כן הדפיס את זה כך:
07/11/2022 22:48
אך מעבר לכך נראה בינתיים שהוא מתמודד מאוד יפה -
@חוקר בשורה 6 של הקוד שלי אני מעביר את המחרוזת
'rtl'
כארגומנט, זה אומר לפוקנציה לקבוע את כיוון הקטע ל-RTL, בקטע שכיוונו ימין לשמאל באמת זה נכון להציג בצורה זו
גם בפורום כיוון הקטע מוגדר ימין לשמאל, לקטעים רגילים שאינם של קוד
אם יש לך קטע שאתה רוצה להתייחס אליו כשמאל לימין, אז תעביר שם את הארגומנט'ltr'
או אפשר להשמיט את הארגומנט כדי שכיוון הקטע יזוהה אוטומטית לפי התו הראשון שיש לו כיווניות חזקה -
למעשה שיקרתי, אמרתי שאני הולך לכתוב הסבר ולמעשה כתבתי מימוש בלי הסבר...
ההסבר קצת מסובך, בקיצור, הספרייה הוא מימוש של ה-unicode bidi algorithm שהוא אלגוריתם שיודע להמיר מחרוזת מסדר לוגי לסדר ויזואלי
מדובר באלגוריתם קצת מסובכת, אפשר לקרוא עליה כאן
התוצאה היא חלוקה של הטקסט ל"פלחים" מקוננים בשכבות כאשר בכל שכבה מסדרים את הקטסט בנפרד לפי הכיוון של ה"שכבה". הספרייה מביאה את הפלחים לפי הסדר מהפנימי לחיצון (getReorderSegments
), ואתה אמור להפוך את הסדר לבד לפי המידע הזה, זה מה שהפונקציה שלי עושה בגדול,
יש גם כללים להפיכת תווים כאשר הם מוצגים בתוך פלח שהכיוון שלו RTL (getMirroredCharacter
)
האלגוריתם מושפע גם ממשתנה חיצוני, שזה כיוון הבסיס של הקטע, זה הארגומנט השנייה ל-getEmbeddingLevels
@חוקר כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
אכן נראה משולם, אני מקוה שלא נכונו לי הפתעות
אני מאמין שההפתעות שיהיו לך במידה ויהיו, יהיו מחסרון הכירות באלגוריתם דו-כיווניות של יוניקוד ואופן הפעולה שלו. זה נראה שהקוד מממש את האלגוריתם בצורה נכונה לפי טענת המחבר, (יש לו סוויטה של טסטים)
-
עוד משהו שהוא לא מתמודד נכון
שם מסוף שבת קדושים מספר מסוף 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 חתימת הלקוח ___________________ מספר טלפון של הלקוח ___________________
אל תתבלבל הפלט בתוצאה היה אמור להיות לא קריא, והבעיה היא שזה כן קריא..
בגלל הקושי לשקף נכון את הקלט אני מצרף תמונה
וכן של הפלט
-
@yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
@חוקר האם שמת לב לזה:
@yossiz כתב בJS מחרוזת טקסט עברית הפוך עבור מדפסת קופה:
אם יש טקסט שגולש לכמה שורות, צריך קודם לחלק לשורות, ואז להריץ בנפרד לכל שורה
צדיק אתה
לא שמתי לב
, אכן כעת זה תקין -
@yossiz
נתקלתי במקרה של שורה ארוכה.
(יש ללקוח אפשרות של שדה חופשי להודעות מזדמנות.)
אולי יש לך איזו הברקה איך להתמודד עם זה.
הן שזה חותך מילים באמצע והן שזה חותך בסוף המשפט ההפוך.
ס"ה המדפסת צודקת היא מקבלת תווים משמאל לימין ומדפיסה בהתאם..
ייתכן והדרך היחידה היא להגיע לאיזה שהיא אמת מידה של אורך התווים האפשרי, והאורך שלוקח כל תו ולבצע חישובים ולהכין מראש שורות הפוכות חתוכות..
זה לא בשביל להשתגע, כי אם לא אמצא פיתרון בקלות יהיה על הלקוח לוודא שהוא עושה ירידות שורה..
תודה -
@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);