Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
267
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'],
  17.     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'],
  32.     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'],
  45.     shiftLeft: ['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'],
  58.     controlLeft: ['Ctrl'],
  59.     altLeft: ['Alt'],
  60.     space: [' ', ' '],
  61.     altRight: ['Alt'],
  62.     arrowLeft: ['←'],
  63.     arrowDown: ['↓'],
  64.     arrowRight: ['→'],
  65.     controlRight: ['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'],
  82.     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'],
  97.     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'],
  110.     shiftLeft: ['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'],
  123.     controlLeft: ['Ctrl'],
  124.     altLeft: ['Alt'],
  125.     space: [' ', ' '],
  126.     altRight: ['Alt'],
  127.     arrowLeft: ['←'],
  128.     arrowDown: ['↓'],
  129.     arrowRight: ['→'],
  130.     controlRight: ['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. };
  151.  
  152. function createKey() {
  153.   const key = document.createElement('div');
  154.   key.classList.add(css.key);
  155.   return key;
  156. }
  157.  
  158. const languages = ['en', 'ru'];
  159. //const defaultLanguage = languages[0];
  160. let curLangIndex = 0;
  161.  
  162.  
  163. function saveLanguage() {
  164.   window.localStorage.setItem('language', curLangIndex);
  165. }
  166.  
  167. function getLanguage() {
  168.   const langIndex = window.localStorage.getItem('language');
  169.   return (langIndex || 0);
  170. }
  171.  
  172. function getKeysByLang() {
  173.   const lang = languages[curLangIndex];
  174.   const langArr = Object.entries(keyboardLayout[lang]);
  175.   const value = langArr.map((arr) => {
  176.     const [keyID, values] = arr;
  177.     const [val1, val2] = values;
  178.     const val = document.createElement('span');
  179.  
  180.     val.setAttribute('class', 'val');
  181.     val.textContent = val1;
  182.  
  183.     const key = createKey();
  184.     key.append(val);
  185.     key.id = keyID;
  186.  
  187.     key.classList.add(css.backspace);
  188.     key.classList.add(css.tab);
  189.     key.classList.add(css.delete);
  190.     key.classList.add(css.capsLock);
  191.     key.classList.add(css.enter);
  192.     key.classList.add(css.shift);
  193.     key.classList.add(css.ctrl);
  194.     key.classList.add(css.alt);
  195.     key.classList.add(css.space);
  196.  
  197.     function specialKeys(keyWord, cssClass) {
  198.       if (val1 !== keyWord) {
  199.         key.classList.remove(cssClass);
  200.       }
  201.       return key;
  202.     }
  203.  
  204.     specialKeys('Backspace', 'backspace');
  205.     specialKeys('Tab', 'tab');
  206.     specialKeys('DEL', 'delete');
  207.     specialKeys('CapsLock', 'capsLock');
  208.     specialKeys('ENTER', 'enter');
  209.     specialKeys('Shift', 'shift');
  210.     specialKeys('Ctrl', 'ctrl');
  211.     specialKeys('Alt', 'alt');
  212.     specialKeys(' ', 'space');
  213.  
  214.     return key;
  215.   });
  216.  
  217.   return value;
  218. }
  219.  
  220. function changeLayout() {
  221.   curLangIndex = (curLangIndex + 1) % languages.length;
  222.   saveLanguage();
  223.   const lang = languages[curLangIndex];
  224.   const keys = getKeysByLang(lang);
  225.   const keyboard = document.querySelector('.keyboard');
  226.   keyboard.append(keys);
  227. }
  228.  
  229. function handleKeydown(event) {
  230.   event.preventDefault();
  231.   const keyID = `#${event.code[0].toLowerCase()}${event.code.substring(1)}`;
  232.   const keyElem = document.querySelector(keyID);
  233.   keyElem.classList.add(css.keydown);
  234.   if (event.key === 'Shift' && event.key === 'Control') {
  235.     changeLayout();
  236.   }
  237.   console.log(event);
  238.   return true;
  239. }
  240.  
  241. function handleKeyup(event) {
  242.   event.preventDefault();
  243.   const keyID = `#${event.code[0].toLowerCase()}${event.code.substring(1)}`;
  244.   const keyElem = document.querySelector(keyID);
  245.   keyElem.classList.remove(css.keydown);
  246.   return true;
  247. }
  248.  
  249. function createElements() {
  250.   const wrapper = document.createElement('div');
  251.   wrapper.classList.add(css.wrapper);
  252.  
  253.   const textarea = document.createElement('textarea');
  254.   const t = document.createTextNode('');
  255.   textarea.appendChild(t);
  256.   textarea.style = 'resize: none;';
  257.   textarea.setAttribute('cols', 80);
  258.   textarea.setAttribute('rows', 10);
  259.   document.body.appendChild(textarea);
  260.   textarea.classList.add(css.textarea);
  261.  
  262.   const keyboard = document.createElement('div');
  263.   keyboard.classList.add(css.keyboard);
  264.   wrapper.append(textarea, keyboard);
  265.  
  266.   const allKeys = getKeysByLang();
  267.   curLangIndex = getLanguage();
  268.   saveLanguage();
  269.   let indexAllKeys = 0;
  270.  
  271.   function createRowsWithKeys(row, keysAmount) {
  272.     row.classList.add(css.row);
  273.     for (let i = 0; i < keysAmount; i += 1, indexAllKeys += 1) {
  274.       row.append(allKeys[indexAllKeys]);
  275.       keyboard.append(row);
  276.     }
  277.     return keyboard;
  278.   }
  279.  
  280.   const row1 = document.createElement('div');
  281.   const row2 = document.createElement('div');
  282.   const row3 = document.createElement('div');
  283.   const row4 = document.createElement('div');
  284.   const row5 = document.createElement('div');
  285.  
  286.   createRowsWithKeys(row1, 14);
  287.   createRowsWithKeys(row2, 15);
  288.   createRowsWithKeys(row3, 13);
  289.   createRowsWithKeys(row4, 13);
  290.   createRowsWithKeys(row5, 8);
  291.  
  292.   return wrapper;
  293. }
  294.  
  295. window.addEventListener('load', () => {
  296.   const pageElements = createElements();
  297.   document.querySelector('body').appendChild(pageElements);
  298.   window.addEventListener('keydown', handleKeydown);
  299.   window.addEventListener('keyup', handleKeyup);
  300. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement