Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const keyboardLayout = {
  2.   en: {
  3.     backquote: ['`', '~'],
  4.     digit1: ['1', '!'],
  5.     digit2: ['2', '@'],
  6.     digit3: ['3', '#'],
  7.     digit4: ['4', '$'],
  8.     digit5: ['5', '%'],
  9.     digit6: ['6', '^'],
  10.     digit7: ['7', '&'],
  11.     digit8: ['8', '*'],
  12.     digit9: ['9', '('],
  13.     digit0: ['0', ')'],
  14.     minus: ['-', '_'],
  15.     equal: ['=', '+'],
  16.     backspace: ['Backspace', 'Backspace'],
  17.     tab: ['Tab', 'Tab'],
  18.     keyQ: ['q', 'Q'],
  19.     keyW: ['w', 'W'],
  20.     keyE: ['e', 'E'],
  21.     keyR: ['r', 'R'],
  22.     keyT: ['t', 'T'],
  23.     keyY: ['y', 'Y'],
  24.     keyU: ['u', 'U'],
  25.     keyI: ['i', 'I'],
  26.     keyO: ['o', 'O'],
  27.     keyP: ['p', 'P'],
  28.     bracketLeft: ['[', '{'],
  29.     bracketRight: [']', '}'],
  30.     backslash: ['\\', '|'],
  31.     delete: ['DEL', 'DEL'],
  32.     capsLock: ['CapsLock', 'CapsLock'],
  33.     keyA: ['a', 'A'],
  34.     keyS: ['s', 'S'],
  35.     keyD: ['d', 'D'],
  36.     keyF: ['f', 'F'],
  37.     keyG: ['g', 'G'],
  38.     keyH: ['h', 'H'],
  39.     keyJ: ['j', 'J'],
  40.     keyK: ['k', 'K'],
  41.     keyL: ['l', 'L'],
  42.     semicolon: [';', ':'],
  43.     quote: ['\'', '"'],
  44.     enter: ['ENTER', 'ENTER'],
  45.     shiftLeft: ['Shift', 'Shift'],
  46.     keyZ: ['z', 'Z'],
  47.     keyX: ['x', 'X'],
  48.     keyC: ['c', 'C'],
  49.     keyV: ['v', 'V'],
  50.     keyB: ['b', 'B'],
  51.     keyN: ['n', 'N'],
  52.     keyM: ['m', 'M'],
  53.     comma: [',', '<'],
  54.     period: ['.', '>'],
  55.     slash: ['/', '?'],
  56.     arrowUp: ['↑', '↑'],
  57.     shiftRight: ['Shift', 'Shift'],
  58.     controlLeft: ['Ctrl', 'Ctrl'],
  59.     altLeft: ['Alt', 'Alt'],
  60.     space: [' ', ' '],
  61.     altRight: ['Alt', 'Alt'],
  62.     arrowLeft: ['←', '←'],
  63.     arrowDown: ['↓', '↓'],
  64.     arrowRight: ['→', '→'],
  65.     controlRight: ['Ctrl', 'Ctrl'],
  66.   },
  67.   ru: {
  68.     backquote: ['ё', 'Ё'],
  69.     digit1: ['1', '!'],
  70.     digit2: ['2', '"'],
  71.     digit3: ['3', '№'],
  72.     digit4: ['4', ';'],
  73.     digit5: ['5', '%'],
  74.     digit6: ['6', ':'],
  75.     digit7: ['7', '?'],
  76.     digit8: ['8', '*'],
  77.     digit9: ['9', '('],
  78.     digit0: ['0', ')'],
  79.     dash: ['-', '_'],
  80.     equal: ['=', '+'],
  81.     backspace: ['Backspace', 'Backspace'],
  82.     tab: ['Tab', 'Tab'],
  83.     keyQ: ['й', 'Й'],
  84.     keyW: ['ц', 'Ц'],
  85.     keyE: ['у', 'У'],
  86.     keyR: ['к', 'К'],
  87.     keyT: ['е', 'Е'],
  88.     keyY: ['н', 'Н'],
  89.     keyU: ['г', 'Г'],
  90.     keyI: ['ш', 'Ш'],
  91.     keyO: ['щ', 'Щ'],
  92.     keyP: ['з', 'З'],
  93.     leftBracket: ['х', 'Х'],
  94.     rightBracket: ['ъ', 'Ъ'],
  95.     backslash: ['\\', '/'],
  96.     del: ['DEL', 'DEL'],
  97.     capslock: ['CapsLock', 'CapsLock'],
  98.     keyA: ['ф', 'Ф'],
  99.     keyS: ['ы', 'Ы'],
  100.     keyD: ['в', 'В'],
  101.     keyF: ['а', 'А'],
  102.     keyG: ['п', 'П'],
  103.     keyH: ['р', 'Р'],
  104.     keyJ: ['о', 'О'],
  105.     keyK: ['л', 'Л'],
  106.     keyL: ['д', 'Д'],
  107.     semicolon: ['ж', 'Ж'],
  108.     quote: ['э', 'Э'],
  109.     enter: ['ENTER', 'ENTER'],
  110.     shiftLeft: ['Shift', 'Shift'],
  111.     keyZ: ['я', 'Я'],
  112.     keyX: ['ч', 'Ч'],
  113.     keyC: ['с', 'С'],
  114.     keyV: ['м', 'М'],
  115.     keyB: ['и', 'И'],
  116.     keyN: ['т', 'Т'],
  117.     keyM: ['ь', 'Ь'],
  118.     comma: ['б', 'Б'],
  119.     dot: ['ю', 'Ю'],
  120.     slash: ['.', ','],
  121.     arrowUp: ['↑', '↑'],
  122.     shiftRight: ['Shift', 'Shift'],
  123.     controlLeft: ['Ctrl', 'Ctrl'],
  124.     altLeft: ['Alt', 'Alt'],
  125.     space: [' ', ' '],
  126.     altRight: ['Alt', 'Alt'],
  127.     arrowLeft: ['←', '←'],
  128.     arrowDown: ['↓', '↓'],
  129.     arrowRight: ['→', '→'],
  130.     controlRight: ['Ctrl', 'Ctrl'],
  131.   },
  132. };
  133.  
  134. const css = {
  135.   wrapper: 'wrapper',
  136.   textarea: 'textarea',
  137.   keyboard: 'keyboard',
  138.   row: 'row',
  139.   key: 'key',
  140.   backspace: 'backspace',
  141.   tab: 'tab',
  142.   delete: 'delete',
  143.   capsLock: 'capsLock',
  144.   enter: 'enter',
  145.   shift: 'shift',
  146.   ctrl: 'ctrl',
  147.   alt: 'alt',
  148.   space: 'space',
  149.   keydown: 'keydown',
  150.   switchLang: 'switchLang',
  151.   text: 'text',
  152. };
  153.  
  154. const textarea = document.createElement('textarea');
  155.  
  156. function createKey() {
  157.   const key = document.createElement('div');
  158.   key.classList.add(css.key);
  159.   return key;
  160. }
  161.  
  162. const languages = ['en', 'ru'];
  163. let curLangIndex = 0;
  164.  
  165. function getLanguage() {
  166.   const langIndex = window.localStorage.getItem('language');
  167.   return (langIndex || 0);
  168. }
  169.  
  170. function saveLanguage() {
  171.   window.localStorage.setItem('language', curLangIndex);
  172. }
  173.  
  174. function getKeysByLang() {
  175.   const lang = languages[curLangIndex];
  176.   const langArr = Object.entries(keyboardLayout[lang]);
  177.   const value = langArr.map((arr) => {
  178.     const [keyID, values] = arr; /* [backquote, ['`', '~'//]] */
  179.     const [val1, val2] = values; /* ['`', '~'] */
  180.     const valVisible = document.createElement('span');
  181.  
  182.     valVisible.setAttribute('class', 'val');
  183.     valVisible.textContent = val1;
  184.  
  185.     const valHidden = document.createElement('span');
  186.     valHidden.textContent = val2;
  187.     valHidden.setAttribute('class', 'hidden');
  188.  
  189.     const key = createKey();
  190.     key.append(valVisible, valHidden);
  191.     key.id = keyID;
  192.  
  193.     key.classList.add(css.backspace);
  194.     key.classList.add(css.tab);
  195.     key.classList.add(css.delete);
  196.     key.classList.add(css.capsLock);
  197.     key.classList.add(css.enter);
  198.     key.classList.add(css.shift);
  199.     key.classList.add(css.ctrl);
  200.     key.classList.add(css.alt);
  201.     key.classList.add(css.space);
  202.  
  203.     function specialKeys(keyWord, cssClass) {
  204.       if (val1 !== keyWord) {
  205.         key.classList.remove(cssClass);
  206.       }
  207.       return key;
  208.     }
  209.  
  210.     specialKeys('Backspace', 'backspace');
  211.     specialKeys('Tab', 'tab');
  212.     specialKeys('DEL', 'delete');
  213.     specialKeys('CapsLock', 'capsLock');
  214.     specialKeys('ENTER', 'enter');
  215.     specialKeys('Shift', 'shift');
  216.     specialKeys('Ctrl', 'ctrl');
  217.     specialKeys('Alt', 'alt');
  218.     specialKeys(' ', 'space');
  219.  
  220.     return key;
  221.   });
  222.  
  223.   return value;
  224. }
  225.  
  226. function createRowsWithKeys(keysAmount, allKeys, startIndex) {
  227.   const row = document.createElement('div');
  228.   row.classList.add(css.row);
  229.  
  230.   for (let i = startIndex; i < startIndex + keysAmount; i += 1) {
  231.     row.append(allKeys[i]);
  232.   }
  233.   return row;
  234. }
  235.  
  236. function createRows(allKeys) {
  237.   const row1 = createRowsWithKeys(14, allKeys, 0);
  238.   const row2 = createRowsWithKeys(15, allKeys, 14);
  239.   const row3 = createRowsWithKeys(13, allKeys, 29);
  240.   const row4 = createRowsWithKeys(13, allKeys, 42);
  241.   const row5 = createRowsWithKeys(8, allKeys, 55);
  242.   return [row1, row2, row3, row4, row5];
  243. }
  244.  
  245. const shift = () => {
  246.   const visible = document.querySelectorAll('.val');
  247.   const hidden = document.querySelectorAll('.hidden');
  248.   visible.forEach((v) => {
  249.     v.classList.add('hidden');
  250.     v.classList.remove('val');
  251.   });
  252.   hidden.forEach((h) => {
  253.     h.classList.remove('hidden');
  254.     h.classList.add('val');
  255.   });
  256. };
  257.  
  258. function changeLayout() {
  259.   curLangIndex = (curLangIndex + 1) % languages.length;
  260.   saveLanguage();
  261.   const lang = languages[curLangIndex];
  262.   const keys = getKeysByLang(lang);
  263.   const keyboard = document.querySelector('.keyboard');
  264.   keyboard.innerHTML = '';
  265.   keyboard.append(...createRows(keys));
  266.   shift();
  267. }
  268.  
  269. let isShiftDown = false;
  270. let isCtrlDown = false;
  271.  
  272. const printSpecialKey = (key, span) => {
  273.   switch (key) {
  274.     case 'tab':
  275.       textarea.value += '  ';
  276.       break;
  277.     case 'enter':
  278.       textarea.value += '\n';
  279.       break;
  280.     case 'altLeft':
  281.     case 'altRight':
  282.     case 'controlLeft':
  283.     case 'controlRight':
  284.     case 'delete':
  285.     case 'arrowUp':
  286.     case 'arrowDown':
  287.     case 'shiftRight':
  288.     case 'shiftLeft':
  289.       break;
  290.     case 'backspace':
  291.       textarea.value = textarea.value.slice(0, -1);
  292.       break;
  293.     case 'arrowLeft':
  294.       textarea.selectionStart -= 1;
  295.       textarea.selectionEnd = textarea.selectionStart;
  296.       break;
  297.     case 'arrowRight':
  298.       textarea.selectionStart += 1;
  299.       textarea.selectionEnd = textarea.selectionStart;
  300.       break;
  301.     default:
  302.       textarea.value += span;
  303.       break;
  304.   }
  305. };
  306.  
  307. function handleKeydown(event) {
  308.   event.preventDefault();
  309.   const keyID = `${event.code[0].toLowerCase()}${event.code.substring(1)}`; /* make 1st letter in event.code capitalized */
  310.   const keyIdSelector = `#${keyID}`;
  311.   const keyElem = document.querySelector(keyIdSelector);
  312.   keyElem.classList.add(css.keydown);
  313.  
  314.   const span = keyElem.querySelector('.val').textContent;
  315.  
  316.   console.log(keyElem);
  317.   console.log(span);
  318.  
  319.   printSpecialKey(keyID, span);
  320.  
  321.   if (event.code === 'ShiftLeft' || event.code === 'ShiftRight') {
  322.     isShiftDown = true;
  323.     shift();
  324.   }
  325.  
  326.   if (event.code === 'ControlLeft' || event.code === 'ControlRight') {
  327.     isCtrlDown = true;
  328.   }
  329.   /*
  330.   if (event.shiftKey === true) isShiftDown = true;
  331.   else isShiftDown = false;
  332.  
  333.   if (event.ctrlKey === true) isCtrlDown = true;
  334.   else isCtrlDown = false; */
  335.  
  336.   if (isShiftDown && isCtrlDown) changeLayout();
  337.  
  338.   return true;
  339. }
  340.  
  341. function handleKeyup(event) {
  342.   event.preventDefault();
  343.   const keyID = `#${event.code[0].toLowerCase()}${event.code.substring(1)}`;
  344.   const keyElem = document.querySelector(keyID);
  345.   keyElem.classList.remove(css.keydown);
  346.   if (event.code === 'ShiftLeft' || event.code === 'ShiftRight') {
  347.     isShiftDown = false;
  348.     shift();
  349.   }
  350.  
  351.   return true;
  352. }
  353.  
  354. function createElements() {
  355.   const wrapper = document.createElement('div');
  356.   wrapper.classList.add(css.wrapper);
  357.  
  358.   textarea.style = 'resize: none;';
  359.   textarea.setAttribute('cols', 80);
  360.   textarea.setAttribute('rows', 10);
  361.   document.body.appendChild(textarea);
  362.   textarea.classList.add(css.textarea);
  363.  
  364.   const keyboard = document.createElement('div');
  365.   keyboard.classList.add(css.keyboard);
  366.   wrapper.append(textarea, keyboard);
  367.  
  368.   const allKeys = getKeysByLang();
  369.   curLangIndex = getLanguage();
  370.   saveLanguage();
  371.  
  372.   const rows = createRows(allKeys);
  373.   keyboard.append(...rows);
  374.  
  375.   const howToSwitchLang = document.createElement('div');
  376.   howToSwitchLang.classList.add(css.switchLang);
  377.   howToSwitchLang.innerHTML = '<p><strong>Shift + Ctrl</strong> - to switch language (переключить язык)</p>';
  378.   wrapper.appendChild(howToSwitchLang);
  379.  
  380.   return wrapper;
  381. }
  382.  
  383. function mouseDownHandler(elem) {
  384.   elem.classList.add(css.keydown);
  385.   printSpecialKey(elem.firstElementChild.textContent);
  386. }
  387.  
  388. function mouseUpHandler(elem) {
  389.   elem.classList.remove(css.keydown);
  390. }
  391.  
  392. window.addEventListener('load', () => {
  393.   const pageElements = createElements();
  394.   document.querySelector('body').appendChild(pageElements);
  395.   window.addEventListener('keydown', handleKeydown);
  396.   window.addEventListener('keyup', handleKeyup);
  397.  
  398.   document.querySelectorAll('.key').forEach((element) => {
  399.     element.addEventListener('mousedown', () => mouseDownHandler(element));
  400.     element.addEventListener('mouseup', () => mouseUpHandler(element));
  401.   });
  402. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement