החלפת הקלדה לעברית.
-
בשביל חיפוש במקרה של הקלדה בטעות לעברית, רציתי לעשות קוד שיהפוך לעברית, האם יש דרך פשוטה יותר?
let einglish = "qwertyuiopasdfghjklzxcvvbnmQWERTYUIOPASDFGHJKLZXCVBNM,.;", tw=$w('#input41').value let erec= einglish.indexOf(tw.charAt(0)) if (erec!== -1) { console.log(p.replaceAll('e','ם').replaceAll('t', 'א')) // וכאן להמשיך כל האותיות גדולות וקטנות }
או כך
String.prototype.allReplace = function(obj) { var retStr = this; for (var x in obj) { retStr = retStr.replace(new RegExp(x, 'g'), obj[x]); } return retStr; }; console.log(p.allReplace({'a': 'א', 'b': 'ב','c': 'כ', 'd': 'ל'}));
-
@אבי-203 מסתבר (איך לא) שכמו כל רעיון אדיר בחיים, מישהו כבר חשב עליו , ומימש אותו בדומה לאפשרות השנייה שהצעת.
שימוש:
const he = require('convert-layout/he'); console.log(he.fromEn("nv bnag?"));
-
@רפאל
https://github.com/ai/convert-layout/blob/main/build.jsכמובן אפשר לכתוב קוד דומה שלא יתחייב שלב בנייה. אבל בדיוק הקוד הזה אי אפשר להשתמש בו בלי שלב בנייה.
(אולי היה ראוי יותר שבמקום להתרווח על מושבי ולפרשן, הייתי כותב פונקציה פשוטה ומעלה לפה...)
-
@אבי-203
אני חושב שהקוד תקין.class LayoutConvertor { static convert(str) { return str.replace(/./g, x => this.#lookup.get(x.toLowerCase()) ?? x) } static #lookup = new Map([ ["q", "/"], ["w", "'"], ["e", "ק"], ["r", "ר"], ["t", "א"], ["y", "ט"], ["u", "ו"], ["i", "ן"], ["o", "ם"], ["p", "פ"], ["[", "]"], ["{", "}"], ["]", "["], ["}", "{"], ["\\", "\\"], ["|", "|"], ["a", "ש"], ["s", "ד"], ["d", "ג"], ["f", "כ"], ["g", "ע"], ["h", "י"], ["j", "ח"], ["k", "ל"], ["l", "ך"], [";", "ף"], [":", ":"], ["'", ","], ["\"", "\""], ["z", "ז"], ["x", "ס"], ["c", "ב"], ["v", "ה"], ["b", "נ"], ["n", "מ"], ["m", "צ"], [",", "ת"], ["<", ">"], [".", "ץ"], [">", "<"], ["/", "."], ["?", "?"] ]); }
-
אפשר לשאול למה לא עשית convert ו-lookup סטטיים
שקלתי את העניין אבל הצעד היה מאריך את הסינטקס וממילא פוגע בקריאות.
return str.replace(/./g, x => LayoutConvertor.#lookup.get(x) ?? LayoutConvertor.#lookup.get(x.toLowerCase()) ?? x)
(ואז כבר די מיותר להשתמש בקלאס).
כמפתח TS למדתי לשנוא הרחבות של הPrototype, ובתור איש #C אני לא מסוגל לראות קוד משוטט מחוץ למחלקה מרחף לו בחלל .
שורה תחתונה: שיקולים רגשיים בלבד שמזיקים לסביבה.
אדרבה אני מזמין אותך לשנות את הקוד כרצונך ובטוחני שהתוצאה תהיה מרשימה ביותר.
-
@רפאל אמר בהחלפת הקלדה לעברית.:
אדרבה אני מזמין אותך לשנות את הקוד כרצונך.
אני הייתי כותב ככה (בקובץ נפרד):
const map = new Map(...); export default function convert(str) { return .... }
שימוש:
import convertLayout from './utils/layout-converter';
ההבדל? כלום... רק סטייל.
(בעצם זה חוסך יצירה מחדש של ה-map בכל יצhרה של ה-class) -
-
@רפאל מפני הכרת הטוב ל @רפאל אעלה למרות המלצתו 'המחנכת' של ר' @yossiz שעזר לי לקצר את הקוד שלי, בשבעים שורות..
let evtext; export function input41_keyPress(event) { let key = event.key; if (key === "Enter" || key === "Tab") { $w('#input41').blur() $w('#text168').hide() const hipus = String($w('#input41').value); filters(hipus) let einglish = "qwertyuiopasdfghjklzxcvvbnmQWERTYUIOPASDFGHJKLZXCVBNM,.;", tw = $w('#input41').value let cnisa = einglish.indexOf(tw.charAt(0)) if (cnisa !== -1) { evtext = converter.convert(tw) $w('#text167').show() $w('#text167').text = " האם נתכונת לחפש? " + evtext } } } function filters(hipus) { const velur = hipus.split(' ').reverse().join(' '); console.log(velur); wixData.query("magar").eq("phon", hipus).find().then((res) => { if (res.length === 1) { let id = res.items[0] wixWindow.openLightbox("רכישת כרטיסים", { id }) } }) const types = ['phon', 'hir', 'ctovet', 'sem', 'tz', 'mishpaha', 'semmale']; let filter2 = wixData.filter(); const type = $w('#input13').value; if (type in types) { filter2 = filter2.contains(type, hipus); } if (type === 'semmale' || type === 'all') { filter2 = filter2.or( wixData.filter().contains("semmale", velur)); } if (type === 'all') { for (const type of types) { filter2 = filter2.or(wixData.filter().contains(type, hipus)); } } $w("#dataset1").setFilter(filter2).then(()=>{ let count = $w("#dataset1").getTotalCount(); // 23\ console.log(count); if (count===0) { $w('#text168').show() } }) .catch((err) => { console.log(err); }); } class LayoutConvertor { convert(str) { return str.replace(/./g, x => this.#lookup.get(x) ?? this.#lookup.get(x.toLowerCase()) ?? x) } #lookup = new Map([ ["q", "/"], ["w", "'"], ["e", "ק"], ["r", "ר"], ["t", "א"], ["y", "ט"], ["u", "ו"], ["i", "ן"], ["o", "ם"], ["p", "פ"], ["[", "]"], ["{", "}"], ["]", "["], ["}", "{"], ["\\", "\\"], ["|", "|"], ["a", "ש"], ["s", "ד"], ["d", "ג"], ["f", "כ"], ["g", "ע"], ["h", "י"], ["j", "ח"], ["k", "ל"], ["l", "ך"], [";", "ף"], [":", ":"], ["'", ","], ["\"", "\""], ["z", "ז"], ["x", "ס"], ["c", "ב"], ["v", "ה"], ["b", "נ"], ["n", "מ"], ["m", "צ"], [",", "ת"], ["<", ">"], [".", "ץ"], [">", "<"], ["/", "."], ["?", "?"] ]); } const converter = new LayoutConvertor() export function text167_click(event) { $w('#input41').blur() const hipus = evtext; $w('#input41').value = evtext filters(hipus) $w('#text167').hide() // This function was added from the Properties & Events panel. To learn more, visit http://wix.to/UcBnC-4 // Add your code for this event here: }
-
@yossiz אמר בהחלפת הקלדה לעברית.:
אפשר לשאול למה לא עשית convert ו-lookup סטטיים?
טעיתי לחשוב שלthis אין משמעות כלל במתודה סטטית, ומשכך הדרך להתייחס לשאר החברים הסטטיים, היא בשימוש של שמה של המחלקה.
בנוסף אולי יהיה אפשרי להסתפק רק בביטוי השני של הקוד דלהלן:
this.#lookup.get(x) ?? this.#lookup.get(x.toLowerCase())
עדכנתי את הקוד.
-
@רפאל לקחתי את הדבר היפה הזה לעוד מקום:
כשמקלידים טופס או מכניסים איש קשר וכדו' יש איזה קטע מציק כשמגיעים לשדה אימייל עוברים לאנגלית וחוזרים אח"כ (לכן לפעמים שוקל כבר להשאיר לסוף למרות החשיבות..) וזה במצב הטוב, לפעמים מגלים רק בסוף שהוקלד בעברית.
אז חשבתי אולי לבדוק בסוף אם נכתב בעברית ולתקן לאנגלית, כך אפשר לומר לכתחילה תקלידו בעברית.export function input31_keyPress(event) { let key = event.key; if (key === "Enter" || key === "Tab") { let text = "qwertyuiopasdfghjklzxcvvbnmQWERTYUIOPASDFGHJKLZXCVBNM,.;", tw = $w('#input31').value let bbb = text.indexOf(tw.charAt(0)) if (bbb === -1) { $w('#input31').value = converter.convert(tw) } $w('#input32').focus() } } class LayoutConvertor { convert(str) { return str.replace(/./g, x => this.#lookup.get(x) ?? this.#lookup.get(x.toLowerCase()) ?? x) } #lookup = new Map([ ["/", "q"], ["'", "w"], ["ק", "e"], ["ר", "r"], ["א", "t"], ["ט", "y"], ["ו", "u"], ["ן", "i"], ["ם", "o"], ["פ", "p"], ["]", "[ "], ["}", "{"], ["[", "]" ], ["{", "}"], ["\\", "\\"], ["|", "|"], ["ש", "a"], ["ד", "s" ], ["ג", "d"], ["כ", "f"], [ "ע", "g"], ["י", "h"], ["ח", "j"], ["ל", "k"], ["ך", "l"], ["ף", ";"], [":", ":"], [",", "'"], [ "\"", "\""], ["ז", "z"], [ "ס", "x"], [ "ב", "c"], [ "ה", "v"], ["נ", "b"], [ "מ", "n"], [ "צ", "m"], ["ת", ","], [">", "<"], [ "ץ", "."], ["<", ">"], [".", "/"], ["?", "?"], [ "@", "@"] ]); } const converter = new LayoutConvertor()
-
@אבי-203 ניתן להשתמש בביטוי רגולרי התואם לתווים בUnicode שאינם כלולים בASCII, על מנת לקבוע האם מחרוזת טקסט כלשהיא מכילה תווים שאינם לטיניים:
/[^\x00-\x7F]+/.test("א") true /[^\x00-\x7F]+/.test("a") false
לחלופין ביכולתך לציין בצורה מפורשת את התווים הרצויים:
/[א-ת]+/.test("א") true /[א-ת]+/.test("a") false
שימוש בביטויים הנ"ל יסתכם בחיפוש התאמה בכל רחבי הטקסט, ביכולתך כמובן לשנות את הביטוי כך שיבדוק את התו הראשון בלבד.