├── klavarog.css ├── gamma ├── robots.txt ├── icon.png ├── favicon.ico ├── klavarog.png ├── icon-color.png ├── icon-hand.png ├── icon-hide.png ├── icon-speed.png ├── icon-time.png ├── icon-errors.png ├── icon-keyboard.png ├── icon-refresh.png ├── icon-select.png ├── ru_base.txt ├── ru_base2.txt ├── en_base.txt ├── index.css └── index.js ├── beep.mp3 ├── beep.ogg ├── icon.jpg ├── icon.png ├── logo.png ├── i ├── wait.gif ├── banner1.png ├── cover1.png ├── error.png ├── hands.png ├── icons.png ├── copyleft.png ├── screenshot1.png ├── screenshot2.png └── screenshot3.png ├── icon2.png ├── klava.crx ├── beta ├── icon.png ├── favicon.ico ├── klavarog.png ├── ru_base.txt ├── en_base.txt ├── klava.css ├── index.css ├── klava.js ├── en_adv.txt ├── index.js └── index.html ├── favicon.ico ├── klavarog.png ├── logo200.png ├── robots.txt ├── screenshot1.jpg ├── screenshot2.jpg ├── screenshot3.jpg ├── alpha ├── favicon.ico ├── index.not.html └── index.html ├── klava_online.crx ├── layout ├── jcuken.klc ├── jcuken.png ├── jcuken.zip ├── xsmit.zip └── esperanto.zip ├── README.md ├── screenshot-392x240.png ├── .htaccess ├── about ├── keyboard_print.png └── index.html ├── files └── avatar │ └── keyboard.png ├── dict ├── eng_dict_tp.txt ├── rus_base.txt ├── eng_base.txt ├── num_begin.txt ├── eng_begin_stamina.txt ├── ukr_begin.txt ├── eng_code_sql.txt ├── eng_code_xslt.txt ├── eng_code_c.txt ├── eng_code_python.txt ├── eng_code_cpp.txt ├── eng_code_php.txt ├── rus_begin.txt └── eng_code_pascal.txt ├── sitemap.xml ├── rss ├── index.php └── greatwords_ru_rss.txt ├── speed ├── reset.css ├── style.css ├── index.php └── script.js ├── rss.xml └── ie-css3.htc /klavarog.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /gamma/robots.txt: -------------------------------------------------------------------------------- 1 | User-Agent: * 2 | Allow: / 3 | -------------------------------------------------------------------------------- /beep.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/beep.mp3 -------------------------------------------------------------------------------- /beep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/beep.ogg -------------------------------------------------------------------------------- /icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/icon.jpg -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/icon.png -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/logo.png -------------------------------------------------------------------------------- /i/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/wait.gif -------------------------------------------------------------------------------- /icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/icon2.png -------------------------------------------------------------------------------- /klava.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/klava.crx -------------------------------------------------------------------------------- /beta/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/beta/icon.png -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/favicon.ico -------------------------------------------------------------------------------- /i/banner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/banner1.png -------------------------------------------------------------------------------- /i/cover1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/cover1.png -------------------------------------------------------------------------------- /i/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/error.png -------------------------------------------------------------------------------- /i/hands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/hands.png -------------------------------------------------------------------------------- /i/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/icons.png -------------------------------------------------------------------------------- /klavarog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/klavarog.png -------------------------------------------------------------------------------- /logo200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/logo200.png -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | User-Agent: * 2 | Allow: / 3 | Sitemap: http://klava.org/sitemap.xml 4 | -------------------------------------------------------------------------------- /gamma/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon.png -------------------------------------------------------------------------------- /i/copyleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/copyleft.png -------------------------------------------------------------------------------- /screenshot1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/screenshot1.jpg -------------------------------------------------------------------------------- /screenshot2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/screenshot2.jpg -------------------------------------------------------------------------------- /screenshot3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/screenshot3.jpg -------------------------------------------------------------------------------- /alpha/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/alpha/favicon.ico -------------------------------------------------------------------------------- /beta/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/beta/favicon.ico -------------------------------------------------------------------------------- /beta/klavarog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/beta/klavarog.png -------------------------------------------------------------------------------- /gamma/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/favicon.ico -------------------------------------------------------------------------------- /gamma/klavarog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/klavarog.png -------------------------------------------------------------------------------- /i/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/screenshot1.png -------------------------------------------------------------------------------- /i/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/screenshot2.png -------------------------------------------------------------------------------- /i/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/i/screenshot3.png -------------------------------------------------------------------------------- /klava_online.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/klava_online.crx -------------------------------------------------------------------------------- /layout/jcuken.klc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/layout/jcuken.klc -------------------------------------------------------------------------------- /layout/jcuken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/layout/jcuken.png -------------------------------------------------------------------------------- /layout/jcuken.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/layout/jcuken.zip -------------------------------------------------------------------------------- /layout/xsmit.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/layout/xsmit.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Klavarog Δ 2 | ============== 3 | 4 | Keyboard trainer "Klavarog Δ" (klava.org) 5 | -------------------------------------------------------------------------------- /gamma/icon-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-color.png -------------------------------------------------------------------------------- /gamma/icon-hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-hand.png -------------------------------------------------------------------------------- /gamma/icon-hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-hide.png -------------------------------------------------------------------------------- /gamma/icon-speed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-speed.png -------------------------------------------------------------------------------- /gamma/icon-time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-time.png -------------------------------------------------------------------------------- /layout/esperanto.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/layout/esperanto.zip -------------------------------------------------------------------------------- /gamma/icon-errors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-errors.png -------------------------------------------------------------------------------- /gamma/icon-keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-keyboard.png -------------------------------------------------------------------------------- /gamma/icon-refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-refresh.png -------------------------------------------------------------------------------- /gamma/icon-select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/gamma/icon-select.png -------------------------------------------------------------------------------- /screenshot-392x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/screenshot-392x240.png -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | AddType application/octet-stream keylayout 2 | 3 | AddType "text/plain; charset=utf-8" .txt 4 | -------------------------------------------------------------------------------- /about/keyboard_print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/about/keyboard_print.png -------------------------------------------------------------------------------- /files/avatar/keyboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ibnteo/klavarog_delta/HEAD/files/avatar/keyboard.png -------------------------------------------------------------------------------- /dict/eng_dict_tp.txt: -------------------------------------------------------------------------------- 1 | a = ah, aw, ha, hmm, ho, mmm, oh, ooh, uh, well, whoa, wow 2 | akesi = creeping animal, reptile, amphibian, large arthropod 3 | ala = not, no, zero, un- 4 | alasa = to gather -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://klava.org/ 5 | 2010-06-02 6 | weekly 7 | 0.8 8 | 9 | 10 | http://klava.org/about/ 11 | monthly 12 | 0.6 13 | 14 | 15 | http://klava.org/gamma/ 16 | 0.2 17 | 18 | 19 | http://klava.org/beta/ 20 | 0.2 21 | 22 | -------------------------------------------------------------------------------- /beta/ru_base.txt: -------------------------------------------------------------------------------- 1 | и в не он на я что тот быть с а весь это как она по но они к у ты из мы за вы так же от сказать этот который мочь человек о один еще бы такой только себя свое какой когда уже для вот кто да говорить год знать мой до или если время рука нет самый ни стать большой 2 | даже другой наш свой ну под где дело есть сам раз чтобы два там чем глаз жизнь первый день тута во ничто потом очень со хотеть ли при голова надо без видеть идти теперь тоже стоять друг дом 3 | быть сказать мочь говорить знать стать есть хотеть видеть идти стоять думать спросить жить смотреть сидеть понять иметь делать взять сделать понимать казаться давать пойти увидеть остаться выйти дать работать любить оказаться ответить подумать значить посмотреть ждать лежать найти писать решить вернуться считать помнить получить ходить бывать прийти узнать заметить 4 | человек год время рука дело раз глаз жизнь день голова друг дом слово место лицо сторона нога дверь работа земля конец час голос город вода стол ребенок сила отец женщина машина случай ночь мир вид ряд начало вопрос война деньги минута жена правда страна свет мать товарищ дорога 5 | -------------------------------------------------------------------------------- /dict/rus_base.txt: -------------------------------------------------------------------------------- 1 | и в не он на я что тот быть с а весь это как она по но они к у ты из мы за вы так же от сказать этот который мочь человек о один еще бы такой только себя свое какой когда уже для вот кто да говорить год знать мой до или если время рука нет самый ни стать большой 2 | даже другой наш свой ну под где дело есть сам раз чтобы два там чем глаз жизнь первый день тута во ничто потом очень со хотеть ли при голова надо без видеть идти теперь тоже стоять друг дом 3 | быть сказать мочь говорить знать стать есть хотеть видеть идти стоять думать спросить жить смотреть сидеть понять иметь делать взять сделать понимать казаться давать пойти увидеть остаться выйти дать работать любить оказаться ответить подумать значить посмотреть ждать лежать найти писать решить вернуться считать помнить получить ходить бывать прийти узнать заметить 4 | человек год время рука дело раз глаз жизнь день голова друг дом слово место лицо сторона нога дверь работа земля конец час голос город вода стол ребенок сила отец женщина машина случай ночь мир вид ряд начало вопрос война деньги минута жена правда страна свет мать товарищ дорога 5 | -------------------------------------------------------------------------------- /gamma/ru_base.txt: -------------------------------------------------------------------------------- 1 | и в не он на я что тот быть с а весь это как она по но они к у ты из мы за вы так же от сказать этот который мочь человек о один еще бы такой только себя свое какой когда уже для вот кто да говорить год знать мой до или если время рука нет самый ни стать большой 2 | даже другой наш свой ну под где дело есть сам раз чтобы два там чем глаз жизнь первый день тута во ничто потом очень со хотеть ли при голова надо без видеть идти теперь тоже стоять друг дом 3 | быть сказать мочь говорить знать стать есть хотеть видеть идти стоять думать спросить жить смотреть сидеть понять иметь делать взять сделать понимать казаться давать пойти увидеть остаться выйти дать работать любить оказаться ответить подумать значить посмотреть ждать лежать найти писать решить вернуться считать помнить получить ходить бывать прийти узнать заметить 4 | человек год время рука дело раз глаз жизнь день голова друг дом слово место лицо сторона нога дверь работа земля конец час голос город вода стол ребенок сила отец женщина машина случай ночь мир вид ряд начало вопрос война деньги минута жена правда страна свет мать товарищ дорога 5 | -------------------------------------------------------------------------------- /rss/index.php: -------------------------------------------------------------------------------- 1 | (60 * 60)); 13 | if ($is_hour) { 14 | $rss = new SimpleXMLElement($url, null, true); 15 | $file = @fopen($filename, 'w'); 16 | foreach($rss->channel->item as $item) { 17 | $str = symb_replace($item->description); 18 | 19 | if ($filename == 'greatwords_ru_rss.txt') { 20 | $title = symb_replace($item->title); 21 | $stitle = split(' - ', $title); 22 | $str .= ' '.$stitle[1].'.'; 23 | } 24 | @fwrite($file, $str."\n"); 25 | } 26 | @fclose($file); 27 | } 28 | $response = @file($filename); 29 | echo(implode("", $response)); 30 | 31 | function symb_replace($str) { 32 | $str = htmlspecialchars_decode(preg_replace('/<[^>]+>/', ' ', preg_replace('//i', "¶", $str))); 33 | $str = str_replace('…', '...', $str); 34 | $str = str_replace('—', '-', $str); 35 | $str = str_replace('«', '"', $str); 36 | $str = str_replace('»', '"', $str); 37 | return $str; 38 | } -------------------------------------------------------------------------------- /gamma/ru_base2.txt: -------------------------------------------------------------------------------- 1 | ком кит гид гол клад граф когда кегли когти горько легко угол луг уголь утка рагу нуга круг жгут гудок ушу душ шут шалаш шум шуруп ушки на макушке шутка шкаф шкода шишка шквал кишки шкура куш укол кукареку уклон шаги грош гуашь гашиш фиг машину угонишь укушу грушу коршун гранулы шнурок ловушка группа грунт крушить крышка шушуканье 2 | бал бес балбес бас боб баобаб банк бакс бокс босс быстро на сборы чуб бочка чашка челобрек чтобы уберечь бабочку чую юг ключ колючие глючные брюки брюс сюжет сюртук сюсюканье люстра сочи час счетчик бюст бюро люблю юбочку особь сгиб сруб мюсли сжечь брошюру вьючить парашют бюджет юрист чукчи бьют юнгу в челюсть люблю ручную юлу 3 | цель щи щипцы цирк цена цент царица лицо фриц ищу щит щука щека плющ чаща щупальца ой гной щучий йога вой лай жуй леший щедрый общий зной забой задний узкий зазнайка заразный зайка с занозой цезарь разница цензура цой цезий куцый щель раз зуб пища пещерный щебень мерцающий сующий щипцы щавель борщ зайцы замещают бойцов на зарнице 4 | эх эхо эхма хан храм хохот шах ханжа халиф этот эфир эта эра эпоха хэш яд харя ящер ящик яхта бляха хвоя хаять объяснять объявлять объятия съязвить это съемки эльф съездил на съезд элегия алоэ эмоция подъезд объезд въезд хищная бойня щадящая слух хорошая харчевня хартия подъячейка хрящ хряк якоря эти хотят объять необъятное предъявлять изъян лихой хозяйке 5 | объём подъём съёмка хорёк слёзы грёзы ещё щётка щёлочь жёлтый ёж ёрш зелёная ёлка палка её ёмкий чертёж счёт четырёхъярусный весёлый суфлёр клёвая гёрл всё 6 | -------------------------------------------------------------------------------- /beta/en_base.txt: -------------------------------------------------------------------------------- 1 | th the they then them there their that this wh why who whom when where what while ea eat east tear read head beat deal leaf ed bed med led red tired shed liked armed moved en pen den ten often listen given taken even frozen happen broken er her ever over river after enter 2 | under order biker joker ar car bar mar oral polar solar star or for nor author actor major motor tutor sailor al pal gal dual usual rural royal vital total ay say day way ray pay lay may ly sly fly ugly only rally reply apply badly ry try cry dry fry very weary carry gh high sigh weigh bough though ew new few pew blew view ow now how low row sow yellow 3 | fall jam dash kid ska lad alf bank navy valid man gal ham talk yak rutty urn elf is wolf oven quasi pet xxl cot zone abcdefghijklmnopqrstuvwxyz fife jojoba doddle kick suss label aka bob nine vulva memo guggle hah totality yellowy river unused eke ivied willow oboe quark prep xerox clack zigzag zyxwvutsrqponmlkjihgfedcba 4 | hay heir harp half hang hack hex high echo earn elan eddy edit obit oboe obey owl oak okie dokey down duty dux dixy doxy xmas xtal nix next note name nape nail snap spar step slow shot shit qua quay quad quod quit pack pray pure pig pixy push rush rue rock rose rich ring main mad male melt milk make zero zest zonk zoom zinc zing 5 | year yelp ywis your chip char cut chut coxy cow kale ken knap keep keck kiwi with wind wick woke wont void volt vole vote vita vox vug very jerk joke jack jab job jamb jeep girl glue gold grow good luck lake lid lie lex live love allowable absolute black bonus bicycle expressive eating fortune finish frequency fuzzy imperial 6 | include kilobyte obtain throw tutor cherry casino cinema cajole candle rubric rover rigor unbound unique vampire velvet vogue yearly zombie zippy quack quick quake queen query quorum quadruple xenon xerox xistor xiphoid xylogen xanthoxylone nixie nothing network neighbour window weight world winch whose white south sounding submarine jumbo justify journey government paradox penalty paving pepsi guano apes memento mori -------------------------------------------------------------------------------- /dict/eng_base.txt: -------------------------------------------------------------------------------- 1 | th the they then them there their that this wh why who whom when where what while ea eat east tear read head beat deal leaf ed bed med led red tired shed liked armed moved en pen den ten often listen given taken even frozen happen broken er her ever over river after enter 2 | under order biker joker ar car bar mar oral polar solar star or for nor author actor major motor tutor sailor al pal gal dual usual rural royal vital total ay say day way ray pay lay may ly sly fly ugly only rally reply apply badly ry try cry dry fry very weary carry gh high sigh weigh bough though ew new few pew blew view ow now how low row sow yellow 3 | fall jam dash kid ska lad alf bank navy valid man gal ham talk yak rutty urn elf is wolf oven quasi pet xxl cot zone abcdefghijklmnopqrstuvwxyz fife jojoba doddle kick suss label aka bob nine vulva memo guggle hah totality yellowy river unused eke ivied willow oboe quark prep xerox clack zigzag zyxwvutsrqponmlkjihgfedcba 4 | hay heir harp half hang hack hex high echo earn elan eddy edit obit oboe obey owl oak okie dokey down duty dux dixy doxy xmas xtal nix next note name nape nail snap spar step slow shot shit qua quay quad quod quit pack pray pure pig pixy push rush rue rock rose rich ring main mad male melt milk make zero zest zonk zoom zinc zing 5 | year yelp ywis your chip char cut chut coxy cow kale ken knap keep keck kiwi with wind wick woke wont void volt vole vote vita vox vug very jerk joke jack jab job jamb jeep girl glue gold grow good luck lake lid lie lex live love allowable absolute black bonus bicycle expressive eating fortune finish frequency fuzzy imperial 6 | include kilobyte obtain throw tutor cherry casino cinema cajole candle rubric rover rigor unbound unique vampire velvet vogue yearly zombie zippy quack quick quake queen query quorum quadruple xenon xerox xistor xiphoid xylogen xanthoxylone nixie nothing network neighbour window weight world winch whose white south sounding submarine jumbo justify journey government paradox penalty paving pepsi guano apes memento mori -------------------------------------------------------------------------------- /gamma/en_base.txt: -------------------------------------------------------------------------------- 1 | th the they then them there their that this wh why who whom when where what while ea eat east tear read head beat deal leaf ed bed med led red tired shed liked armed moved en pen den ten often listen given taken even frozen happen broken er her ever over river after enter 2 | under order biker joker ar car bar mar oral polar solar star or for nor author actor major motor tutor sailor al pal gal dual usual rural royal vital total ay say day way ray pay lay may ly sly fly ugly only rally reply apply badly ry try cry dry fry very weary carry gh high sigh weigh bough though ew new few pew blew view ow now how low row sow yellow 3 | fall jam dash kid ska lad alf bank navy valid man gal ham talk yak rutty urn elf is wolf oven quasi pet xxl cot zone abcdefghijklmnopqrstuvwxyz fife jojoba doddle kick suss label aka bob nine vulva memo guggle hah totality yellowy river unused eke ivied willow oboe quark prep xerox clack zigzag zyxwvutsrqponmlkjihgfedcba 4 | hay heir harp half hang hack hex high echo earn elan eddy edit obit oboe obey owl oak okie dokey down duty dux dixy doxy xmas xtal nix next note name nape nail snap spar step slow shot shit qua quay quad quod quit pack pray pure pig pixy push rush rue rock rose rich ring main mad male melt milk make zero zest zonk zoom zinc zing 5 | year yelp ywis your chip char cut chut coxy cow kale ken knap keep keck kiwi with wind wick woke wont void volt vole vote vita vox vug very jerk joke jack jab job jamb jeep girl glue gold grow good luck lake lid lie lex live love allowable absolute black bonus bicycle expressive eating fortune finish frequency fuzzy imperial 6 | include kilobyte obtain throw tutor cherry casino cinema cajole candle rubric rover rigor unbound unique vampire velvet vogue yearly zombie zippy quack quick quake queen query quorum quadruple xenon xerox xistor xiphoid xylogen xanthoxylone nixie nothing network neighbour window weight world winch whose white south sounding submarine jumbo justify journey government paradox penalty paving pepsi guano apes memento mori -------------------------------------------------------------------------------- /dict/num_begin.txt: -------------------------------------------------------------------------------- 1 | 110 114 112 119 113 114 117 115 116 117 110 118 114 115 116 117 118 117 119 2 | 221 227 224 228 221 220 224 227 225 226 228 224 229 225 228 224 229 220 223 3 | 331 330 332 338 334 337 335 336 337 335 334 338 332 339 338 330 332 337 339 4 | 441 448 444 445 447 443 446 448 440 449 447 443 449 441 442 445 447 449 446 5 | 554 552 551 552 553 551 552 552 559 558 550 558 557 556 558 559 552 559 558 6 | 661 663 667 669 660 669 663 662 663 660 662 667 669 667 669 660 662 663 661 7 | 774 773 770 778 775 774 775 779 776 779 770 776 773 774 773 775 771 770 774 8 | 883 881 884 887 880 889 886 887 885 883 889 882 883 880 889 882 883 884 882 9 | 991 993 997 994 995 997 996 990 998 997 994 996 993 995 997 992 991 990 998 10 | 001 003 004 007 004 007 004 007 006 005 007 005 006 007 008 003 009 002 004 11 | 12 | 12345 67890 34245 87986 12310 87934 56783 42356 38790 58698 23498 34213 13 | 34247 45678 86794 43582 34235 67897 77567 84793 07654 43546 87938 45673 14 | 23413 49487 45432 76978 48395 94670 05631 98376 45398 13245 67987 34567 15 | 38566 44556 34875 97665 76765 78945 23413 01048 38492 10438 49583 13567 16 | 01857 11046 44587 55469 36678 95743 34256 87980 34567 33567 55767 44567 17 | 34983 13874 34238 43878 97568 56793 87495 67349 58739 34560 08097 87918 18 | 34287 45698 97809 08978 34245 67897 56738 42347 12345 67890 09856 45636 19 | 44334 77678 44908 55467 77867 30897 13243 22347 33987 45980 97089 57649 20 | 93856 13487 66089 55487 33987 98043 98347 45623 94859 08137 13048 93875 21 | 22 | 38 3423 348 123984 13 87498 34 237 456 87 34983 13 23487 58706 587 38798 23 | 76 58790 476 38 5678 24 38798 47596 5670 0087 598 32 3423 14837 47 93875 24 | 567948 34 857938 78 3476 587930 01189 8347 87 34 958709 4387 57 38 90 18 25 | 23 98 4789 5674 35 74 8 3879 432 3487 347 598 6890 2349 342 1324 879 089 7 26 | 5890 48 3 8798 378 56739 132 3423 88098 7783492 1239 587098 567893 47893 27 | 9807 969 103 29 8398 483 9288746 756890 3879 342 3485679 108 2938 4829 38 28 | 93 58 47 3879 83749 39 102938 34920 239 384792 3134 239880 123497 13 4789 29 | 30 | % * + - = 31 | % * + - = 32 | % * + - = 33 | % * + - = 34 | -------------------------------------------------------------------------------- /speed/reset.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | body, h1, h2, h3, h4, h5, h6 { 3 | font: 14px/18px Verdana, sans-serif; 4 | } 5 | code, kbd, pre, samp, tt, var { 6 | font: 14px/18px Consolas, "Courier New", monospace; 7 | } 8 | body, optgroup { 9 | color: #000; 10 | background: #fff; 11 | } 12 | body, code, dl, dd, form, pre { 13 | margin: 0; 14 | } 15 | a:link { 16 | color: #009; 17 | } 18 | a:link, a:visited, ins { 19 | text-decoration: none; 20 | } 21 | a:visited { 22 | color: #505; 23 | } 24 | a:hover { 25 | text-decoration: underline; 26 | } 27 | a:link img, a:visited img, object, fieldset, abbr, acronym { 28 | border: none; 29 | } 30 | sub, sup { 31 | position: relative; 32 | display: inline-block; 33 | font-size: 11px; 34 | line-height: 11px; 35 | } 36 | sub { 37 | top: 5px; 38 | vertical-align: middle; 39 | } 40 | sup { 41 | top: -2px; 42 | margin-top: -11px; 43 | } 44 | abbr, acronym { 45 | cursor: help; 46 | border-bottom: 1px dotted #999; 47 | } 48 | address, cite, dfn { 49 | font-style: normal; 50 | } 51 | code, pre { 52 | white-space: pre-wrap; 53 | } 54 | img { 55 | vertical-align: bottom; 56 | } 57 | td, th, textarea { 58 | vertical-align: top; 59 | } 60 | input, select, button { 61 | overflow: visible; 62 | vertical-align: middle; 63 | } 64 | legend { 65 | color: #000; 66 | margin: 0 0 -2px; 67 | padding: 0; 68 | } 69 | li { 70 | display: block; 71 | list-style: none; 72 | } 73 | optgroup option { 74 | padding-left: 22px; 75 | } 76 | table { 77 | border-collapse: collapse; 78 | } 79 | caption, th { 80 | text-align: left; 81 | } 82 | td, th { 83 | padding: 0; 84 | } 85 | address, blockquote, h1, h2, h3, h4, h5, h6, fieldset, p, ol, ul { 86 | margin: 0; 87 | padding: 0; 88 | } 89 | th, h1, h2, h3, h4, h5, h6 { 90 | font-weight: normal; 91 | } 92 | q { 93 | quotes: "\00ab" "\00bb" "\201e" "\201c"; 94 | } 95 | q:after { 96 | content: "\00bb"; 97 | } 98 | q:before { 99 | content: "\00ab"; 100 | } 101 | q > q:after { 102 | content: "\201c"; 103 | } 104 | q > q:before { 105 | content: "\201e"; 106 | } 107 | legend { 108 | margin-left: -7px; 109 | } 110 | -------------------------------------------------------------------------------- /speed/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #fff; 3 | color: #000; 4 | font-size: 12pt; 5 | } 6 | 7 | #kb { 8 | width: 700pt; 9 | margin: 50px auto; 10 | } 11 | #info { 12 | padding-top: 30px; 13 | text-align: right; 14 | font-size: 12px; 15 | } 16 | #user { 17 | float: left; 18 | background: url(../files/avatar/keyboard.png) no-repeat; 19 | padding-left: 60px; 20 | height: 50px; 21 | font-family: sans-serif; 22 | } 23 | 24 | #input { 25 | margin-bottom: 3px; 26 | clear: left; padding-top: 50px; 27 | } 28 | #input input, #text { 29 | font-family: Times New Roman, serif; 30 | font-size: 25px; 31 | margin: 0; 32 | padding: 0; 33 | border: 0; 34 | outline: 0; 35 | } 36 | #text { 37 | position: absolute; 38 | } 39 | #text div { 40 | line-height: 130%; 41 | } 42 | 43 | #input input { 44 | width: 100%; 45 | background: #fff; 46 | color: #000; 47 | border-bottom: 1px dotted #aaa; 48 | } 49 | 50 | #input input.error { 51 | background: #ff0; 52 | } 53 | #text.error { 54 | color: #f00; 55 | } 56 | #text span.old { 57 | color: #aaa; 58 | } 59 | #text span.cursor { 60 | /*background: #eee; 61 | color: #fff; 62 | padding: 0 2px;*/ 63 | border-bottom: 2px solid #777; 64 | } 65 | #text span.metronome { 66 | background: #ffa; 67 | } 68 | #text div.maxerrors { 69 | color: red; 70 | } 71 | #text div.hide { 72 | display: none; 73 | } 74 | 75 | div.annotation { 76 | color: #aaa; 77 | margin-top: -50px; 78 | font-size: 30px; 79 | border: 2px solid #aaa; 80 | background: #fff; 81 | height: 300px; 82 | position: absolute; 83 | margin: 0 auto; 84 | padding: 20px; 85 | top: 150px; 86 | width: 680pt; 87 | } 88 | div.close_title { 89 | float: right; 90 | margin-right: 10px; 91 | font-size: 10px; 92 | color: #aaa; 93 | font-family: sans-serif; 94 | } 95 | span.close { 96 | height: 20px; 97 | padding-left: 20px; 98 | background: url(../i/icons.png) no-repeat 0 -400px; 99 | cursor: pointer; 100 | float: right; 101 | } 102 | 103 | .icon_speed { 104 | margin-left: 20px; 105 | background: url(../i/icons.png) no-repeat 0 -300px; 106 | padding-left: 20px; 107 | } 108 | .icon_errors { 109 | margin-left: 20px; 110 | background: url(../i/icons.png) no-repeat 0 -250px; 111 | padding-left: 20px; 112 | } 113 | .icon_metronome { 114 | margin-left: 20px; 115 | background: url(../i/icons.png) no-repeat 0 -350px; 116 | padding-left: 20px; 117 | } 118 | -------------------------------------------------------------------------------- /dict/eng_begin_stamina.txt: -------------------------------------------------------------------------------- 1 | fall jam dash kid bank navy valid man talk is wolf oven pet xxl zone 2 | fife jojoba doddle kick suss label aka bob nine memo 3 | hah totality yellowy river unused eke ivied willow oboe quark prep xerox clack zigzag 4 | hay heir harp half hang hack hex high echo earn elan eddy edit obit oboe obey owl oak okie 5 | dokey down duty dux dixy doxy xmas xtal nix next note name nape nail snap spar step slow shot shit 6 | quad quod quit pack pray pure pig pixy push rush rue rock rose rich ring 7 | main mad male melt milk make zero zest zonk zoom zinc zing year yelp ywis your 8 | chip char cut chut coxy cow kale ken knap keep keck kiwi with wind wick woke wont 9 | void volt vole vote vita vox vug very jerk joke jack jab job jamb jeep 10 | girl glue gold grow good luck lake lid lie lex live love 11 | allowable absolute black bonus bicycle expressive eating 12 | fortune finish frequency fuzzy imperial include kilobyte obtain 13 | throw tutor cherry casino cinema cajole candle rubric rover rigor 14 | unbound unique vampire velvet vogue yearly zombie zippy quack quick quake queen query quorum quadruple 15 | xenon xerox xistor xiphoid xylogen xanthoxylone nixie nothing network neighbour 16 | window weight world winch whose white south sounding submarine jumbo justify journey government paradox penalty paving pepsi 17 | the they then them there their that this why who whom when where what while 18 | eat east tear read head beat deal leaf ed bed med led red tired shed liked armed moved 19 | pen den ten often listen given taken even frozen happen broken 20 | her ever over river after enter under order biker joker car bar mar oral polar solar star or for nor 21 | author actor major motor tutor sailor pal gal dual usual rural royal vital total 22 | say day way ray pay lay may ly sly fly ugly only rally reply apply badly try cry dry fry very weary carry 23 | high sigh weigh bough though new few pew blew view ow now how low row sow yellow 24 | unit uncle under unable unlock ping wing bring thing doing going night right 25 | weight straight thought dish wish finish publish longish fist list exist consist 26 | nous famous nervous house age page stage manage voyage rant distant giant variant 27 | moment ferment equipment action option edition mention condition citation future culture nature picture 28 | the they there at that what is his this it in to into an can and as was has had have 29 | be been up on upon if of or for from who why which we were are 30 | isn't aren't can't wasn't weren't haven't hasn't hadn't won't don't didn't this's they're you're it's i'm i'll what's 31 | -------------------------------------------------------------------------------- /dict/ukr_begin.txt: -------------------------------------------------------------------------------- 1 | атаман аборт бокс брати гетьман гроші гурт горілка 2 | йолоп держава човен вино козак красень кріпак лев 3 | тло жінка клавіатура музика мода гість станок комп'ютер 4 | йог соловійко щебетати ангел вальс джерело нафта індекс 5 | гривня кінь місяць радість учень калина життя щастя шлейф 6 | відвага мудрість принтер хризантема в'язниця відповідь 7 | гроза кобзар зір подорож ніч мазь рибальство мисливство 8 | сільський міський сміх сніг пам'ятник священик морквяний 9 | м'язи п'єдестал бур'ян святий священний життєпис пів'яблука 10 | глузд військкомат ллється космос наука кінець 11 | 12 | збавити зціпити зшиток ізнов с сказати спалахнути ствердити сфотографувати схил 13 | з'єднувати зекономити з'їзд зігнорувати зорієнтуватися скоротити склад 14 | зібгати зігнути зідрати зізнатися зіткнення зіщулитися без від од між 15 | над об під перед понад пред роз через безкраїй безкорисливий відкриття відстань 16 | міжконтинентальний міжпланетний надпотужний обпалити обтрусити 17 | підтримка передплата передчасний понадплановий представник 18 | розтягнути розчин розхитати черезплічник 19 | пре при прі пре при пре прегарний презавзятий прекрасний препогано 20 | премудро прибігти прикрутити приборкати прибраний привабливо прибуття пришвидшити прізвисько прізвище прірва 21 | 22 | важкоатлет гірничопромисловий яснозорий середньовіччя верхньодніпровський 23 | атомохід кожум'яка боєздатність одноденний всюдихід кількаразовий виконком 24 | чотирьохактний двохосьовий піваркуша півогірка напівавтомат блок-система 25 | стоп-кран свят-вечір унтер-офіцер член-кореспондент кіловат-година віце-президент 26 | норд-ост лейб-медик роликопідшипники телеапаратура гідроелектростанції гриб-паразит 27 | заєць-русак українка-дівчина дівчина-українка будь-котрий будь-хто будь-чий будь-що казна-що 28 | хтозна-який теплообмінний народно-визвольний масово-політичний м'ясо-молочний темно-зелений 29 | кисло-солодкий сіро-голубий жовтогарячий червоногарячий віднині набагато отак занадто 30 | спереду напереріз напам'ять униз вручну абикуди абияк аніскільки деколи деінде щохвилини 31 | якомога якраз якнайдовше повернув убік 32 | ударив бікж прочитай вірш напам'ять 33 | пам'ять він подарувавж всередині щось дуже заболіло 34 | правило шукай середині розділу 35 | 36 | обріз весну навесні сих пір через силу з-за кордону 37 | один день по-козацькому по-нашому по-своєму 38 | по-українському по-українськи по-латині аби-то будь-де будь-коли 39 | так-то сяк-так десь-інде віч-на-віч всього-на-всього далеко-далеко 40 | задля заради з-за із-за з-над з-перед з-під із-під з-поза з-поміж 41 | під кінець під час що ж до мовби зате притому немовбито тобто якби начебто 42 | -------------------------------------------------------------------------------- /beta/klava.css: -------------------------------------------------------------------------------- 1 | body, input, div, span { 2 | font-family: monospace; 3 | font-size: 15px; 4 | } 5 | body { 6 | padding-top: 100px; 7 | text-align: center; 8 | background: #ddd; 9 | color: #000; 10 | } 11 | .data { 12 | text-align: left; 13 | display: inline-block; 14 | width: 780px; 15 | } 16 | .text { 17 | } 18 | .text span.line { 19 | margin: 7px; 20 | background: #fff; 21 | } 22 | .text span.line .error { 23 | background: #ff8; 24 | } 25 | .text .printed { 26 | background: #ccc; 27 | } 28 | #stat { 29 | position: absolute; 30 | top: 40px; 31 | left: -40px; 32 | width: 100%; 33 | text-align: center; 34 | } 35 | #input_text { 36 | padding: 3px 5px; 37 | border: 1px solid #777; 38 | } 39 | #input_text.error { 40 | background: #aaa; 41 | } 42 | .info { 43 | text-align: center; 44 | margin-top: 40px; 45 | margin-right: 50px; 46 | } 47 | #sel_reload { 48 | cursor: pointer; 49 | } 50 | #keyboard { 51 | text-align: left; 52 | display: inline-block; 53 | width: 530px; 54 | } 55 | #keyboard .line { 56 | clear: left; 57 | } 58 | #keyboard .line div { 59 | float: left; 60 | width: 20px; 61 | line-height: 20px; 62 | font-size: 15px; 63 | border: 1px solid #777; 64 | background: #fff; 65 | margin: 2px; 66 | padding: 5px; 67 | } 68 | #keyboard div.f5 { 69 | background: #c5d0e6; 70 | } 71 | #keyboard div.f4 { 72 | background: #ffdead; 73 | } 74 | #keyboard div.f3 { 75 | background: #ffc8a8; 76 | } 77 | #keyboard div.f2 { 78 | background: #1fcecb; 79 | } 80 | #keyboard div.f1 { 81 | background: #bdecb6; 82 | } 83 | #keyboard div.tab { 84 | width: 40px; 85 | } 86 | #keyboard div.caps { 87 | width: 50px; 88 | } 89 | #keyboard div.lshift { 90 | width: 70px; 91 | } 92 | #keyboard div.backspace { 93 | width: 40px; 94 | } 95 | #keyboard div.enter { 96 | width: 46px; 97 | } 98 | #keyboard div.rshift { 99 | width: 62px; 100 | } 101 | #keyboard div.lctrl, 102 | #keyboard div.lwin, 103 | #keyboard div.lalt, 104 | #keyboard div.rctrl, 105 | #keyboard div.rwin, 106 | #keyboard div.ralt, 107 | #keyboard div.menu { 108 | width: 30px; 109 | } 110 | #keyboard div.sys { 111 | background: #cacaca; 112 | font-size: 12px; 113 | text-align: center; 114 | } 115 | #keyboard div.space { 116 | width: 186px; 117 | font-size: 14px; 118 | text-align: center; 119 | } 120 | #keyboard div.hand { 121 | } 122 | #keyboard div.start { 123 | } 124 | #keyboard div.select { 125 | margin-top: 40px; 126 | text-align: center; 127 | } 128 | -------------------------------------------------------------------------------- /alpha/index.not.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Klavarog α 6 | 7 | 74 | 75 | 76 |
77 | 78 | 79 | 82 | 83 |
84 | 85 |
86 |

Здравствуй, любознательный друг!

87 |

Ты видишь эту страницу только потому, что решил посмотреть какая была альфа версия клавиатурного тренажера Klavarog. Но все дело в том, что первой версией была бета :-)

88 |

Подробнее о тренажере можно узнать на странице «О сайте».

89 |
90 | 91 |
92 |
93 | 94 | 95 | 98 |
99 | Klavarog 100 |
101 |
102 | 103 | -------------------------------------------------------------------------------- /dict/eng_code_sql.txt: -------------------------------------------------------------------------------- 1 | SELECT c.id AS cid, c.title AS ctitle, g.id AS gid, g.title AS gtitle, IF (i2.id IS NULL, i.id, i2.id) AS image_id FROM photo_category AS c JOIN photo_gallery AS g ON (g.c_id=c.id AND c.is_published AND g.is_published) JOIN photo_image AS i ON (i.g_id = g.id AND i.is_published) LEFT JOIN photo_image AS i2 ON (i2.g_id = g.id AND i2.is_main_foto) WHERE c.id = 1 GROUP BY g.id HAVING COUNT(i.id) > 0 ORDER BY c.ordi, g.ordi, i.ordi; 2 | SELECT ordi, id, title FROM photo_image WHERE EXISTS (SELECT i.id FROM photo_category AS c JOIN photo_gallery AS g ON (g.c_id=c.id AND c.is_published AND g.is_published) JOIN photo_image AS i ON (i.g_id = g.id AND i.is_published) WHERE i.id = 1) AND g_id = (SELECT g_id FROM photo_image WHERE id = 1) AND (ordi = (SELECT MAX(ordi) FROM photo_image WHERE is_published AND g_id = (SELECT g_id FROM photo_image WHERE id = 1) AND ordi < (SELECT ordi FROM photo_image WHERE id = 1)) OR ordi = (SELECT MIN(ordi) from photo_image WHERE is_published AND g_id = (SELECT g_id FROM photo_image WHERE id = 1) AND ordi > (SELECT ordi FROM photo_image WHERE id = 1)) OR id = 1); 3 | 4 | CREATE TABLE news_list (news_date TIMESTAMP NOT NULL, news_title VARCHAR(255)); 5 | SELECT 0 AS news_date, 'DUMMY' AS news_title UNION ( 6 | SELECT UNIX_TIMESTAMP(nl_1.news_date) AS news_date, nl_1.news_title FROM news_list nl_1 WHERE UNIX_TIMESTAMP(nl_1.news_date) > ?d ORDER BY news_date ASC LIMIT 0, 6 7 | ) UNION SELECT ?d AS news_date, 'CURRENT' AS news_title UNION ( 8 | SELECT UNIX_TIMESTAMP(nl_2.news_date) AS news_date, nl_2.news_title FROM news_list nl_2 WHERE UNIX_TIMESTAMP(nl_2.news_date) < ?d ORDER BY news_date DESC LIMIT 0, 6 9 | ) ORDER BY news_date DESC 10 | 11 | ALTER TABLE "user" ADD COLUMN fts tsvector; 12 | CREATE INDEX user_fts_ix ON "user" USING gist(fts); 13 | UPDATE "user" SET fts = setweight(coalesce(to_tsvector('russian', "login"), ''), 'A'); 14 | CREATE OR REPLACE FUNCTION tr_user_fts() RETURNS TRIGGER AS 15 | DECLARE _need_update BOOLEAN := true; BEGIN IF TG_OP = 'UPDATE' THEN IF ROW(NEW.login) IS NOT DISTINCT FROM ROW(OLD.login) THEN _need_update := false; END IF; END IF; IF _need_update THEN NEW.fts := setweight(coalesce(to_tsvector('russian', NEW.login), ''), 'A'); END IF; END; 16 | LANGUAGE plpgsql VOLATILE; 17 | CREATE TRIGGER biu_tr_user_fts BEFORE INSERT OR UPDATE ON "user" FOR EACH ROW EXECUTE tr_user_fts(); 18 | 19 | ALTER TABLE user_profile ADD COLUMN fts tsvector; 20 | CREATE INDEX user_profile_fts_ix ON user_profile USING gist(fts); 21 | UPDATE user_profile SET fts = setweight(coalesce(to_tsvector('russian', firstname), ''), 'A') || setweight(coalesce(to_tsvector('russian', middlename), ''), 'A') || setweight(coalesce(to_tsvector('russian', lastname), ''), 'A'); 22 | ALTER TABLE company ADD COLUMN fts tsvector; 23 | CREATE INDEX company_fts_ix ON company USING gist(fts); 24 | -------------------------------------------------------------------------------- /beta/index.css: -------------------------------------------------------------------------------- 1 | body, input, div, span { 2 | font-family: monospace; 3 | font-size: 15px; 4 | } 5 | body { 6 | text-align: center; 7 | background: #ddd; 8 | color: #000; 9 | } 10 | .data { 11 | padding-top: 100px; 12 | text-align: left; 13 | display: inline-block; 14 | width: 780px; 15 | } 16 | .text { 17 | } 18 | .dict .text { 19 | margin-top: 5px; 20 | } 21 | .text span.line { 22 | margin: 7px; 23 | background: #fff; 24 | } 25 | .text span.line .error { 26 | background: #ff8; 27 | } 28 | .text .printed { 29 | background: #ccc; 30 | } 31 | #stat { 32 | position: absolute; 33 | top: 40px; 34 | left: -40px; 35 | width: 100%; 36 | text-align: center; 37 | } 38 | #input_text { 39 | padding: 3px 5px; 40 | border: 1px solid #777; 41 | } 42 | #input_text.error { 43 | background: #aaa; 44 | } 45 | .info { 46 | text-align: center; 47 | margin-top: 40px; 48 | margin-right: 50px; 49 | } 50 | #question { 51 | font-size: 20px; 52 | margin: 3px 7px; 53 | } 54 | #sel_reload { 55 | cursor: pointer; 56 | } 57 | #keyboard { 58 | text-align: left; 59 | display: inline-block; 60 | width: 530px; 61 | } 62 | #keyboard .line { 63 | clear: left; 64 | } 65 | #keyboard .line div { 66 | float: left; 67 | width: 20px; 68 | line-height: 20px; 69 | font-size: 15px; 70 | border: 2px solid #aaa; 71 | background: #fff; 72 | margin: 1px; 73 | padding: 5px; 74 | -moz-border-radius: 5px; 75 | -webkit-border-radius: 5px; 76 | } 77 | #keyboard div.bw .line div { 78 | background: #fff; 79 | } 80 | #keyboard div.bw .line div.sys { 81 | background: #ddd; 82 | } 83 | #keyboard div.f5 { 84 | background: #c5d0e6; 85 | background: #93E2D5; 86 | } 87 | #keyboard div.f4 { 88 | background: #ffdead; 89 | background: #89E894; 90 | } 91 | #keyboard div.f3 { 92 | background: #ffc8a8; 93 | background: #BED661; 94 | } 95 | #keyboard div.f2 { 96 | background: #1fcecb; 97 | background: #78D5E3; 98 | } 99 | #keyboard div.f1 { 100 | background: #bdecb6; 101 | background: #34DDDD; 102 | } 103 | #keyboard div.tab { 104 | width: 40px; 105 | } 106 | #keyboard div.caps { 107 | width: 50px; 108 | } 109 | #keyboard div.lshift { 110 | width: 70px; 111 | } 112 | #keyboard div.lshift2 { 113 | width: 34px; 114 | } 115 | #keyboard div.backspace { 116 | width: 40px; 117 | } 118 | #keyboard div.enter { 119 | width: 46px; 120 | } 121 | #keyboard div.rshift { 122 | width: 62px; 123 | } 124 | #keyboard div.lctrl, 125 | #keyboard div.lwin, 126 | #keyboard div.lcmd, 127 | #keyboard div.lalt, 128 | #keyboard div.rctrl, 129 | #keyboard div.rwin, 130 | #keyboard div.rcmd, 131 | #keyboard div.ralt, 132 | #keyboard div.menu { 133 | width: 30px; 134 | } 135 | #keyboard div.sys { 136 | background: #ccc; 137 | font-size: 12px; 138 | text-align: center; 139 | } 140 | #keyboard div.space { 141 | width: 186px; 142 | font-size: 14px; 143 | text-align: center; 144 | } 145 | #keyboard div.hand { 146 | border: 2px solid #444; 147 | } 148 | #keyboard div.start { 149 | } 150 | #keyboard div.select { 151 | margin-top: 40px; 152 | text-align: center; 153 | } 154 | -------------------------------------------------------------------------------- /gamma/index.css: -------------------------------------------------------------------------------- 1 | body, input, div, span { 2 | font-family: monospace; 3 | font-size: 15px; 4 | } 5 | body { 6 | text-align: center; 7 | background: #ddd; 8 | background: #fff; 9 | color: #000; 10 | } 11 | .data { 12 | padding-top: 100px; 13 | text-align: left; 14 | display: inline-block; 15 | width: 780px; 16 | } 17 | .text { 18 | margin-bottom: 1px; 19 | } 20 | .dict .text { 21 | margin-top: 5px; 22 | } 23 | .text span.line { 24 | margin: 7px; 25 | background: #fff; 26 | 1background: #ddd; 27 | } 28 | .error { 29 | background: #ff8; 30 | } 31 | .printed { 32 | background: #ccc; 33 | } 34 | #stat { 35 | position: absolute; 36 | top: 40px; 37 | left: -40px; 38 | width: 100%; 39 | text-align: center; 40 | cursor: help; 41 | } 42 | #input_text { 43 | padding: 3px 5px; 44 | 1border: 1px solid #777; 45 | 1border: none; 46 | 1border-bottom: 1px dotted #000; 47 | } 48 | #input_text.error { 49 | background: #aaa; 50 | } 51 | .info { 52 | text-align: center; 53 | margin-top: 40px; 54 | margin-right: 50px; 55 | } 56 | #question { 57 | font-size: 20px; 58 | margin: 3px 7px; 59 | } 60 | #sel_reload { 61 | cursor: pointer; 62 | } 63 | #keyboard { 64 | text-align: left; 65 | display: inline-block; 66 | width: 530px; 67 | } 68 | #keyboard .line { 69 | clear: left; 70 | } 71 | #keyboard .line div { 72 | float: left; 73 | width: 20px; 74 | line-height: 20px; 75 | font-size: 15px; 76 | border: 2px solid #aaa; 77 | background: #fff; 78 | margin: 1px; 79 | padding: 5px; 80 | -moz-border-radius: 5px; 81 | -webkit-border-radius: 5px; 82 | } 83 | #keyboard div.bw .line div { 84 | background: #fff; 85 | } 86 | #keyboard div.bw .line div.sys { 87 | background: #ddd; 88 | } 89 | #keyboard div.f5 { 90 | background: #c5d0e6; 91 | background: #93E2D5; 92 | } 93 | #keyboard div.f4 { 94 | background: #ffdead; 95 | background: #89E894; 96 | } 97 | #keyboard div.f3 { 98 | background: #ffc8a8; 99 | background: #BED661; 100 | } 101 | #keyboard div.f2 { 102 | background: #1fcecb; 103 | background: #78D5E3; 104 | } 105 | #keyboard div.f1 { 106 | background: #bdecb6; 107 | background: #34DDDD; 108 | } 109 | #keyboard div.tab { 110 | width: 40px; 111 | } 112 | #keyboard div.caps { 113 | width: 50px; 114 | } 115 | #keyboard div.lshift { 116 | width: 70px; 117 | } 118 | #keyboard div.lshift2 { 119 | width: 34px; 120 | } 121 | #keyboard div.backspace { 122 | width: 40px; 123 | } 124 | #keyboard div.enter { 125 | width: 46px; 126 | } 127 | #keyboard div.rshift { 128 | width: 62px; 129 | } 130 | #keyboard div.lctrl, 131 | #keyboard div.lwin, 132 | #keyboard div.lcmd, 133 | #keyboard div.lalt, 134 | #keyboard div.rctrl, 135 | #keyboard div.rwin, 136 | #keyboard div.rcmd, 137 | #keyboard div.ralt, 138 | #keyboard div.menu { 139 | width: 30px; 140 | } 141 | #keyboard div.sys { 142 | background: #ccc; 143 | font-size: 12px; 144 | text-align: center; 145 | } 146 | #keyboard div.space { 147 | width: 186px; 148 | font-size: 14px; 149 | text-align: center; 150 | } 151 | #keyboard div.hand { 152 | border: 2px solid #444; 153 | } 154 | #keyboard div.start { 155 | } 156 | #keyboard div.select { 157 | margin-top: 40px; 158 | text-align: center; 159 | } 160 | -------------------------------------------------------------------------------- /speed/index.php: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | <?php echo htmlspecialchars($_GET['dict']); ?> | klava.org 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 | anonymous 18 |
19 |
20 | 0 21 | 24 | 200 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 |
34 |
35 |
36 | 37 |
(Click, Enter, Esc)
38 | 39 | 40 | 41 | 42 |
43 | 50 |
51 | 52 | 53 | 56 | 57 | 58 | 59 | 60 | klava.org | Keyboard Trainer | Клавиатурный тренажёр 61 | 62 | 63 |
64 |

Клавиатурный тренажёр

65 |

Вы находитесь в экспериментальной части клавиатурного тренажера Klava.org. Режим "Speed" предназначен для уже продвинутых пользователей машинописи, развивает скорость и безошибочность набора текста.

66 |
67 |

Выберите словарь, из которого будут браться тексты для вашей тренировки:

68 |

English

69 |

Русский

70 |
71 |

По всем вопросам пишите письма на электронный ящик: Vladimir <ibnteo@gmail.com>

72 |
73 | 74 | 75 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | n/a 21 | 22 | php log(' 23 | '); 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | Comment: 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | item is boolean 48 | not item 49 | true 50 | false 51 | lang is russian 52 | 53 | 54 | 55 | 123 56 | 57 | 12 58 | 12 59 | 123 60 | 61 | 62 | 63 | 64 | 54falsetext 65 | true 66 | true 67 | first 68 | second 69 | t sec 70 | 12 71 | first second 72 | FirSt Sec0nD 73 | 74 | 75 | 76 | last item 77 | 78 | item 79 | http://my.namespace.com/ 80 | my:item 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | # 92 | 93 |

94 | 95 | 96 |
97 | 98 |
-------------------------------------------------------------------------------- /dict/eng_code_c.txt: -------------------------------------------------------------------------------- 1 | #include "ch.h" 2 | 3 | #if CH_USE_SEMAPHORES || defined(__DOXYGEN__) 4 | 5 | #if CH_USE_SEMAPHORES_PRIORITY 6 | #define sem_insert(tp, qp) prio_insert(tp, qp) 7 | #else 8 | #define sem_insert(tp, qp) queue_insert(tp, qp) 9 | #endif 10 | 11 | void chSemInit(Semaphore *sp, cnt_t n) { 12 | 13 | chDbgCheck((sp != NULL) && (n >= 0), "chSemInit"); 14 | 15 | queue_init(&sp->s_queue); 16 | sp->s_cnt = n; 17 | } 18 | 19 | void chSemReset(Semaphore *sp, cnt_t n) { 20 | 21 | chSysLock(); 22 | chSemResetI(sp, n); 23 | chSchRescheduleS(); 24 | chSysUnlock(); 25 | } 26 | 27 | void chSemResetI(Semaphore *sp, cnt_t n) { 28 | cnt_t cnt; 29 | 30 | chDbgCheckClassI(); 31 | chDbgCheck((sp != NULL) && (n >= 0), "chSemResetI"); 32 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 33 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 34 | "chSemResetI(), #1", 35 | "inconsistent semaphore"); 36 | 37 | cnt = sp->s_cnt; 38 | sp->s_cnt = n; 39 | while (++cnt <= 0) 40 | chSchReadyI(lifo_remove(&sp->s_queue))->p_u.rdymsg = RDY_RESET; 41 | } 42 | 43 | msg_t chSemWait(Semaphore *sp) { 44 | msg_t msg; 45 | 46 | chSysLock(); 47 | msg = chSemWaitS(sp); 48 | chSysUnlock(); 49 | return msg; 50 | } 51 | 52 | msg_t chSemWaitS(Semaphore *sp) { 53 | 54 | chDbgCheckClassS(); 55 | chDbgCheck(sp != NULL, "chSemWaitS"); 56 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 57 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 58 | "chSemWaitS(), #1", 59 | "inconsistent semaphore"); 60 | 61 | if (--sp->s_cnt < 0) { 62 | currp->p_u.wtobjp = sp; 63 | sem_insert(currp, &sp->s_queue); 64 | chSchGoSleepS(THD_STATE_WTSEM); 65 | return currp->p_u.rdymsg; 66 | } 67 | return RDY_OK; 68 | } 69 | 70 | msg_t chSemWaitTimeout(Semaphore *sp, systime_t time) { 71 | msg_t msg; 72 | 73 | chSysLock(); 74 | msg = chSemWaitTimeoutS(sp, time); 75 | chSysUnlock(); 76 | return msg; 77 | } 78 | 79 | msg_t chSemWaitTimeoutS(Semaphore *sp, systime_t time) { 80 | 81 | chDbgCheckClassS(); 82 | chDbgCheck(sp != NULL, "chSemWaitTimeoutS"); 83 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 84 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 85 | "chSemWaitTimeoutS(), #1", 86 | "inconsistent semaphore"); 87 | 88 | if (--sp->s_cnt < 0) { 89 | if (TIME_IMMEDIATE == time) { 90 | sp->s_cnt++; 91 | return RDY_TIMEOUT; 92 | } 93 | currp->p_u.wtobjp = sp; 94 | sem_insert(currp, &sp->s_queue); 95 | return chSchGoSleepTimeoutS(THD_STATE_WTSEM, time); 96 | } 97 | return RDY_OK; 98 | } 99 | 100 | void chSemSignal(Semaphore *sp) { 101 | 102 | chDbgCheck(sp != NULL, "chSemSignal"); 103 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 104 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 105 | "chSemSignal(), #1", 106 | "inconsistent semaphore"); 107 | 108 | chSysLock(); 109 | if (++sp->s_cnt <= 0) 110 | chSchWakeupS(fifo_remove(&sp->s_queue), RDY_OK); 111 | chSysUnlock(); 112 | } 113 | 114 | void chSemSignalI(Semaphore *sp) { 115 | 116 | chDbgCheckClassI(); 117 | chDbgCheck(sp != NULL, "chSemSignalI"); 118 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 119 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 120 | "chSemSignalI(), #1", 121 | "inconsistent semaphore"); 122 | 123 | if (++sp->s_cnt <= 0) { 124 | Thread *tp = fifo_remove(&sp->s_queue); 125 | tp->p_u.rdymsg = RDY_OK; 126 | chSchReadyI(tp); 127 | } 128 | } 129 | 130 | void chSemAddCounterI(Semaphore *sp, cnt_t n) { 131 | 132 | chDbgCheckClassI(); 133 | chDbgCheck((sp != NULL) && (n > 0), "chSemAddCounterI"); 134 | chDbgAssert(((sp->s_cnt >= 0) && isempty(&sp->s_queue)) || 135 | ((sp->s_cnt < 0) && notempty(&sp->s_queue)), 136 | "chSemAddCounterI(), #1", 137 | "inconsistent semaphore"); 138 | 139 | while (n > 0) { 140 | if (++sp->s_cnt <= 0) 141 | chSchReadyI(fifo_remove(&sp->s_queue))->p_u.rdymsg = RDY_OK; 142 | n--; 143 | } 144 | } 145 | 146 | #if CH_USE_SEMSW 147 | msg_t chSemSignalWait(Semaphore *sps, Semaphore *spw) { 148 | msg_t msg; 149 | 150 | chDbgCheck((sps != NULL) && (spw != NULL), "chSemSignalWait"); 151 | chDbgAssert(((sps->s_cnt >= 0) && isempty(&sps->s_queue)) || 152 | ((sps->s_cnt < 0) && notempty(&sps->s_queue)), 153 | "chSemSignalWait(), #1", 154 | "inconsistent semaphore"); 155 | chDbgAssert(((spw->s_cnt >= 0) && isempty(&spw->s_queue)) || 156 | ((spw->s_cnt < 0) && notempty(&spw->s_queue)), 157 | "chSemSignalWait(), #2", 158 | "inconsistent semaphore"); 159 | 160 | chSysLock(); 161 | if (++sps->s_cnt <= 0) 162 | chSchReadyI(fifo_remove(&sps->s_queue))->p_u.rdymsg = RDY_OK; 163 | if (--spw->s_cnt < 0) { 164 | Thread *ctp = currp; 165 | sem_insert(ctp, &spw->s_queue); 166 | ctp->p_u.wtobjp = spw; 167 | chSchGoSleepS(THD_STATE_WTSEM); 168 | msg = ctp->p_u.rdymsg; 169 | } 170 | else { 171 | chSchRescheduleS(); 172 | msg = RDY_OK; 173 | } 174 | chSysUnlock(); 175 | return msg; 176 | } 177 | #endif /* CH_USE_SEMSW */ 178 | 179 | #endif /* CH_USE_SEMAPHORES */ 180 | -------------------------------------------------------------------------------- /rss.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Klavarog 5 | http://klava.org/ 6 | Клавиатурный тренажер онлайн. 7 | ru 8 | Fri, 06 Sep 2013 21:55:13 +0400 9 | Fri, 06 Sep 2013 21:55:13 +0400 10 | ibnteo@gmail.com (Vladimir Romanovich) 11 | ibnteo@gmail.com (Vladimir Romanovich) 12 | 13 | 14 | http://vk.com/klavarog 15 | Новости проекта теперь во Вконтакте 16 | http://vk.com/klavarog]]> 17 | Fri, 06 Sep 2013 21:35:32 +0400 18 | #11 19 | 20 | 21 | 22 | http://klava.org/ 23 | Добавлен украинский язык 24 | 25 | Tue, 14 May 2013 17:03:01 +0400 26 | #10 27 | 28 | 29 | 30 | http://klava.org/ 31 | Добавлены языки программирования 32 | 33 | Wed, 20 Mar 2013 17:33:08 +0400 34 | #9 35 | 36 | 37 | 38 | http://klava.org/speed/ 39 | Настройки метронома 40 | 41 | Wed, 30 Jan 2013 21:17:05 +0400 42 | #8 43 | 44 | 45 | 46 | http://klava.org/ 47 | Режим звукового оповещения ошибки 48 | 49 | Sun, 22 Apr 2012 16:38:32 +0400 50 | #7 51 | 52 | 53 | 54 | http://klava.org/ 55 | Добавлена раскладка клавиатуры Workman 56 | 57 | Sat, 03 Sep 2011 05:07:14 +0400 58 | #6 59 | 60 | 61 | 62 | http://klava.org/about/ 63 | Помочь развитию Klavarog-а теперь можно с помощью BitCoin 64 | 65 | Tue, 01 Mar 2011 00:02:55 +0300 66 | #5 67 | 68 | 69 | 70 | https://chrome.google.com/webstore/detail/gnbmgefmkfnnhaohdgbidnkpbecchafp 71 | Klavarog Δ в Chrome Web Store 72 | 73 | Wed, 22 Dec 2010 09:34:56 +0300 74 | #4 75 | 76 | 77 | 78 | http://klava.org/ 79 | Раскладка Jcuken под Windows 80 | klava.org/layout/jcuken.zip]]> 81 | Tue, 19 Oct 2010 15:26:30 +0400 82 | #3 83 | 84 | 85 | 86 | http://klava.org/ 87 | Цветовое разделение пальцевых зон 88 |
По-умолчанию этот режим выключен.]]>
89 | Tue, 19 Oct 2010 01:48:32 +0400 90 | #2 91 |
92 | 93 | 94 | http://klava.org/#rus_dict_eng_top2 95 | Новый англо-русский словарь на 3200 слов 96 | Добавлен новый англо-русский словарь, 3200 слов, более качественный, чем предыдущий (2000). Старый пока оставлен. 97 | Sun, 10 Oct 2010 20:06:26 +0400 98 | #1 99 | 100 |
101 |
-------------------------------------------------------------------------------- /rss/greatwords_ru_rss.txt: -------------------------------------------------------------------------------- 1 | Когда кончаются доводы, начинают говорить пушки. Сила - последний аргумент тупицы. Отто фон Бисмарк. 2 | Мысли и женщины вместе не приходят. Михаил Михайлович Жванецкий. 3 | Я долго остаюсь под впечатлением, которое я произвел на женщину. Карл Краус. 4 | Да, естественно, собака - идеал верности. Но почему люди должны брать с собаки пример? Ведь она соблюдает верность человеку, а не другой собаке? Карл Краус. 5 | Я не люблю машины. Я ненавижу Интернет, ненавижу компьютеры. Они мешают нам жить, они отбирают наше время. Люди слишком много работают за компьютерами, они слишком много болтают, вместо того чтобы слушать и слышать друг друга. Рэй Брэдбери. 6 | Ангелы зовут это небесной отрадой, черти - адской мукой, люди - любовью. Генрих Гейне. 7 | Это любовь. Люди мечтают о том, чтобы любовь длилась как можно дольше. И супружеские пары держатся не только на желании. Даже секс лучше, когда любишь. Женщинами нельзя вот так кидаться. Ведь бывает, что привязанность возникает постепенно, ты думаешь, что тайна любимого существа тебе известна, но потом замечаешь, что она непостижима, и эта радость взаимопонимания и постоянные открытия рождают в душе ощущение, что чувство вечно. А ежевечерняя смена одного половозрелого тела на другое, да еще неопытное, - это всего лишь идиотская гонка за наслаждением, которое становится все более неуловимым и иллюзорным... Это путь к преступлению. Убийцей становятся не от супружеской жизни, а в погоне за удовольствием. Человеку необходимо строить что-то вдвоем, вместе с родственной душой... Фредерик Бегбедер, "Идеаль". 8 | Что может быть лучше для грязной души, чем хрустящие чистые простыни? Ричард Хелл, "Погнали". 9 | Женщина, какой ее создала природа и какой ее воспитывает в настоящее время мужчина, является его врагом. Она может быть только или рабой его, или деспотом, но никогда его подругой, спутницей. У нас только один выход - быть или молотом, или наковальней. Леопольд фон Захер-Мазох, "Венера в мехах". 10 | Не храните больше, чем сможете проглотить: ни любви, ни жары, ни ненависти. Чарльз Буковски, "Самая красивая женщина в городе". 11 | Любовь стоит ровно столько, сколько стоит человек, который ее испытывает. Все чисто у чистых людей. Ромен Роллан. 12 | Атрофия памяти не поможет найти свою дорогу в жизни. Фредерик Бегбедер, "Идеаль". 13 | Жить, сознавая, какой ты мудак - это само по себе неприятно, но жить, сознавая, какой ты мудак, и при этом еще понимать, что сие прискорбное обстоятельство, в сущности, никого не волнует - это совсем уже грустно. Ричард Хелл, "Погнали". 14 | Кто бы не вошел в дверь, это всегда не тот, кого хотелось бы видеть, но надежда всегда остается. Кен Кизи, "Над кукушкиным гнездом". 15 | Возьмите семью, подмешайте в нее веру в Бога, приправьте ароматом чувства Родины, добавьте десятичасовой рабочий день и получите то, что нужно, - ячейку общества. Чарльз Буковски, "Хлеб с ветчиной". 16 | Неумение страдать - это тоже страдание. Фредерик Бегбедер, "Идеаль". 17 | В воображении все так изысканно, так запредельно, а в жизни все будет буднично и неловко. Так зачем портить себе впечатление грубой прозой? Ричард Хелл, "Погнали". 18 | Искусство - это занятие для эгоистов. Иногда мне кажется, что музыкантам и художникам вообще нельзя иметь постоянные отношения, пока им не будет далеко за тридцать, потому что до тех пор их отношения всегда будут на втором месте после искусства. Легс Макнил, Джиллиан Маккейн, "Прошу, убей меня". 19 | Трудно говорить с человеком, которого давно не видел, но и молчать с ним нелегко. Особенно трудно, когда у тебя есть много чего ему сказать и ты не имеешь ни малейшего представления, как это сделать. Кен Кизи, "Порою нестерпимо хочется...". 20 | У меня никогда не было денег, и я был очень счастлив без них. Когда я умру, мои деньги мне не будут уже нужны. Мои кинофильмы будут жить - для людей, чтобы судить, каким я был человеком. Я только хочу остаться предметом интереса. Хит Леджер. 21 | По-настоящему сильным до тех пор не будешь, пока не научишься видеть во всем смешную сторону. Кен Кизи, "Над кукушкиным гнездом". 22 | В музыке есть прекрасная вещь: когда она попадает в тебя, ты не чувствуешь боли. Боб Марли. 23 | Память согревает человека изнутри. И в то же время рвет его на части. Харуки Мураками, "Кафка на пляже". 24 | Радуйся жизни, наслаждайся каждой минутой ее - ведь удовольствия заканчиваются раньше, чем жизнь. Филип Честерфилд. 25 | На часы и минуты время разбили ограниченные люди, не способные наслаждаться им целиком. Алексей Никонов. 26 | Когда что-нибудь прочно заседает в моей голове, или что-нибудь очень сильно меня волнует, я просто представляю, что сижу на Марсе и смотрю на Землю с сумасшедшей высоты. Вот тогда ты перестаешь бояться. Тогда ты не чувствуешь боли. Когда ты понимаешь, что ты никто, то и твои проблемы кажутся ничтожными. Хит Леджер. 27 | Если всегда делаешь только правильный выбор, то лишаешь себя возможности расти дальше. Хит Леджер. 28 | Представь фокусника, который, сидя перед лампой, складывает пальцы в сложные фигуры, так, что на стене появляются тени зверей, птиц, чертей и красавиц. А после этого он до смерти пугается этих чертей, влюбляется в красавиц и убегает от тигров, забывая, что это просто тени от его пальцев. Можно было бы назвать его безумцем, не будь сам этот фокусник попросту тенью от знаков "фокус" и "человек". Весь мир вокруг - такой театр теней; пальцы фокусника - это слова, а лампа - это ум. В реальности же нет не только предметов, на которые намекают тени, но даже и самих теней - есть только свет, которого в одних местах больше, а в других меньше. Так на что надеяться? И чего бояться? Однако, говоря об этом, я не беру лампу истины в руки, а просто гну перед ней пальцы слов, создавая новые и новые тени. Поэтому лучше вообще не открывать рта. Виктор Пелевин. 29 | Если попытаться вернуть то, чего уже нет, то оставшееся убежит через открытую дверь. Кормак Маккарти, "Старикам тут не место". 30 | Ты работаешь, потому что не умеешь жить. Милорад Павич, "Хазарский словарь". 31 | -------------------------------------------------------------------------------- /dict/eng_code_python.txt: -------------------------------------------------------------------------------- 1 | try: 2 | from errno import EINVAL 3 | except ImportError: 4 | EINVAL = 22 5 | 6 | __all__ = ["StringIO"] 7 | 8 | def _complain_ifclosed(closed): 9 | if closed: 10 | raise ValueError, "I/O operation on closed file" 11 | 12 | class StringIO: 13 | def __init__(self, buf = ''): 14 | if not isinstance(buf, basestring): 15 | buf = str(buf) 16 | self.buf = buf 17 | self.len = len(buf) 18 | self.buflist = [] 19 | self.pos = 0 20 | self.closed = False 21 | self.softspace = 0 22 | 23 | def __iter__(self): 24 | return self 25 | 26 | def next(self): 27 | _complain_ifclosed(self.closed) 28 | r = self.readline() 29 | if not r: 30 | raise StopIteration 31 | return r 32 | 33 | def close(self): 34 | if not self.closed: 35 | self.closed = True 36 | del self.buf, self.pos 37 | 38 | def isatty(self): 39 | _complain_ifclosed(self.closed) 40 | return False 41 | 42 | def seek(self, pos, mode = 0): 43 | _complain_ifclosed(self.closed) 44 | if self.buflist: 45 | self.buf += ''.join(self.buflist) 46 | self.buflist = [] 47 | if mode == 1: 48 | pos += self.pos 49 | elif mode == 2: 50 | pos += self.len 51 | self.pos = max(0, pos) 52 | 53 | def tell(self): 54 | _complain_ifclosed(self.closed) 55 | return self.pos 56 | 57 | def read(self, n = -1): 58 | _complain_ifclosed(self.closed) 59 | if self.buflist: 60 | self.buf += ''.join(self.buflist) 61 | self.buflist = [] 62 | if n < 0: 63 | newpos = self.len 64 | else: 65 | newpos = min(self.pos+n, self.len) 66 | r = self.buf[self.pos:newpos] 67 | self.pos = newpos 68 | return r 69 | 70 | def readline(self, length=None): 71 | _complain_ifclosed(self.closed) 72 | if self.buflist: 73 | self.buf += ''.join(self.buflist) 74 | self.buflist = [] 75 | i = self.buf.find('\n', self.pos) 76 | if i < 0: 77 | newpos = self.len 78 | else: 79 | newpos = i+1 80 | if length is not None and length > 0: 81 | if self.pos + length < newpos: 82 | newpos = self.pos + length 83 | r = self.buf[self.pos:newpos] 84 | self.pos = newpos 85 | return r 86 | 87 | def readlines(self, sizehint = 0): 88 | total = 0 89 | lines = [] 90 | line = self.readline() 91 | while line: 92 | lines.append(line) 93 | total += len(line) 94 | if 0 < sizehint <= total: 95 | break 96 | line = self.readline() 97 | return lines 98 | 99 | def truncate(self, size=None): 100 | _complain_ifclosed(self.closed) 101 | if size is None: 102 | size = self.pos 103 | elif size < 0: 104 | raise IOError(EINVAL, "Negative size not allowed") 105 | elif size < self.pos: 106 | self.pos = size 107 | self.buf = self.getvalue()[:size] 108 | self.len = size 109 | 110 | def write(self, s): 111 | _complain_ifclosed(self.closed) 112 | if not s: return 113 | if not isinstance(s, basestring): 114 | s = str(s) 115 | spos = self.pos 116 | slen = self.len 117 | if spos == slen: 118 | self.buflist.append(s) 119 | self.len = self.pos = spos + len(s) 120 | return 121 | if spos > slen: 122 | self.buflist.append('\0'*(spos - slen)) 123 | slen = spos 124 | newpos = spos + len(s) 125 | if spos < slen: 126 | if self.buflist: 127 | self.buf += ''.join(self.buflist) 128 | self.buflist = [self.buf[:spos], s, self.buf[newpos:]] 129 | self.buf = '' 130 | if newpos > slen: 131 | slen = newpos 132 | else: 133 | self.buflist.append(s) 134 | slen = newpos 135 | self.len = slen 136 | self.pos = newpos 137 | 138 | def writelines(self, iterable): 139 | write = self.write 140 | for line in iterable: 141 | write(line) 142 | 143 | def flush(self): 144 | _complain_ifclosed(self.closed) 145 | 146 | def getvalue(self): 147 | if self.buflist: 148 | self.buf += ''.join(self.buflist) 149 | self.buflist = [] 150 | return self.buf 151 | 152 | 153 | def test(): 154 | import sys 155 | if sys.argv[1:]: 156 | file = sys.argv[1] 157 | else: 158 | file = '/etc/passwd' 159 | lines = open(file, 'r').readlines() 160 | text = open(file, 'r').read() 161 | f = StringIO() 162 | for line in lines[:-2]: 163 | f.write(line) 164 | f.writelines(lines[-2:]) 165 | if f.getvalue() != text: 166 | raise RuntimeError, 'write failed' 167 | length = f.tell() 168 | print 'File length =', length 169 | f.seek(len(lines[0])) 170 | f.write(lines[1]) 171 | f.seek(0) 172 | print 'First line =', repr(f.readline()) 173 | print 'Position =', f.tell() 174 | line = f.readline() 175 | print 'Second line =', repr(line) 176 | f.seek(-len(line), 1) 177 | line2 = f.read(len(line)) 178 | if line != line2: 179 | raise RuntimeError, 'bad result after seek back' 180 | f.seek(len(line2), 1) 181 | list = f.readlines() 182 | line = list[-1] 183 | f.seek(f.tell() - len(line)) 184 | line2 = f.read() 185 | if line != line2: 186 | raise RuntimeError, 'bad result after seek back from EOF' 187 | print 'Read', len(list), 'more lines' 188 | print 'File length =', f.tell() 189 | if f.tell() != length: 190 | raise RuntimeError, 'bad length' 191 | f.truncate(length/2) 192 | f.seek(0, 2) 193 | print 'Truncated length =', f.tell() 194 | if f.tell() != length/2: 195 | raise RuntimeError, 'truncate did not adjust length' 196 | f.close() 197 | 198 | if __name__ == '__main__': 199 | test() 200 | -------------------------------------------------------------------------------- /dict/eng_code_cpp.txt: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "rules.h" 5 | #include "algor.h" 6 | 7 | using namespace std; 8 | 9 | namespace rmmseg 10 | { 11 | Token Algorithm::next_token() 12 | { 13 | do 14 | { 15 | if (m_pos >= m_text_length) 16 | return Token(NULL, 0); 17 | 18 | Token tk(NULL, 0); 19 | int len = next_char(); 20 | if (len == 1) 21 | tk = get_basic_latin_word(); 22 | else 23 | tk = get_cjk_word(len); 24 | if (tk.length > 0) 25 | return tk; 26 | } 27 | while (true); 28 | } 29 | 30 | Token Algorithm::get_basic_latin_word() 31 | { 32 | int len = 1; 33 | int start, end; 34 | 35 | while (m_pos < m_text_length) 36 | { 37 | if (len > 1) 38 | break; 39 | if (isalnum(m_text[m_pos])) 40 | break; 41 | m_pos++; 42 | len = next_char(); 43 | } 44 | 45 | start = m_pos; 46 | while (m_pos < m_text_length) 47 | { 48 | if (len > 1) 49 | break; 50 | if (!isalnum(m_text[m_pos])) 51 | break; 52 | m_pos++; 53 | len = next_char(); 54 | } 55 | end = m_pos; 56 | 57 | while (m_pos < m_text_length) 58 | { 59 | if (len > 1) 60 | break; 61 | if (isalnum(m_text[m_pos])) 62 | break; 63 | m_pos++; 64 | len = next_char(); 65 | } 66 | 67 | return Token(m_text+start, end-start); 68 | } 69 | 70 | Token Algorithm::get_cjk_word(int len) 71 | { 72 | vector chunks = create_chunks(); 73 | 74 | if (chunks.size() > 1) 75 | mm_filter(chunks); 76 | if (chunks.size() > 1) 77 | lawl_filter(chunks); 78 | if (chunks.size() > 1) 79 | svwl_filter(chunks); 80 | if (chunks.size() > 1) 81 | lsdmfocw_filter(chunks); 82 | 83 | if (chunks.size() < 1) 84 | return Token(NULL, 0); 85 | 86 | Token token(m_text+m_pos, chunks[0].words[0]->nbytes); 87 | m_pos += chunks[0].words[0]->nbytes; 88 | return token; 89 | } 90 | 91 | vector Algorithm::create_chunks() 92 | { 93 | vector chunks; 94 | Chunk chunk; 95 | Word *w1, *w2, *w3; 96 | 97 | int orig_pos = m_pos; 98 | typedef vector vec_t; 99 | typedef vec_t::iterator it_t; 100 | 101 | vec_t words1 = find_match_words(); 102 | for (it_t i1 = words1.begin(); 103 | i1 != words1.end(); 104 | ++i1) 105 | { 106 | w1 = *i1; 107 | chunk.words[0] = w1; 108 | m_pos += w1->nbytes; 109 | if (m_pos < m_text_length) 110 | { 111 | vec_t words2 = find_match_words(); 112 | for (it_t i2 = words2.begin(); 113 | i2 != words2.end(); 114 | ++i2) 115 | { 116 | w2 = *i2; 117 | chunk.words[1] = w2; 118 | m_pos += w2->nbytes; 119 | if (m_pos < m_text_length) 120 | { 121 | vec_t words3 = find_match_words(); 122 | for (it_t i3 = words3.begin(); 123 | i3 != words3.end(); 124 | ++i3) 125 | { 126 | w3 = *i3; 127 | if (w3->length == -1) // tmp word 128 | { 129 | chunk.n = 2; 130 | } 131 | else 132 | { 133 | chunk.n = 3; 134 | chunk.words[2] = w3; 135 | } 136 | chunks.push_back(chunk); 137 | } 138 | } 139 | else if (m_pos == m_text_length) 140 | { 141 | chunk.n = 2; 142 | chunks.push_back(chunk); 143 | } 144 | m_pos -= w2->nbytes; 145 | } 146 | } 147 | else if (m_pos == m_text_length) 148 | { 149 | chunk.n = 1; 150 | chunks.push_back(chunk); 151 | } 152 | m_pos -= w1->nbytes; 153 | } 154 | 155 | m_pos = orig_pos; 156 | return chunks; 157 | } 158 | 159 | int Algorithm::next_char() 160 | { 161 | // ONLY for UTF-8 162 | unsigned char ch = m_text[m_pos]; 163 | if (ch >= 0xC0 && ch <= 0xDF) 164 | { 165 | return min(2, m_text_length-m_pos); 166 | } 167 | if (ch >= 0xE0 && ch <= 0xEF) 168 | { 169 | return min(3, m_text_length-m_pos); 170 | } 171 | return 1; 172 | } 173 | 174 | vector Algorithm::find_match_words() 175 | { 176 | for (int i = 0; i < match_cache_size; ++i) 177 | if (m_match_cache[i].first == m_pos) 178 | return m_match_cache[i].second; 179 | 180 | vector words; 181 | Word *word; 182 | int orig_pos = m_pos; 183 | int n = 0, len; 184 | 185 | while (m_pos < m_text_length) 186 | { 187 | if (n >= max_word_length()) 188 | break; 189 | len = next_char(); 190 | if (len <= 1) 191 | break; 192 | 193 | m_pos += len; 194 | n++; 195 | 196 | word = dict::get(m_text+orig_pos, m_pos-orig_pos); 197 | if (word) 198 | words.push_back(word); 199 | } 200 | 201 | m_pos = orig_pos; 202 | 203 | if (words.empty()) 204 | { 205 | word = get_tmp_word(); 206 | word->nbytes = next_char(); 207 | word->length = -1; 208 | strncpy(word->text, m_text+m_pos, word->nbytes); 209 | word->text[word->nbytes] = '\0'; 210 | words.push_back(word); 211 | } 212 | 213 | m_match_cache[m_match_cache_i] = make_pair(m_pos, words); 214 | m_match_cache_i++; 215 | if (m_match_cache_i >= match_cache_size) 216 | m_match_cache_i = 0; 217 | 218 | return words; 219 | } 220 | } 221 | -------------------------------------------------------------------------------- /about/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Klavarog Δ | О сайте 6 | 7 | 8 | 77 | 78 | 79 |
80 | 81 | 82 | 85 | 86 |
87 | 88 |
89 |

Как научиться печатать

90 |

Клавиатурный тренажер «Клаварог» предназначен для обучения и закрепления навыков слепой десятипальцевой печати.

91 |

Разместите руки на клавиатуре так, чтобы пальцы находились на следующих позициях:
левая рука - [A][S][D][F][G][H][J][K][L][;] - правая рука
большие пальцы над клавишей «пробел». Чтобы можно было устанавливать руки на стартовую позицию не глядя, на клавишах [F] и [J] есть небольшие насечки.

92 |

При печати смотрите только на экранную клавиатуру, или распечатайте изображение клавиатуры и положите его перед монитором. Ни в коем случае не подсматривайте на клавиатуру на которой печатаете, для исключения этого можно даже положить на руки лист бумаги, или поменять некоторые клавиши местами.

93 |

Старайтесь не гнаться за скоростью, лучше если будет как можно меньше ошибок (менее 1%). Уже при скорости 200 сим/мин, сможете навыки слепой печати применять в работе.

94 |
95 |

Описание тренажера

96 |

От типа словаря зависит принцип формирования текста, из словаря для начального обучения выбираются слова случайным образом в зависимости от вашей скорости печати, сделанных ошибок; в словаре для развития скорости предлагается набрать одно слово три раза без ошибок, если же опечатаетесь, то придётся набирать заново; из словаря для тренировки выбираются случайные предложения, в случае ошибок будет подсвечено 7 неправильно введенных символов впереди по тексту; из словарей языков программирования выбирается случайная строка при старте, и затем выбираются следующие строки по порядку.

97 |

В режиме изучения иностранных слов будет предложено выражение на другом языке, и 5 вариантов его перевода, среди которых лишь 1 правильный. Необходимо напечатать его, после чего будет предложено следующее выражение, если правильно, или будет предложено набрать 3 строки с правильными вариантами (вариантов перевода может быть несколько). Слова, на которых произошла ошибка, будут встречаться значительно чаще других, что позволит закрепить их в памяти окончательно.

98 |

При печати можно остановиться в любой момент, но желательно набрать строку до конца, иначе через 15 секунд простоя курсор установится в начало строки.

99 |

Подсветка нажимаемых клавиш может работать в двух режимах, первый показывает подсказку каким пальцем какой руки следует нажимать клавишу, второй просто подсвечивает клавиши после паузы в полсекунды, что позволяет выдерживать ритм (на не очень высоких скоростях 150-300 сим/мин).

100 |

Таймер используется для организации отдыха, его отключить можно только в режиме «Дзен», эффективность обучения напрямую зависит от отсутствия усталости.

101 |

Функция автокорректировки больше необходим новичкам, и необходима для режима "Цифровой блок" (при выборе этого режима включается автоматически). При включённой автокорректировке блокируется клавиша Backspace, хотя при необходимости её можно использовать с зажатой клавишей Shift.

102 |

В статистике печати указываются параметры скорости и количества ошибок для последней введенной строки и для всей сессии тренировки. Скорость измеряется в символах в минуту, и в словах в минуту, причем скорость в словах измеряется двумя способами, первый измеряет количество символов в минуту деленное на 6 (5 букв + 1 пробел), второй способ использует реальное количество слов.

103 |

Режим «Дзен» включается (или выключается) при нажатии на логотип. В этом режиме ничто не мешает релаксировать во время печати, ошибки подсвечиваются менее ярко.

104 |
105 |

Архив версий

106 |

Принято решение впредь сохранять прежние версии, будет видно развитие тренажера, и остается возможность откатиться в случае неприемлемых для Вас изменений в новой версии.

107 |

Предыдущие версии: β (бета), γ (гамма), и текущая: Δ (дельта). В браузере Google Chrome и Chromium можно установить offline версию: «Klavarog Δ» в Google Web Store.

108 |
109 |

Благодарности

110 |

Выражаю огромную благодарность за помощь проекту:

111 |
    112 |
  • хабрапользователю olegkrasnov за создание нового дизайна сайта;
  • 113 |
  • яндекспользователю Alexander Deplov за идею функции изучения иностранных слов;
  • 114 |
  • всем тем, кто оставил сообщение на сайте klava.reformal.ru
  • 115 |
116 |
117 |

Помощь проекту

118 |

Можете помочь в развитии проекта материально, и/или интеллектуально - идеями или сотрудничеством.

119 | 120 |

О своих идеях можно рассказать на klava.reformal.ru. Так же можно проголосовать за чужие идеи, чем больше голосов будет набрано, тем больше шансов, что это будет реализовано в будущих версиях.

121 |

Новости публикуются в RSS канале тренажёра.

122 |

Вопросы и предложения о сотрудничестве присылайте на ibnteo@gmail.com

123 | 124 | 125 | 126 | 127 |

128 |
129 |
130 |
131 |
132 |
133 | 134 |

Перейти к тренажёру

135 |
136 | 137 |
138 |
139 | 140 | 141 | 144 |
145 | Klavarog 146 |
147 |
148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /beta/klava.js: -------------------------------------------------------------------------------- 1 | function setInputWidth() { 2 | var width = $("#text1").width(); 3 | $("#input_text").width(width < 700 ? 700 : width).focus(); 4 | } 5 | 6 | function convertToHtml(text) { 7 | return text.replace(/&/g, "&").replace(/ 0) { 27 | if (str.length > 80) { 28 | var line1_pos = str.substring(0, 81).lastIndexOf(" "); 29 | this.lines[index] = str.substring(0, line1_pos) + String.fromCharCode(160); 30 | str = str.substring(line1_pos + 1); 31 | } else { 32 | this.lines[index] = str + "¶"; 33 | str = ""; 34 | } 35 | //$("#text" + (index + 1)).html(convertToHtml(this.lines[i])); 36 | index ++; 37 | } 38 | if (this.lines.length < 3 && this.text.length > 1) { 39 | this.setLines(index); 40 | } 41 | } 42 | 43 | this.showLines = function(inputLen) { 44 | var error_symbols = []; 45 | for (var i in this.error_symbols) { 46 | error_symbols[i] = this.error_symbols[i]; 47 | } 48 | for (var index = 0; index < 3; index ++) { 49 | var end = this.lines[index].substring(index == 0 ? inputLen : 0); 50 | var end_line = ""; 51 | for (var i = 0; i < end.length; i ++) { 52 | var symbol = end.substring(i, i + 1); 53 | if (error_symbols[symbol.toLowerCase()] > 0) { 54 | end_line = end_line + '' + convertToHtml(symbol) + ''; 55 | error_symbols[symbol.toLowerCase()] --; 56 | } else { 57 | end_line = end_line + convertToHtml(symbol); 58 | } 59 | } 60 | $("#text" + (index + 1)).html((inputLen > 0 && index == 0 ? ''+convertToHtml(this.lines[index].substring(0, inputLen))+'' : "")+end_line); 61 | } 62 | } 63 | 64 | this.selLanguage = function() { 65 | } 66 | 67 | this.showStat = function(speed, errors) { 68 | var abs_speed = (this.sum_time == 0 ? 0 : (this.sum_length / this.sum_time) * 60); 69 | var out_abs_error = (this.sum_length == 0 ? 0 : (Math.round((this.sum_error / this.sum_length) * 100 * 100) / 100)); 70 | var out_error = (Math.round(errors * 100) / 100); 71 | $("#stat").html( 72 | "["+Math.round(speed)+"/"+Math.round(abs_speed)+"]/min"+ 73 | "    "+ 74 | "["+out_error.toFixed(2)+"/"+out_abs_error.toFixed(2)+"]%" 75 | ); 76 | } 77 | 78 | this.linesUp = function() { 79 | for (var i = 0; i < this.lines.length - 1; i ++) { 80 | this.lines[i] = this.lines[i + 1]; 81 | $("#text" + (i + 1)).html(convertToHtml(this.lines[i])); 82 | } 83 | this.lines.pop(); 84 | } 85 | 86 | this.init = function() { 87 | this.sum_error = 0; 88 | this.sum_time = 0; 89 | this.sum_error = 0; 90 | this.sum_length = 0; 91 | this.showStat(0, 0); 92 | this.error_symbols = []; 93 | this.softInit(); 94 | } 95 | 96 | this.softInit = function() { 97 | if (this.timer) { 98 | window.clearTimeout(this.timer); 99 | } 100 | this.time_start = null; 101 | this.count_error = 0; 102 | $("#input_text").val("").removeClass("error"); 103 | this.lines = [""]; 104 | this.setLines(0); 105 | this.position = 0; 106 | this.showLines(0); 107 | setInputWidth(); 108 | } 109 | } 110 | 111 | $(function() { 112 | var klava = new Klava(); 113 | 114 | $("#input_text").keyup(function(event) { 115 | if (klava.reset_timer) { 116 | window.clearTimeout(klava.reset_timer); 117 | } 118 | klava.reset_timer = window.setTimeout(function() { 119 | $("#input_text").val("").keyup(); 120 | }, 15000); 121 | 122 | if (klava.time_start == null) { 123 | klava.time_start = new Date(); 124 | } 125 | 126 | var input = $(this).val(); 127 | if (event.which == 13) { 128 | input = input + "¶"; 129 | $(this).val(input); 130 | } 131 | if (input == "") { 132 | klava.time_start = null; 133 | klava.count_error = 0; 134 | } 135 | var top_line = klava.lines[0].replace(String.fromCharCode(160), " "); 136 | var symbol = top_line.substring(klava.position, klava.position + 1).toLowerCase(); 137 | if (top_line.substring(0, input.length) != input) { 138 | if ( ! $(this).hasClass("error")) { 139 | klava.count_error ++; 140 | if (symbol != " " && symbol != "¶") { 141 | klava.error_symbols[symbol] = (klava.error_symbols[symbol] ? klava.error_symbols[symbol] + 7 : 7); 142 | } 143 | window.status = event.which; 144 | $(this).addClass("error"); 145 | klava.showLines(klava.position); 146 | } 147 | } else if (top_line != "") { 148 | if (klava.error_symbols[symbol] > 0 && klava.position < input.length) { 149 | klava.error_symbols[symbol] = klava.error_symbols[symbol] - 1; 150 | } 151 | klava.position = input.length; 152 | $(this).removeClass("error"); 153 | if (input.length >= top_line.length) { 154 | var time_stop = new Date(); 155 | var time = (time_stop - klava.time_start) / 1000; 156 | klava.sum_time += time; 157 | klava.sum_length += top_line.length; 158 | var speed = (input.length / time) * 60; 159 | var errors = (klava.count_error / input.length) * 100; 160 | klava.sum_error += klava.count_error; 161 | klava.count_error = 0; 162 | klava.position = 0; 163 | klava.time_start = null; 164 | klava.showStat(speed, errors); 165 | klava.linesUp(); 166 | if (klava.lines.length < 3) { 167 | klava.setLines(klava.lines.length); 168 | } 169 | $(this).val(""); 170 | setInputWidth(); 171 | $(this).keyup(); 172 | } else { 173 | klava.showLines(input.length); 174 | } 175 | } 176 | }).keyup(); 177 | 178 | $("#sel_reload").click(function() { 179 | klava.softInit(); 180 | }); 181 | 182 | $("#sel_keyboard").change(function() { 183 | var keyboard = $(this).val(); 184 | $("div.keyboard").hide(); 185 | if (keyboard == "qwerty") { 186 | $("#kb_qwerty").show(); 187 | } 188 | if (keyboard == "dvorak") { 189 | $("#kb_dvorak").show(); 190 | } 191 | if (keyboard == "jcuken") { 192 | $("#kb_jcuken").show(); 193 | } 194 | $("#input_text").focus(); 195 | }).change(); 196 | 197 | $("#sel_language").change(function() { 198 | $.ajax({ 199 | url: $(this).val() + ".txt", 200 | success: function(data) { 201 | klava.text = data.replace(/ {2,}/g, " ").replace(/^ /g, "").replace(/\r/g, "").replace(/\n\n/g,"\n").split("\n"); 202 | klava.init(); 203 | }, 204 | error: function() { 205 | alert("Error"); 206 | } 207 | }); 208 | var lang = $(this).val().substring(0, 2); 209 | if (lang == "en") { 210 | $("#sel_keyboard").val("qwerty").change(); 211 | } 212 | if (lang == "ru") { 213 | $("#sel_keyboard").val("jcuken").change(); 214 | } 215 | }).change(); 216 | }); 217 | -------------------------------------------------------------------------------- /beta/en_adv.txt: -------------------------------------------------------------------------------- 1 | Presently she began again. "I wonder if I shall fall fight through the earth! How funny it'll seem to come out among the people that walk with their heads downwards! The antipathies, I think-" (she was rather glad there was no one listening, this time, as it didn't sound at all the right word) "-but I shall have to ask them what the name of the country is, you know. Please, Ma'am, is this New Zealand? Or Australia?" (and she tried to curtsey as she spoke- fancy, curtseying as you're falling through the air! Do you think you could manage it?) "And what an ignorant little girl she'll think me for asking! No, it'll never do to ask: perhaps I shall see it written up somewhere." 2 | Down, down, down. There was nothing else to do, so Alice soon began talking again. "Dinah'll miss me very much to-night, I should think!" (Dinah was the cat.) "I hope they'll remember her saucer of milk at tea-time. Dinah, my dear! I wish you were down here with me! There are no mice in the air, I'm afraid, but you might catch a bat, and that's very like a mouse, you know. But do cats eat bats, I wonder?" And here Alice began to get rather sleepy, and went on saying to herself, in a dreamy son of way, "Do cats eat bats? Do cats eat bats?" and sometimes "Do bats eat cats?" for, you see, as she couldn't answer either question, it didn't much matter which way she put it. She felt that she was dozing off, and had just begun to dream that she was walking hand in hand with Dinah, and was saying to her, very earnestly, "Now, Dinah, tell me the truth: did you ever eat a bat?" when suddenly, thump! thump! down she came upon a heap of sticks and dry leaves, and the fall was over. 3 | Alice was not a bit hurt, and she jumped up on to her feet in a moment: she looked up, but it was all dark overhead: before her was another long passage, and the White Rabbit was still in sight, hurrying down it. There was not a moment to be lost: away went Alice like the wind, and was just in time to hear it say, as it turned a comer, "Oh my ears and whiskers, how late it's getting!" She was close behind it when she turned the comer, but the Rabbit was no longer to be seen: she found herself in a long, low hall, which was lit up by a row of lamps hanging from the roof. 4 | There were doors all round the hall, but they were all locked; and when Alice had been all the way down one side and up the other, trying every door, she walked sadly down the middle, wondering how she was ever to get out again. 5 | Suddenly she came upon a little three-legged table, all made of solid glass: there was nothing on it but a tiny golden key, and Alice's first idea was that this might belong to one of the doors of the hall; but, alas! either the locks were too large, or the key was too small, but at any rate it would not open any of them. However, on the second time round, she came upon a low curtain she had not noticed before, and behind it was a little door about fifteen inches high: she tried the little golden key in the lock, and to her great delight it fitted! 6 | 7 | One thing was certain, that the white kitten had had nothing to do with it: - it was the black kitten's fault entirely. For the white kitten had been having its face washed by the old cat for the last quarter of an hour (and bearing it pretty well, considering); so you see that it couldn't have had any hand in the mischief. 8 | The way Dinah washed her children's faces was this: first she held the poor thing down by its ear with one paw, and then with the other paw she rubbed its face all over, the wrong way, beginning at the nose: and just now, as I said, she was hard at work on the white kitten, which was lying quite still and trying to purr - no doubt feeling that it was all meant for its good. 9 | But the black kitten had been finished with earlier in the afternoon, and so, while Alice was sitting curled up in a corner of the great arm-chair, half talking to herself and half asleep, the kitten had been having a grand game of romps with the ball of worsted Alice had been trying to wind up, and had been rolling it up and down till it had all come undone again; and there it was, spread over the hearth-rug, all knots and tangles, with the kitten running after its own tail in the middle. 10 | 11 | This lesson inaugurates the second half of the seventy-fourth year in the presentation of the Sabian philosophy and begins a series of twenty-six studies in a book that in barely more than a generation had become immortal and is a consideration of the first chapter of Alice in Wonderland. The lessons will deal in order with the twelve chapters of Wonderland, the twelve chapters of Looking-Glass and two supernumerary studies. The first great principle of wisdom in the Sabian philosophy as revealed through the adventures of Alice is that everything in life is a sacrament. In the field of philosophy the full power of idea in this concept of sacrament is often unappreciated because of the association with ecclesiastical establishments, but while a sacrament as the outward and visible sign of grace inwardly received naturally would have a great deal to do with church ritual nevertheless ritual is something larger than the observance of religious rites and a sacrament therefore involves much more than the elements in the Eucharist. The principle of life itself as a sacramental establishment was brought out in the Ibn Gabirol lessons. There the student sees that all activity of being is made possible by the interlocking ritual of the cosmos itself. The whole substance of the Alice narratives is renewed demonstration. In the lessons on Grimm's Fairy Tales the stories reveal the structure of being and they unlock practically every mystery of the operation of the soul, and this was discovered to be the direct result of the fact that the stories were handed down through the human heart or were preserved because they were loved and it is impossible to love except as ritual. Nothing remains in human memory without some tie to experience, and the race cannot hold or hand down ideas that are not enough in tune with the eternal structure to become part of racial experience. So it is that some stories die and others live and the same principle operates in every department of life. In the lessons on the 1001 Nights, because of the extreme tenacity with which these stories remained in the Near East consciousness, it became possible to extract from them the complete and perfect psychology that as the basis of the Sabian applied system has demonstrated itself with almost infallible accuracy. The adventures of Alice would recommend themselves by the mere virtue of their survival alone but there are added considerations that give them unique value in the field of philosophy. 12 | Of principal importance is the fact that they were written by a mathematician. Mathematics is a divine science not because of its abstractions but because of what its study does to the consciousness. An untutored individual turning to nonsense produces non-sense. Even Lewis Carroll himself when building on a conscious working at nonsense produced the relatively infantile Hunting of the Snark. But the so-called nonsense allowed to emanate spontaneously from a brain that has grooved itself in accordance with cosmic ritual almost infallibly will bring forth something of cosmic significance. This alone carried to its logical conclusion is the explanation of all inspiration whether through alcohol or more constructive agency. It is not coincidence that the wholly explicable working of the cosmic ritual creates such wonderland as this present study. There are occult factors such as the circumstance that Lewis Carroll wrote the book and not some other mathematician, but the explanation rather than being different is simply more detailed. Here for instance is the item of occult catalysis or coincidence of inspiration in the fact that the eldest Liddell child is named Alice, a Greek word meaning truth, because the bearing of the name by the youngster indicates to the occult student the outer indication of her possession of these catalytic qualities. 13 | The first chapter reveals the sacramental factor pictured by the bottle of liquid or the element of wine with description of its flavor and the little cake or the element of bread. The drink-me and eat-me of the labels represent the idea of compulsion in cosmic process or the first law of abstract being as persistency in being. The drinking, or wine as blood or consciousness or spirit, is the compulsion of spirit's descent into matter dramatized in growing smaller and smaller whereas the eating or metabolism through which matter is forced to be ensouled progressively by higher and higher forms of life is the compulsion of matter's ascent into full participation in spirit as dramatized by growing higher and higher. These details are too perfect for a cry of coincidence and continue to bear weight forever. Such is the wolf! wolf! of the materialists. 14 | The achievement of imagination in the book, or the first great scientific anticipation, is in the proper employment of symbolism. The function of symbols is to give form to spiritual concept. Whatever serves as symbol is not itself the symbol but rather the symbol is idea to which the form gives substance in addition to giving substance to its own being. Carroll here unwittingly anticipated the dictum recently popularized by modern science as anything that man imagines he may achieve. This is quoted from the Latin by Montaigne as a saying of the wise and so is far from modern. Everything goes back to consciousness as it is taught in the Sabian work, or interest as conventional psychology and science state it, and the positive basis of all interest is living activity. Thus Alice didn't like the book there by the river's bank on the July afternoon because it didn't have conversations or illustrations. Modern editorial policy well recognizes this in its demand for dialogue and illustrations and it is curious here to note that the coincident genius of John Tenniel has survived the growth of a whole new technique of illustrative art. Actually, the book is incomplete without his incomparable woodcuts. The negative basis of interest is its need to stamp itself in life or to express itself. Thus Alice in falling had to talk. Similarly every person or group of people has to talk, and the wisdom and lack of wisdom in giving or withholding free speech is here seen. It is necessary to link this expression and interest to the known, and it is illuminating to see Alice constantly using Dinah as the subject of conversation. 15 | -------------------------------------------------------------------------------- /dict/eng_code_php.txt: -------------------------------------------------------------------------------- 1 | _connection) return; 5 | if (Database_MySQL::$_set_names === NULL) { Database_MySQL::$_set_names = ! function_exists('mysql_set_charset');} 6 | extract($this->_config['connection'] + array('database' => 'klavarog', 'username' => 'bill', 'password' => 'gates')); 7 | unset($this->_config['connection']['username'], $this->_config['connection']['password']); 8 | try { if (empty($persistent)) { $this->_connection = mysql_connect($hostname, $username, $password, TRUE); } else { $this->_connection = mysql_pconnect($hostname, $username, $password);}} catch (ErrorException $e) { $this->_connection = NULL; throw $e; } 9 | $this->_connection_id = sha1($hostname.'_'.$username.'_'.$password); $this->_select_db($database); 10 | if ( ! empty($this->_config['charset'])) {$this->set_charset($this->_config['charset']);}} 11 | protected function _select_db($database) { 12 | if ( ! mysql_select_db($database, $this->_connection)) { throw new Database_Exception(':error', array(':error' => mysql_error($this->_connection)), mysql_errno($this->_connection)); } 13 | Database_MySQL::$_current_databases[$this->_connection_id] = $database; } 14 | public function disconnect() { 15 | try { $status = TRUE; if (is_resource($this->_connection)) { $status = mysql_close($this->_connection); }} catch (Exception $e) { $status = is_resource($this->_connection); } 16 | return $status; } 17 | public function set_charset($charset) { 18 | $this->_connection or $this->connect(); 19 | if (Database_MySQL::$_set_names === TRUE) { $status = (bool) mysql_query('SET NAMES '.$this->quote($charset), $this->_connection); } else { $status = mysql_set_charset($charset, $this->_connection); } 20 | if ($status === FALSE) { throw new Database_Exception(':error', array(':error' => mysql_error($this->_connection)), mysql_errno($this->_connection)); }} 21 | public function query($type, $sql, $as_object) { 22 | $this->_connection or $this->connect(); 23 | if ( ! empty($this->_config['profiling'])) { $benchmark = Profiler::start("Database ({$this->_instance})", $sql); } 24 | if ( ! empty($this->_config['connection']['persistent']) AND $this->_config['connection']['database'] !== Database_MySQL::$_current_databases[$this->_connection_id]) { $this->_select_db($this->_config['connection']['database']); } 25 | if (($result = mysql_query($sql, $this->_connection)) === FALSE) { 26 | if (isset($benchmark)) { Profiler::delete($benchmark); } 27 | throw new Database_Exception(':error [ :query ]', array(':error' => mysql_error($this->_connection), ':query' => $sql), mysql_errno($this->_connection)); } 28 | if (isset($benchmark)) { Profiler::stop($benchmark); } $this->last_query = $sql; 29 | if ($type === Database::SELECT) { return new Database_MySQL_Result($result, $sql, $as_object); } elseif ($type === Database::INSERT) { return array(mysql_insert_id($this->_connection), mysql_affected_rows($this->_connection), ); } else { return mysql_affected_rows($this->_connection); }} 30 | public function datatype($type) { 31 | static $types = array('blob' => array('type' => 'string', 'binary' => TRUE, 'character_maximum_length' => '65535'), 'bool' => array('type' => 'bool'), 'year' => array('type' => 'string')); 32 | $type = str_replace(' zerofill', '', $type); if (isset($types[$type])) return $types[$type]; 33 | return parent::datatype($type); } 34 | public function list_tables($like = NULL) { if (is_string($like)) { $result = $this->query(Database::SELECT, 'SHOW TABLES LIKE '.$this->quote($like), FALSE); } else { $result = $this->query(Database::SELECT, 'SHOW TABLES', FALSE); } 35 | $tables = array(); foreach ($result as $row) { $tables[] = reset($row); } return $tables; } 36 | public function list_columns($table, $like = NULL) { 37 | $table = $this->quote_table($table); if (is_string($like)) { $result = $this->query(Database::SELECT, 'SHOW FULL COLUMNS FROM '.$table.' LIKE '.$this->quote($like), FALSE); } else { $result = $this->query(Database::SELECT, 'SHOW FULL COLUMNS FROM '.$table, FALSE); } $count = 0; $columns = array(); 38 | foreach ($result as $row) { 39 | list($type, $length) = $this->_parse_type($row['Type']); 40 | $column = $this->datatype($type); $column['column_name'] = $row['Field']; $column['column_default'] = $row['Default']; 41 | switch ($column['type']) { 42 | case 'float': if (isset($length)) { list($column['numeric_precision'], $column['numeric_scale']) = explode(',', $length); } break; 43 | case 'varchar': $column['character_maximum_length'] = $length; case 'text': break; } 44 | $column['comment'] = $row['Comment']; $column['extra'] = $row['Extra']; $columns[$row['Field']] = $column; } return $columns; } 45 | public function escape($value) { 46 | $this->_connection or $this->connect(); 47 | if (($value = mysql_real_escape_string((string) $value, $this->_connection)) === FALSE) { throw new Database_Exception(':error', array(':error' => mysql_errno($this->_connection)), mysql_error($this->_connection)); } 48 | return "'$value'"; } 49 | 50 | 51 | <?=$header?> 52 |

53 | 54 | $v) { $v = str_replace('{'.$k.'}', '', $v); ?> 55 |
56 | $v) { $v = htmlspecialchars($v); $v = str_replace("\t", ' ', $v); fwrite($f, "$k>$v\t"); } 59 | fclose($f); } 60 | $message_template = fopen('message.inc.php', 'r'); 61 | $message_template = fread($message_template, filesize('message.inc.php')); 62 | $f = fopen('db.index', 'r'); $index = array_reverse(split("\n",fread($f, filesize('db.index')+1))); fclose($f); 63 | $orig_index = $index; 64 | $i = isset($_GET['skip']) ? (int)$_GET['skip'] : '0'; $k = $i+$per_page; 65 | while($i > 0) { array_shift($index); $i--; } 66 | while($k < count($orig_index)) { array_pop($index); $k++; } 67 | $i = 0; while($i'.($i/$per_page+1). ' '; $i+=$per_page; } 68 | foreach ($index as $message) { $message_info = split("\t", $message); foreach ($message_array as $k=>$v) { $message_array[$k] = ''; } 69 | foreach ($message_info as $field) { $option = split('>', $field); 70 | foreach ($fields as $config_field=>$config_value) { if ($config_field == $option[0]) { $message_array[$config_field] = str_replace('{'.$config_field.'}', $option[1], $config_value); }}} 71 | $template = $message_template; 72 | foreach ($message_array as $field=>$value) { $template = str_replace('{'.$field.'}', $value, $template); } 73 | foreach ($fields as $config_field=>$config_value) { $template = str_replace('{'.$config_field.'}', '', $template); } 74 | print $template;} require 'footer.inc.php'; ?> 75 | 76 | class cookie_Core { public static function set($name, $value = NULL, $expire = NULL, $path = NULL, $domain = NULL, $secure = NULL, $httponly = NULL) { if (headers_sent()) return FALSE; is_array($name) and extract($name, EXTR_OVERWRITE); $config = Kohana::config('cookie'); foreach (array('value', 'expire', 'domain', 'path', 'secure', 'httponly') as $item) { if ($$item === NULL AND isset($config[$item])) { $$item = $config[$item]; } } $expire = ($expire == 0) ? 0 : time() + (int) $expire; return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); } public static function get($name, $default = NULL, $xss_clean = FALSE) { return Input::instance()->cookie($name, $default, $xss_clean); } public static function delete($name, $path = NULL, $domain = NULL) { if ( ! isset($_COOKIE[$name])) return FALSE; unset($_COOKIE[$name]); return cookie::set($name, '', -86400, $path, $domain, FALSE, FALSE); } } 77 | abstract class Template_Controller extends Controller { public $template = 'template'; public $auto_render = TRUE; public function __construct() { parent::__construct(); $this->template = new View($this->template); if ($this->auto_render == TRUE) { Event::add('system.post_controller', array($this, '_render')); } } public function _render() { if ($this->auto_render == TRUE) { $this->template->render(TRUE); } } } 78 | public static function log_directory($dir = NULL) { static $directory; if ( ! empty($dir)) { $dir = realpath($dir); if (is_dir($dir) AND is_writable($dir)) { $directory = str_replace('\\', '/', $dir).'/'; } else { throw new Kohana_Exception('core.log_dir_unwritable', $dir); } } return $directory; } 79 | public function rotate($degrees) { $degrees = (int) $degrees; if ($degrees > 180) { do { $degrees -= 360; } while($degrees > 180); } if ($degrees < -180) { do { $degrees += 360; } while($degrees < -180); } $this->actions['rotate'] = $degrees; return $this; } 80 | public function save($new_image = FALSE, $chmod = 0644, $keep_actions = FALSE) { empty($new_image) and $new_image = $this->image['file']; $dir = pathinfo($new_image, PATHINFO_DIRNAME); $file = pathinfo($new_image, PATHINFO_BASENAME); $dir = str_replace('\\', '/', realpath($dir)).'/'; if ( ! is_writable($dir)) throw new Kohana_Exception('image.directory_unwritable', $dir); if ($status = $this->driver->process($this->image, $this->actions, $dir, $file)) { if ($chmod !== FALSE) { chmod($new_image, $chmod); } } if ($keep_actions === FALSE) $this->actions = array(); return $status; } 81 | <?php echo $error ?>

82 | -------------------------------------------------------------------------------- /dict/rus_begin.txt: -------------------------------------------------------------------------------- 1 | вода жало волы лада лава фары жало лыжа 2 | фалда жажда оводы олово вдова фалды выдавал дважды 3 | 4 | под пар род ров вар ода ржа паж 5 | ролл лорд орлы арфа флора фалды плоды дрова 6 | продал фарфор пара лыж проводы водопад водопровод жаждал 7 | 8 | парад опора продал проводы продолжал 9 | ар пар парад правда пропажа форвард продолжал пропал продавала вдова драп 10 | 11 | как ого век гол нож лев 12 | перо гора карп нора горн кран 13 | грек гнев вена граф корж жена фрак 14 | депо вера горы ложе нрав корд 15 | 16 | долг вена река горе пена репа нега нога гера ганг гран кран 17 | кора град клык рана клен крен годы нора карп грек гнев нрав 18 | океан навык венок напор кагор нагар порог норка опера 19 | опора орган горка кепка нерпа канва выпад ванна ковер пенал 20 | 21 | огарок жаргон нежные жаркое фараон дренаж дерево аккорд ограда 22 | рекорд лекало пролог коралл подлог кордон планер полено огонек 23 | дорога жадные вклады гордые канавы каждые горные вагоны погоны 24 | педагог генерал подарок жернова караван паковка оправка дерево 25 | 26 | нерв нрав река флаг кожа пена горе репа ложе ожег волк рога 27 | жерло ложка накал голод гараж факел гопак нравы аркан рывок 28 | дорога капрон пролог жаргон канава выгода предел дренаж жернов 29 | предлог жонглер догадка преграда фонограф гражданка 30 | 31 | варежка выдавал невежда выговор награда флаконы жонглер пролог 32 | жернова надежда орленок предлог гондола перевал перегон вандал 33 | паранджа неправда королева поджарка френолог преграда голодные 34 | 35 | увы шла фук шок пуд шеф ура шар 36 | фура каша ушко шлак пунш шарж пруд шарф 37 | шелк угол паук шнур рукав кошка акула школа 38 | курок шалаш гудок шпора фургон прошел управа шарада 39 | пушка шашка уколы шпоры кулон шакал кенгуру лошадка 40 | фура шурф пугало крошка журнал окрошка фуражка окрошка 41 | рукав пшено кушак канва шуруп уклон дуга шкаф 42 | акула дупло выкуп груда фураж уклон укроп кукла фурор кулон 43 | курок купон нужда рукав гудок наука угнал рупор укрыл фужер 44 | ураган фургон вокруг уверен пугало журнал пурпур рукава управа 45 | фуражка кенгуру кувалда ковш шары шоколад шпага дышло пышка 46 | 47 | цеп щуп цуг лещ герц роща цена щука 48 | цаца роща цедра щепка цыган щенок жрец укрощен 49 | цена овца жрец цапфа цедра конец купец перец ранец цапфа кварц 50 | лацкан цыганка цыпленок гуцул целлофан процедура процежен целы 51 | щука клещ роща пуща щека плащ щенок щегол щепка праща площадка 52 | пощада щеколда щедрые зацеплен коленце ценные выращен щедрые 53 | 54 | йод зов лай воз рай раз йог зал 55 | гайка шейка лакей шайка жокей лейка нейлон прощай 56 | лоза ваза доза коза указ роза узел жезл 57 | злой зной крез звон зола озон залог завод 58 | газон проза козел фонза озеро заказ фазан закон зерно вызов 59 | железо заноза разжог цензор пейзаж заказы злодей вокзал зевака 60 | церезин резонер зеркало прогноз пузырек озорной проказы поздно 61 | перезвон задорный заданный дозорный резервный разорванный 62 | 63 | гайка груша щепка шейка звено жокей крыша праща щенок вылей 64 | наука кузов пушка щегол шайка ездок цыган фазан шуруп шалаш 65 | фураж шпоры завод роза фраза лайка нужда щедрый войлок лужайка 66 | залог везде гудок рукав позже кайло кулак война гроза дрозд 67 | 68 | заноза шарада развал ловкий удалой щедрый нарзан узнала пугало 69 | ландыш резеда нежный нужный пышный наркоз звонко лозунг журнал 70 | поздно прощай ровный нейлон фургон вокруг еловый опушка пейзаж 71 | озорной фуфайка лужайка жареный лазейка вокзал кадровый правый 72 | перезвон грузовой заказной пунцовый фейерверк канарейка важный 73 | 74 | вам мол мак мой мир май ива дом три ром мор пат том тир миф 75 | лом ель ком вид жир тыл тол дот щит лот пик пир мал тип рот 76 | мот тон кит шут тур там жив таз так туз лик лот фин жив вид 77 | ритм мама рама пимы пить мыть литр мыло мало мода моль шило 78 | жила торт мама март мавр дама гром рама пыль тара вата вилы 79 | лира роль жаль типы дать шить тишь грот гром тень тмин трон 80 | рама кино грим пень трап трек мука гимн толь цель 81 | соль тушь мозг тара рать тмин медь мазь литр пить 82 | 83 | трава тираж типаж тапир драма потоп лампа лимфа митра мирты 84 | молва трава молод вилла дождь лимит мотор аорта тропа ропот 85 | драма жатва пикап пират иприт пакет мираж прима цукат тапер 86 | тенор роман центр марка тиран музей пирог факир фурма дожди 87 | рапорт травма дрожжи тротил пролив варить вампир дымить товары 88 | картон минога притон золото цветок тритон притон цукаты приказ 89 | призыв гитара манеры иволга вериги нектар мальва царица микрон 90 | трактир тетрадь матрица фрагмент пижама примитив протокол винт 91 | факир рифмы мираж форма фагот молот лиман тощий тариф фирма 92 | приток микрон лапоть долина турнир митинг музыка аптека диктор 93 | иволга фитиль манеры лирика камера тушить триада пироги тиражи 94 | магазин прошить метрика тетрадь трактир трактат трамвай пижама 95 | роль голь ложь рожь корь пень конь выпь даль новь золь ноль 96 | глушь гладь зелье зверь кровь вепрь жердь колье кладь пьеро 97 | коньки кудель зорька апрель курьер герань щавель полька пенька 98 | пальма варенье пудель вензель вольта кольцо кефаль понедельник 99 | 100 | час сыч что чад лоб чиж бал юла дюж чай дюр бра бас бич сак 101 | все лбы лют фас лью таю бак сею сыр сор сам сом мыс мус 102 | бюро дача боль быль юрта тюль жюри часы весы смак люди сады 103 | совы сода сажа дичь чары чаща свод брод силы рост соль блиц юг 104 | брас грач квач блюз блин блик дюйм беда бред брод боты басы 105 | сдача чалма блюдо честь сарай вакса сапог цибик чукча бочка сюжет 106 | судьба бюджет сверка чеснок челнок чинара дюжина обычай 107 | свадьба вычитка свалить общение обитатель болтливый счастливый 108 | каюта мечта успех просо битюг табак бычлок честь салют букет 109 | сабля барон часть чалма сачок кочка сучок чулок счеты ситро 110 | участь дюжина сапфир юность случай бритва батист соболь брусок 111 | чинара бордюр бублик чучело бричка батрак собака судьба 112 | бордюр чувство пробирка чудесница дюжина часов кусочек ветчины 113 | 114 | ямы яды соя шея мяч тяж фея яма рея ряд яки ять вял явь выя 115 | мята мясо яшма няня ряса дядя лясы вяло ярмо воля ялик ядро 116 | кляча якорь грязь лямка бадья сабля сакля рояль яркий маляр 117 | тяпка пятка всякий прямой янтарь футляр фурия дисперсия 118 | 119 | тёс лёд лён мёд пёс ёрш рёв ещё дёрн плёс ёлка паёк нёбо клён слёт 120 | сёмга ковёр тёрка шатёр козёл полёт осётр сапёр кулёк клёст 121 | берёза платёж костёр курьёз учёный дёготь клёпка тенёта фразёр 122 | ёмкость посёлок лебёдка самотёк селёдка тесёмка свёрток монтёр сёмга 123 | тёрка пчёлка пёрышко молодёжь ребёнок приёмник пёстрый цыплёнок кулёк 124 | 125 | хан ход цех хор пух ухо жох хоп 126 | холл уход хвощь хлев шейх хлор орех веха 127 | холод заход халва доход колхоз щедрый хоккей пароход 128 | эол эва эхо вэф фэд эко эра эрг это эре вэо эка пэр сэр 129 | алоэ эдда эдак эпод эфор дэфа эжен джед эвен 130 | экран вэржэ алоэ каноэ дуэль дуэт поэт силуэт маэстро элексир эпоха эллада 131 | орех эмаль холод эльф экзарх доход эклер поход электроны 132 | находка пароход цейхгауз прохлада этажерка экипаж лопух эллада 133 | хлопушка электрохимия хоккей экземпляр хорошо элексир впопыхах 134 | сэкономить холодный эшелон экскурсия характеристика подоходный 135 | 136 | разъяснять предъявлять объект объектив объективный объединение 137 | субъект адъютант конъюнктура объявление объяснение 138 | 139 | сакля кусок успех разум танцы жердь крабы кулик вечер эскадрон 140 | сцена якорь девиз линза чашка франт архив совет алмаз консервы 141 | умный речка вялый яркий съезд серна въезд въявь огонь чудесный 142 | ширма табак ясень финик петух ключи ягуар паста вишня балерина 143 | 144 | дружба сургуч жасмин слепой слепец скупой кишлак гипноз экипаж 145 | яблоко краска эхолот чинара цукаты чесуча сурьма призма весной 146 | сорняк ключик клумба челнок чеснок пайщик лошадь щавель фигура 147 | жалкий объезд разъем отъезд боксер химера пионер друзья фонарь 148 | 149 | суровый кипарис игрушка абрикос честный деревня студень пролив 150 | питание угрюмый красота кочегар любящий кремень парашют ценный 151 | брошюра оркестр муравей табурет траншея каталог кашалот рапира 152 | прорубь пружина богатый женщина корабль грамота пирожок желудь 153 | 154 | аттестат кристалл ржавчина оперетта эвкалипт маргарин ватерпас 155 | питомник скатерть шарманка верность ватрушка объектив механизм 156 | кулебяка пуговица путаница пришелец пристань выставка гидролиз 157 | съестной карнавал переплет книголюб оптиметр разгонка параграф 158 | 159 | одуванчик богатство кондуктор атмосфера транспорт всесторонний 160 | фестиваль правдивый отъезжать небрежный подъемник пространство 161 | кулинария ускорение миноносец эскалатор партитура оборудование 162 | искусство торжество пиршество кустарник закройщик историческая 163 | 164 | аккуратный аттракцион броненосец применение стекольщик легенда 165 | напряжение муравейник оркестрант архитектор ультразвук штихель 166 | фильтрация тренировка вычисление инструктор объяснение полимер 167 | мастерская устройство электролиз умывальник гипнотизер прогноз 168 | 169 | министерство руководитель долгожданный манифестация инициатива 170 | вычерчивание прожекторный огнетушитель электропоезд напряжение 171 | артиллерист хлебопекарня студенческий мировоззрение зацепление 172 | справедливый кремнекислый жонглировать бдительность типография 173 | 174 | кремнекислота постановление бриллиантовый сопротивление прибор 175 | недоразумение млекопитающее разъединенный автоблокировка успех 176 | соприкосновение гальванотехника электродвигатель автоматизация 177 | взаимодействие революционный кораблестроительный международный 178 | 179 | т.е. пр. др. т.д. т.п. см. рис. 180 | какой-либо по-видимому из-за во-первых по-русски пол-листа пол-лимона пол-дома 181 | 182 | привал пример приклад прицел предлог предание предвестие предъявлять 183 | переправа пересмотр перепил перешёл подвал подбор поддать подъём 184 | ответ отгул отмена отбой обжора обвить обгон обзор 185 | изредка извне издали изучить безработица бездна безобразие беззубый 186 | возврат возглас возможно возраст размах разведка размазня раздать 187 | раскол распад рассказ расплата 188 | злой сухой большой яркий синий низший купленный жизненный сильнейший беднейший 189 | гейша пишущий несущий ревущий читающий мигающий лающий летящий стоящий горящий 190 | гонимый ранимый любимый нести везти пойти ругаться бояться улыбаться 191 | сбылась валялась купалась гадость слабость радость каратист гитарист артист 192 | 193 | кто-то что-то где-то как-то когда-то кое-кто кое-кого кое-чем 194 | кто-либо что-либо какой-либо кто-нибудь что-нибудь как-нибудь когда-нибудь 195 | дай-ка иди-ка всё-таки опять-таки прямо-таки чуть-чуть 196 | мало-помалу по-прежнему по-моему по-видимому 197 | -------------------------------------------------------------------------------- /beta/index.js: -------------------------------------------------------------------------------- 1 | jQuery.cookie = function(name, value, options) { 2 | if (typeof value != 'undefined') { 3 | options = options || {}; 4 | if (value === null) { 5 | value = ''; 6 | options.expires = -1; 7 | } 8 | var expires = ''; 9 | if (options.expires && typeof options.expires == 'number') { 10 | var date; 11 | date = new Date(); 12 | date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 13 | expires = '; expires=' + date.toUTCString(); 14 | } 15 | document.cookie = [name, '=', encodeURIComponent(value), expires].join(''); 16 | } else { 17 | var cookieValue = null; 18 | if (document.cookie && document.cookie != '') { 19 | var cookies = document.cookie.split(';'); 20 | for (var i = 0; i < cookies.length; i++) { 21 | var cookie = jQuery.trim(cookies[i]); 22 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 23 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 24 | break; 25 | } 26 | } 27 | } 28 | return cookieValue; 29 | } 30 | }; 31 | function setInputWidth() { 32 | var width = $("#text1").width(); 33 | $("#input_text").width(width < 700 ? 700 : width).focus(); 34 | } 35 | function convertToHtml(text) { 36 | return text.replace(/&/g, "&").replace(/ 1 ? alang[1].split(" ; ") : []; 60 | if (startIndex == this.currentLine) { 61 | $("#question").text(alang[0]); 62 | this.currentText = rand; 63 | } 64 | var text = ""; 65 | if (avars.length > 0) { 66 | var rand2 = Math.floor(Math.random() * avars.length); 67 | text = avars[rand2] + "¶"; 68 | } 69 | this.lines[startIndex] = {text: text, id: rand}; 70 | if (startIndex < (this.maxLinesDict - 1)) { 71 | this.setLines(startIndex + 1); 72 | } 73 | } else { 74 | var index = startIndex; 75 | while (str.length > 0) { 76 | if (str.length > 80) { 77 | var line1_pos = str.substring(0, 81).lastIndexOf(" "); 78 | this.lines[index] = {text: str.substring(0, line1_pos) + String.fromCharCode(160), id: rand}; 79 | str = str.substring(line1_pos + 1); 80 | } else { 81 | this.lines[index] = {text: str + "¶", id: rand}; 82 | str = ""; 83 | } 84 | index ++; 85 | } 86 | if (this.lines.length < (this.maxLinesText - 1) && this.text.length > 1) { 87 | this.setLines(index); 88 | } 89 | } 90 | } 91 | this.showLines = function(inputLen) { 92 | var error_symbols = []; 93 | for (var i in this.error_symbols) { 94 | error_symbols[i] = this.error_symbols[i]; 95 | } 96 | for (var index = 0; index < (this.mode == "dict" ? this.maxLinesDict : this.maxLinesText); index ++) { 97 | var end = this.lines[index].text.substring(index == 0 ? inputLen : 0); 98 | var end_line = ""; 99 | for (var i = 0; i < end.length; i ++) { 100 | var symbol = end.substring(i, i + 1); 101 | if (error_symbols[symbol.toLowerCase()] > 0) { 102 | end_line = end_line + '' + convertToHtml(symbol) + ''; 103 | error_symbols[symbol.toLowerCase()] --; 104 | } else { 105 | end_line = end_line + convertToHtml(symbol); 106 | } 107 | } 108 | $("#text" + (index + 1)).html((inputLen > 0 && index == 0 ? ''+convertToHtml(this.lines[index].text.substring(0, inputLen))+'' : "")+end_line); 109 | } 110 | } 111 | this.selLanguage = function() { 112 | } 113 | this.showStat = function(speed, errors) { 114 | var abs_speed = (this.sum_time == 0 ? 0 : (this.sum_length / this.sum_time) * 60); 115 | var out_abs_error = (this.sum_length == 0 ? 0 : (Math.round((this.sum_error / this.sum_length) * 100 * 100) / 100)); 116 | var out_error = (Math.round(errors * 100) / 100); 117 | $("#stat").html( 118 | "["+Math.round(speed)+"/"+Math.round(abs_speed)+"]/min"+ 119 | "    "+ 120 | "["+out_error.toFixed(2)+"/"+out_abs_error.toFixed(2)+"]%" 121 | ); 122 | } 123 | this.linesUp = function() { 124 | for (var i = 0; i < this.lines.length - 1; i ++) { 125 | this.lines[i] = this.lines[i + 1]; 126 | $("#text" + (i + 1)).html(convertToHtml(this.lines[i].text)); 127 | } 128 | this.lines.pop(); 129 | } 130 | this.init = function() { 131 | this.sum_error = 0; 132 | this.sum_time = 0; 133 | this.sum_error = 0; 134 | this.sum_length = 0; 135 | this.showStat(0, 0); 136 | this.error_symbols = []; 137 | this.currentLine = (this.mode == "dict" ? Math.floor(Math.random() * 7) : 0); 138 | this.softInit(); 139 | $("#question").toggle(this.mode == "dict"); 140 | $("div.data").toggleClass("dict", this.mode == "dict"); 141 | $("div.text").show(); 142 | for (var i = ((this.mode == "dict" ? this.maxLinesDict : this.maxLinesText) + 1); i <= 7; i ++) { 143 | $("#text" + i).parent("div.text").hide(); 144 | } 145 | } 146 | this.softInit = function() { 147 | if (this.timer) { 148 | window.clearTimeout(this.timer); 149 | } 150 | this.time_start = null; 151 | this.count_error = 0; 152 | $("#input_text").val("").removeClass("error"); 153 | this.lines = [{text: "", id: 0}]; 154 | this.setLines(0); 155 | this.position = 0; 156 | this.showLines(0); 157 | setInputWidth(); 158 | } 159 | this.initLanguage = function() { 160 | var language = $("#sel_language").val(); 161 | var klava = this; 162 | $.ajax({ 163 | url: language + ".txt", 164 | success: function(data) { 165 | klava.text = data.replace(/ {2,}/g, " ").replace(/^ /g, "").replace(/\r/g, "").replace(/\n\n/g,"\n").split("\n"); 166 | if (language.indexOf("dict_") == 3) { 167 | klava.mode = "dict"; 168 | } else { 169 | klava.mode = "text"; 170 | } 171 | klava.init(); 172 | }, 173 | error: function() { 174 | alert("Error"); 175 | } 176 | }); 177 | var lang = language.substring(0, 2); 178 | if (lang == "en" && ! $("#sel_keyboard option:selected").hasClass("en")) { 179 | $("#sel_keyboard").val("qwerty").change(); 180 | } 181 | if (lang == "ru" && ! $("#sel_keyboard option:selected").hasClass("ru")) { 182 | $("#sel_keyboard").val("rus_win").change(); 183 | } 184 | $("#sel_keyboard option").hide(); 185 | $("#sel_keyboard ." + lang).show(); 186 | } 187 | this.initKeyboard = function() { 188 | var keyboard = $("#sel_keyboard").val(); 189 | $("div.keyboard").hide(); 190 | $("#kb_" + keyboard).show(); 191 | if (keyboard == "dzen") { 192 | $("#show_color").hide(); 193 | } else { 194 | $("#show_color").show(); 195 | } 196 | } 197 | this.initColor = function() { 198 | if ($("#show_color").get(0).checked) { 199 | $("#keyboard div.block").removeClass("bw"); 200 | } else { 201 | $("#keyboard div.block").addClass("bw"); 202 | } 203 | } 204 | } 205 | $(function() { 206 | var klava = new Klava(); 207 | $("#sel_reload").click(function() { 208 | klava.softInit(); 209 | }); 210 | if ($.cookie("klavarog_language")) 211 | $("#sel_language").val($.cookie("klavarog_language")); 212 | $("#sel_language").change(function() { 213 | var language = $(this).val(); 214 | $.cookie("klavarog_language", language, {expires: 100}); 215 | klava.initLanguage(); 216 | $("#input_text").focus(); 217 | }); 218 | klava.initLanguage(); 219 | if ($.cookie("klavarog_keyboard")) 220 | $("#sel_keyboard").val($.cookie("klavarog_keyboard")); 221 | $("#sel_keyboard").change(function() { 222 | var keyboard = $(this).val(); 223 | $.cookie("klavarog_keyboard", keyboard, {expires: 100}); 224 | klava.initKeyboard(); 225 | $("#input_text").focus(); 226 | }); 227 | klava.initKeyboard(); 228 | if ($.cookie("klavarog_color")) 229 | $("#show_color").get(0).checked = ($.cookie("klavarog_color") != "false"); 230 | $("#show_color").change(function() { 231 | $.cookie("klavarog_color", $(this).get(0).checked, {expires: 100}); 232 | klava.initColor(); 233 | $("#input_text").focus(); 234 | }).click(function() { 235 | $(this).change(); 236 | }); 237 | klava.initColor(); 238 | $("div.mac_enter").css({position: "absolute", marginLeft: ($.browser.opera ? 489 : 0), zIndex: -2, display: "inline", height: 56}); 239 | $("#input_text").keyup(function(event) { 240 | if (klava.reset_timer) { 241 | window.clearTimeout(klava.reset_timer); 242 | } 243 | klava.reset_timer = window.setTimeout(function() { 244 | $("#input_text").val("").keyup(); 245 | }, 15000); 246 | if (klava.time_start == null) { 247 | klava.time_start = new Date(); 248 | } 249 | var input = $(this).val(); 250 | if (event.which == 13) { 251 | input = input + "¶"; 252 | $(this).val(input); 253 | } 254 | if (input == "") { 255 | klava.time_start = null; 256 | klava.count_error = 0; 257 | } 258 | if (klava.mode == "dict") { 259 | var is_not_error = false; 260 | for (var i = 0; i < klava.maxLinesDict; i ++) { 261 | if (klava.lines[i].text.substring(0, input.length) == input) { 262 | is_not_error = true; 263 | } 264 | klava.showLines(klava.position); 265 | } 266 | $(this).toggleClass("error", ! is_not_error); 267 | } else { 268 | var top_line = klava.lines[0].text.replace(String.fromCharCode(160), " "); 269 | var symbol = top_line.substring(klava.position, klava.position + 1).toLowerCase(); 270 | if (top_line.substring(0, input.length) != input.substring(0, top_line.length)) { 271 | if ( ! $(this).hasClass("error")) { 272 | klava.count_error ++; 273 | if (symbol != " " && symbol != "¶") { 274 | klava.error_symbols[symbol] = (klava.error_symbols[symbol] ? klava.error_symbols[symbol] + 7 : 7); 275 | } 276 | window.status = event.which; 277 | $(this).addClass("error"); 278 | klava.showLines(klava.position); 279 | } 280 | } else if (top_line != "") { 281 | if (klava.error_symbols[symbol] > 0 && klava.position < input.length) { 282 | klava.error_symbols[symbol] = klava.error_symbols[symbol] - 1; 283 | } 284 | klava.position = input.length; 285 | $(this).removeClass("error"); 286 | if (input.length >= top_line.length) { 287 | $(this).val(input.substring(top_line.length)); 288 | var time_stop = new Date(); 289 | var time = (time_stop - klava.time_start) / 1000; 290 | klava.sum_time += time; 291 | klava.sum_length += top_line.length; 292 | var speed = (input.length / time) * 60; 293 | var errors = (klava.count_error / input.length) * 100; 294 | klava.sum_error += klava.count_error; 295 | klava.count_error = 0; 296 | klava.position = 0; 297 | klava.time_start = null; 298 | klava.showStat(speed, errors); 299 | klava.linesUp(); 300 | if (klava.lines.length < klava.maxLinesText) { 301 | klava.setLines(klava.lines.length); 302 | } 303 | setInputWidth(); 304 | $(this).keyup(); 305 | } else { 306 | klava.showLines(input.length); 307 | } 308 | } 309 | } 310 | }).keyup(); 311 | }); 312 | -------------------------------------------------------------------------------- /gamma/index.js: -------------------------------------------------------------------------------- 1 | jQuery.cookie = function(name, value, options) { 2 | if (typeof value != 'undefined') { 3 | options = options || {}; 4 | if (value === null) { 5 | value = ''; 6 | options.expires = -1; 7 | } 8 | var expires = ''; 9 | if (options.expires && typeof options.expires == 'number') { 10 | var date; 11 | date = new Date(); 12 | date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); 13 | expires = '; expires=' + date.toUTCString(); 14 | } 15 | document.cookie = [name, '=', encodeURIComponent(value), expires].join(''); 16 | } else { 17 | var cookieValue = null; 18 | if (document.cookie && document.cookie != '') { 19 | var cookies = document.cookie.split(';'); 20 | for (var i = 0; i < cookies.length; i++) { 21 | var cookie = jQuery.trim(cookies[i]); 22 | if (cookie.substring(0, name.length + 1) == (name + '=')) { 23 | cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 24 | break; 25 | } 26 | } 27 | } 28 | return cookieValue; 29 | } 30 | }; 31 | function setInputWidth() { 32 | var width = $("#text1").width(); 33 | $("#input_text").width(width < 700 ? 700 : width).focus(); 34 | } 35 | function convertToHtml(text) { 36 | return text.replace(/&/g, "&").replace(/ 1 ? alang[1].split(" ; ") : []; 60 | if (startIndex == this.currentLine) { 61 | $("#question").text(alang[0]); 62 | this.currentText = rand; 63 | } 64 | var text = ""; 65 | if (avars.length > 0) { 66 | var rand2 = Math.floor(Math.random() * avars.length); 67 | text = avars[rand2] + "¶"; 68 | } 69 | this.lines[startIndex] = {text: text, id: rand}; 70 | if (startIndex < (this.maxLinesDict - 1)) { 71 | this.setLines(startIndex + 1); 72 | } 73 | } else { 74 | var index = startIndex; 75 | while (str.length > 0) { 76 | if (str.length > 80) { 77 | var line1_pos = str.substring(0, 81).lastIndexOf(" "); 78 | this.lines[index] = {text: str.substring(0, line1_pos) + String.fromCharCode(160), id: rand}; 79 | str = str.substring(line1_pos + 1); 80 | } else { 81 | this.lines[index] = {text: str + "¶", id: rand}; 82 | str = ""; 83 | } 84 | index ++; 85 | } 86 | if (this.lines.length < (this.maxLinesText - 1) && this.text.length > 1) { 87 | this.setLines(index); 88 | } 89 | } 90 | } 91 | this.showLines = function(inputLen) { 92 | var error_symbols = []; 93 | for (var i in this.error_symbols) { 94 | error_symbols[i] = this.error_symbols[i]; 95 | } 96 | for (var index = 0; index < (this.mode == "dict" ? this.maxLinesDict : this.maxLinesText); index ++) { 97 | var end = this.lines[index].text.substring(index == 0 ? inputLen : 0); 98 | var end_line = ""; 99 | for (var i = 0; i < end.length; i ++) { 100 | var symbol = end.substring(i, i + 1); 101 | if (error_symbols[symbol.toLowerCase()] > 0) { 102 | end_line = end_line + '' + convertToHtml(symbol) + ''; 103 | error_symbols[symbol.toLowerCase()] --; 104 | } else { 105 | end_line = end_line + convertToHtml(symbol); 106 | } 107 | } 108 | $("#text" + (index + 1)).html((inputLen > 0 && index == 0 ? ''+convertToHtml(this.lines[index].text.substring(0, inputLen))+'' : "")+end_line); 109 | } 110 | } 111 | this.selLanguage = function() { 112 | } 113 | this.showStat = function(speed, errors) { 114 | var abs_speed = (this.sum_time == 0 ? 0 : (this.sum_length / this.sum_time) * 60); 115 | var out_abs_error = (this.sum_length == 0 ? 0 : (Math.round((this.sum_error / this.sum_length) * 100 * 100) / 100)); 116 | var out_error = (Math.round(errors * 100) / 100); 117 | $("#stat").html( 118 | "["+Math.round(speed / 6)+"/"+Math.round(abs_speed / 6)+"]words/min"+ 119 | "    "+ 120 | "["+Math.round(speed)+"/"+Math.round(abs_speed)+"]chars/min"+ 121 | "    "+ 122 | "["+out_error.toFixed(2)+"/"+out_abs_error.toFixed(2)+"]%" 123 | ); 124 | } 125 | this.linesUp = function() { 126 | for (var i = 0; i < this.lines.length - 1; i ++) { 127 | this.lines[i] = this.lines[i + 1]; 128 | $("#text" + (i + 1)).html(convertToHtml(this.lines[i].text)); 129 | } 130 | this.lines.pop(); 131 | } 132 | this.init = function() { 133 | this.sum_error = 0; 134 | this.sum_time = 0; 135 | this.sum_error = 0; 136 | this.sum_length = 0; 137 | this.showStat(0, 0); 138 | this.error_symbols = []; 139 | this.currentLine = (this.mode == "dict" ? Math.floor(Math.random() * 7) : 0); 140 | this.softInit(); 141 | $("#question").toggle(this.mode == "dict"); 142 | $("div.data").toggleClass("dict", this.mode == "dict"); 143 | $("div.text").show(); 144 | for (var i = ((this.mode == "dict" ? this.maxLinesDict : this.maxLinesText) + 1); i <= 7; i ++) { 145 | $("#text" + i).parent("div.text").hide(); 146 | } 147 | } 148 | this.softInit = function() { 149 | if (this.timer) { 150 | window.clearTimeout(this.timer); 151 | } 152 | this.time_start = null; 153 | this.count_error = 0; 154 | $("#input_text").val("").removeClass("error"); 155 | this.lines = [{text: "", id: 0}]; 156 | this.setLines(0); 157 | this.position = 0; 158 | this.showLines(0); 159 | setInputWidth(); 160 | } 161 | this.initLanguage = function() { 162 | var language = $("#sel_language").val(); 163 | var klava = this; 164 | $.ajax({ 165 | url: language + ".txt", 166 | success: function(data) { 167 | klava.text = data.replace(/\t/g, " ").replace(/ {2,}/g, " ").replace(/^ /g, "").replace(/\r/g, "").replace(/\n\n/g,"\n").split("\n"); 168 | if (language.indexOf("dict_") == 3) { 169 | klava.mode = "dict"; 170 | } else { 171 | klava.mode = "text"; 172 | } 173 | klava.init(); 174 | }, 175 | error: function() { 176 | alert("Error"); 177 | } 178 | }); 179 | var lang = language.substring(0, 2); 180 | if (lang == "en" && ! $("#sel_keyboard option:selected").hasClass("en")) { 181 | $("#sel_keyboard").val("qwerty").change(); 182 | } 183 | if (lang == "ru" && ! $("#sel_keyboard option:selected").hasClass("ru")) { 184 | $("#sel_keyboard").val("rus_win").change(); 185 | } 186 | $("#sel_keyboard option").hide(); 187 | $("#sel_keyboard ." + lang).show(); 188 | } 189 | this.initKeyboard = function() { 190 | var keyboard = $("#sel_keyboard").val(); 191 | $("div.keyboard").hide(); 192 | $("#kb_" + keyboard).show(); 193 | if (keyboard == "dzen") { 194 | $("#show_color").hide(); 195 | } else { 196 | $("#show_color").show(); 197 | } 198 | } 199 | this.initColor = function() { 200 | if ($("#show_color").get(0).checked) { 201 | $("#keyboard div.block").removeClass("bw"); 202 | } else { 203 | $("#keyboard div.block").addClass("bw"); 204 | } 205 | } 206 | } 207 | $(function() { 208 | var klava = new Klava(); 209 | $("#sel_reload").click(function() { 210 | klava.softInit(); 211 | }); 212 | if ($.cookie("klavarog_language")) 213 | $("#sel_language").val($.cookie("klavarog_language")); 214 | $("#sel_language").change(function() { 215 | var language = $(this).val(); 216 | $.cookie("klavarog_language", language, {expires: 100}); 217 | klava.initLanguage(); 218 | $("#input_text").focus(); 219 | }); 220 | klava.initLanguage(); 221 | if ($.cookie("klavarog_keyboard")) 222 | $("#sel_keyboard").val($.cookie("klavarog_keyboard")); 223 | $("#sel_keyboard").change(function() { 224 | var keyboard = $(this).val(); 225 | $.cookie("klavarog_keyboard", keyboard, {expires: 100}); 226 | klava.initKeyboard(); 227 | $("#input_text").focus(); 228 | }); 229 | klava.initKeyboard(); 230 | if ($.cookie("klavarog_color")) 231 | $("#show_color").get(0).checked = ($.cookie("klavarog_color") != "false"); 232 | $("#show_color").change(function() { 233 | $.cookie("klavarog_color", $(this).get(0).checked, {expires: 100}); 234 | klava.initColor(); 235 | $("#input_text").focus(); 236 | }).click(function() { 237 | $(this).change(); 238 | }); 239 | klava.initColor(); 240 | $("div.mac_enter").css({position: "absolute", marginLeft: ($.browser.opera ? 489 : 0), zIndex: -2, display: "inline", height: 56}); 241 | $("#input_text").keyup(function(event) { 242 | if (klava.reset_timer) { 243 | window.clearTimeout(klava.reset_timer); 244 | } 245 | klava.reset_timer = window.setTimeout(function() { 246 | $("#input_text").val("").keyup(); 247 | }, 15000); 248 | if (klava.time_start == null) { 249 | klava.time_start = new Date(); 250 | } 251 | var input = $(this).val(); 252 | if (event.which == 13) { 253 | input = input + "¶"; 254 | $(this).val(input); 255 | } 256 | if (input == "") { 257 | klava.time_start = null; 258 | klava.count_error = 0; 259 | } 260 | if (klava.mode == "dict") { 261 | var is_not_error = false; 262 | for (var i = 0; i < klava.maxLinesDict; i ++) { 263 | if (klava.lines[i].text.substring(0, input.length) == input) { 264 | is_not_error = true; 265 | $("#text" + (i + 1)).html(''+convertToHtml(klava.lines[i].text.substring(0, input.length))+''+convertToHtml(klava.lines[i].text.substring(input.length))); 266 | } else { 267 | $("#text" + (i + 1)).html(convertToHtml(klava.lines[i].text)); 268 | } 269 | } 270 | $(this).toggleClass("error", ! is_not_error); 271 | } else { 272 | var top_line = klava.lines[0].text.replace(String.fromCharCode(160), " "); 273 | var symbol = top_line.substring(klava.position, klava.position + 1).toLowerCase(); 274 | if (top_line.substring(0, input.length) != input.substring(0, top_line.length)) { 275 | if ( ! $(this).hasClass("error")) { 276 | klava.count_error ++; 277 | if (symbol != " " && symbol != "¶") { 278 | klava.error_symbols[symbol] = (klava.error_symbols[symbol] ? klava.error_symbols[symbol] + 7 : 7); 279 | } 280 | window.status = event.which; 281 | $(this).addClass("error"); 282 | klava.showLines(klava.position); 283 | } 284 | } else if (top_line != "") { 285 | if (klava.error_symbols[symbol] > 0 && klava.position < input.length) { 286 | klava.error_symbols[symbol] = klava.error_symbols[symbol] - 1; 287 | } 288 | klava.position = input.length; 289 | $(this).removeClass("error"); 290 | if (input.length >= top_line.length) { 291 | $(this).val(input.substring(top_line.length)); 292 | var time_stop = new Date(); 293 | var time = (time_stop - klava.time_start) / 1000; 294 | klava.sum_time += time; 295 | klava.sum_length += top_line.length; 296 | var speed = (input.length / time) * 60; 297 | var errors = (klava.count_error / input.length) * 100; 298 | klava.sum_error += klava.count_error; 299 | klava.count_error = 0; 300 | klava.position = 0; 301 | klava.time_start = null; 302 | klava.showStat(speed, errors); 303 | klava.linesUp(); 304 | if (klava.lines.length < klava.maxLinesText) { 305 | klava.setLines(klava.lines.length); 306 | } 307 | setInputWidth(); 308 | $(this).keyup(); 309 | } else { 310 | klava.showLines(input.length); 311 | } 312 | } 313 | } 314 | }).keyup(); 315 | }); 316 | -------------------------------------------------------------------------------- /dict/eng_code_pascal.txt: -------------------------------------------------------------------------------- 1 | unit rropt386; 2 | 3 | interface 4 | 5 | uses aasmbase,aasmtai,aasmdata,aasmcpu; 6 | 7 | procedure doRenaming(asml: TAsmList; first, last: tai); 8 | 9 | implementation 10 | 11 | uses 12 | {$ifdef replaceregdebug}cutils,{$endif} 13 | verbose,globals,cpubase,daopt386,csopt386,rgobj, 14 | cgbase,cgutils,cgobj; 15 | 16 | function canBeFirstSwitch(p: taicpu; supreg: tsuperregister): boolean; 17 | begin 18 | canBeFirstSwitch := false; 19 | case p.opcode of 20 | A_MOV,A_MOVZX,A_MOVSX,A_LEA: 21 | canBeFirstSwitch := 22 | (p.oper[1]^.typ = top_reg) and 23 | (getsupreg(p.oper[1]^.reg) = supreg); 24 | A_IMUL: 25 | canBeFirstSwitch := 26 | (p.ops >= 2) and 27 | (p.oper[0]^.typ = top_const) and 28 | (getsupreg(p.oper[p.ops-1]^.reg) = supreg) and 29 | (not pTaiprop(p.optinfo)^.FlagsUsed); 30 | A_INC,A_DEC: 31 | canBeFirstSwitch := 32 | (p.oper[0]^.typ = top_reg) and 33 | (p.opsize = S_L) and 34 | (not pTaiprop(p.optinfo)^.FlagsUsed); 35 | A_SUB,A_ADD: 36 | canBeFirstSwitch := 37 | (p.oper[1]^.typ = top_reg) and 38 | (p.opsize = S_L) and 39 | (getsupreg(p.oper[1]^.reg) = supreg) and 40 | (p.oper[0]^.typ <> top_ref) and 41 | ((p.opcode <> A_SUB) or 42 | (p.oper[0]^.typ = top_const)) and 43 | (not pTaiprop(p.optinfo)^.FlagsUsed); 44 | A_SHL: 45 | canBeFirstSwitch := 46 | (p.opsize = S_L) and 47 | (p.oper[1]^.typ = top_reg) and 48 | (getsupreg(p.oper[1]^.reg) = supreg) and 49 | (p.oper[0]^.typ = top_const) and 50 | (p.oper[0]^.val in [1,2,3]) and 51 | (not pTaiprop(p.optinfo)^.FlagsUsed); 52 | end; 53 | end; 54 | 55 | 56 | procedure switchReg(var reg: tregister; reg1, reg2: tsuperregister); 57 | var 58 | supreg: tsuperregister; 59 | begin 60 | if (reg = NR_NO) or 61 | (getregtype(reg) <> R_INTREGISTER) then 62 | exit; 63 | supreg := getsupreg(reg); 64 | if (supreg = reg1) then 65 | setsupreg(reg,reg2) 66 | else if (supreg = reg2) then 67 | setsupreg(reg,reg1); 68 | end; 69 | 70 | 71 | procedure switchOp(var op: toper; reg1, reg2: tsuperregister); 72 | begin 73 | case op.typ of 74 | top_reg: 75 | switchReg(op.reg,reg1,reg2); 76 | top_ref: 77 | begin 78 | switchReg(op.ref^.base,reg1,reg2); 79 | switchReg(op.ref^.index,reg1,reg2); 80 | end; 81 | end; 82 | end; 83 | 84 | 85 | procedure doSwitchReg(hp: taicpu; reg1,reg2: tsuperregister); 86 | var 87 | opCount: longint; 88 | begin 89 | for opCount := 0 to hp.ops-1 do 90 | switchOp(hp.oper[opCount]^,reg1,reg2); 91 | end; 92 | 93 | 94 | procedure doFirstSwitch(p: taicpu; reg1, reg2: tsuperregister); 95 | var 96 | tmpRef: treference; 97 | begin 98 | case p.opcode of 99 | A_MOV,A_MOVZX,A_MOVSX,A_LEA: 100 | begin 101 | changeOp(p.oper[1]^,reg1,reg2); 102 | changeOp(p.oper[0]^,reg2,reg1); 103 | end; 104 | A_IMUL: 105 | begin 106 | p.ops := 3; 107 | p.loadreg(2,newreg(R_INTREGISTER,reg2,R_SUBWHOLE)); 108 | changeOp(p.oper[1]^,reg2,reg1); 109 | end; 110 | A_INC,A_DEC: 111 | begin 112 | reference_reset(tmpref,1); 113 | tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE); 114 | case p.opcode of 115 | A_INC: 116 | tmpref.offset := 1; 117 | A_DEC: 118 | tmpref.offset := -1; 119 | end; 120 | p.ops := 2; 121 | p.opcode := A_LEA; 122 | p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE)); 123 | p.loadref(0,tmpref); 124 | end; 125 | A_SUB,A_ADD: 126 | begin 127 | reference_reset(tmpref,1); 128 | tmpref.base := newreg(R_INTREGISTER,reg1,R_SUBWHOLE); 129 | case p.oper[0]^.typ of 130 | top_const: 131 | begin 132 | tmpref.offset := longint(p.oper[0]^.val); 133 | if p.opcode = A_SUB then 134 | tmpref.offset := - tmpRef.offset; 135 | end; 136 | top_ref: 137 | if (p.oper[0]^.ref^.refaddr=addr_full) then 138 | tmpref.symbol := p.oper[0]^.ref^.symbol 139 | else 140 | internalerror(200402263); 141 | top_reg: 142 | begin 143 | tmpref.index := p.oper[0]^.reg; 144 | if (getsupreg(tmpref.index)=reg2) then 145 | setsupreg(tmpref.index,reg1); 146 | tmpref.scalefactor := 1; 147 | end; 148 | else internalerror(200010031); 149 | end; 150 | p.opcode := A_LEA; 151 | p.loadref(0,tmpref); 152 | p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE)); 153 | end; 154 | A_SHL: 155 | begin 156 | reference_reset(tmpref,2); 157 | tmpref.index := newreg(R_INTREGISTER,reg1,R_SUBWHOLE); 158 | tmpref.scalefactor := 1 shl p.oper[0]^.val; 159 | p.opcode := A_LEA; 160 | p.loadref(0,tmpref); 161 | p.loadreg(1,newreg(R_INTREGISTER,reg2,R_SUBWHOLE)); 162 | end; 163 | else internalerror(200010032); 164 | end; 165 | end; 166 | 167 | 168 | function switchRegs(asml: TAsmList; reg1, reg2: tsuperregister; start: tai): Boolean; 169 | var 170 | endP, hp, lastreg1,lastreg2: tai; 171 | switchDone, switchLast, tmpResult, sequenceEnd, reg1Modified, reg2Modified: boolean; 172 | reg1StillUsed, reg2StillUsed, isInstruction: boolean; 173 | begin 174 | switchRegs := false; 175 | tmpResult := true; 176 | sequenceEnd := false; 177 | reg1Modified := false; 178 | reg2Modified := false; 179 | endP := start; 180 | while tmpResult and not sequenceEnd do 181 | begin 182 | tmpResult := 183 | getNextInstruction(endP,endP); 184 | If tmpResult and 185 | not pTaiprop(endp.optinfo)^.canBeRemoved then 186 | begin 187 | switchLast := storeBack(start,endP,reg1,reg2); 188 | reg1StillUsed := reg1 in pTaiprop(endp.optinfo)^.usedregs; 189 | reg2StillUsed := reg2 in pTaiprop(endp.optinfo)^.usedregs; 190 | isInstruction := endp.typ = ait_instruction; 191 | sequenceEnd := 192 | switchLast or 193 | (not reg1StillUsed and not reg2StillUsed) or 194 | (((not isInstruction) or 195 | noHardCodedRegs(taicpu(endP),reg1,reg2)) and 196 | (not reg1StillUsed or 197 | (isInstruction and findRegDealloc(reg1,endP) and 198 | regLoadedWithNewValue(reg1,false,taicpu(endP)))) and 199 | (not reg2StillUsed or 200 | (isInstruction and findRegDealloc(reg2,endP) and 201 | regLoadedWithNewValue(reg2,false,taicpu(endP))))); 202 | 203 | if reg2Modified and not(reg1Modified) and 204 | regReadByInstruction(reg1,endP) then 205 | begin 206 | tmpResult := false; 207 | break 208 | end; 209 | 210 | if not reg1Modified then 211 | begin 212 | reg1Modified := regModifiedByInstruction(reg1,endP); 213 | if reg1Modified and not canBeFirstSwitch(taicpu(endP),reg1) then 214 | begin 215 | tmpResult := false; 216 | break; 217 | end; 218 | end; 219 | if not reg2Modified then 220 | reg2Modified := regModifiedByInstruction(reg2,endP); 221 | 222 | tmpResult := 223 | ((not isInstruction) or 224 | (NoHardCodedRegs(taicpu(endP),reg1,reg2) and 225 | RegSizesOk(reg1,reg2,taicpu(endP)))); 226 | 227 | if sequenceEnd then 228 | break; 229 | 230 | tmpResult := 231 | tmpresult and 232 | (endp.typ <> ait_label) and 233 | ((not isInstruction) or 234 | (not taicpu(endp).is_jmp)); 235 | end; 236 | end; 237 | 238 | if tmpResult and sequenceEnd then 239 | begin 240 | switchRegs := true; 241 | reg1Modified := false; 242 | reg2Modified := false; 243 | lastreg1 := start; 244 | lastreg2 := start; 245 | getNextInstruction(start,hp); 246 | while hp <> endP do 247 | begin 248 | if (not pTaiprop(hp.optinfo)^.canberemoved) and 249 | (hp.typ = ait_instruction) then 250 | begin 251 | switchDone := false; 252 | if not reg1Modified then 253 | begin 254 | reg1Modified := regModifiedByInstruction(reg1,hp); 255 | if reg1Modified then 256 | begin 257 | doFirstSwitch(taicpu(hp),reg1,reg2); 258 | switchDone := true; 259 | end; 260 | end; 261 | if not switchDone then 262 | if reg1Modified then 263 | doSwitchReg(taicpu(hp),reg1,reg2) 264 | else 265 | doReplaceReg(taicpu(hp),reg2,reg1); 266 | end; 267 | if regininstruction(reg1,hp) then 268 | lastreg1 := hp; 269 | if regininstruction(reg2,hp) then 270 | lastreg2 := hp; 271 | getNextInstruction(hp,hp); 272 | end; 273 | if switchLast then 274 | begin 275 | lastreg1 := hp; 276 | lastreg2 := hp; 277 | doSwitchReg(taicpu(hp),reg1,reg2); 278 | if taicpu(hp).opsize <> taicpu(start).opsize then 279 | begin 280 | taicpu(hp).opsize := taicpu(start).opsize; 281 | taicpu(hp).oper[0]^.reg := taicpu(start).oper[0]^.reg; 282 | taicpu(hp).oper[1]^.reg := taicpu(start).oper[1]^.reg; 283 | end; 284 | end 285 | else 286 | getLastInstruction(hp,hp); 287 | allocRegBetween(asmL,newreg(R_INTREGISTER,reg1,R_SUBWHOLE),start,lastreg1, 288 | ptaiprop(start.optinfo)^.usedregs); 289 | allocRegBetween(asmL,newreg(R_INTREGISTER,reg2,R_SUBWHOLE),start,lastreg2, 290 | ptaiprop(start.optinfo)^.usedregs); 291 | end; 292 | end; 293 | 294 | 295 | procedure doRenaming(asml: TAsmList; first, last: tai); 296 | var 297 | p: tai; 298 | begin 299 | p := First; 300 | SkipHead(p); 301 | while p <> last do 302 | begin 303 | case p.typ of 304 | ait_instruction: 305 | begin 306 | case taicpu(p).opcode of 307 | A_MOV: 308 | begin 309 | if not(pTaiprop(p.optinfo)^.canBeRemoved) and 310 | (taicpu(p).oper[0]^.typ = top_reg) and 311 | (taicpu(p).oper[1]^.typ = top_reg) and 312 | (taicpu(p).opsize = S_L) and 313 | (getsupreg(taicpu(p).oper[0]^.reg) in ([RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI,RS_EDI])) and 314 | (getsupreg(taicpu(p).oper[1]^.reg) in ([RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI,RS_EDI])) then 315 | if switchRegs(asml,getsupreg(taicpu(p).oper[0]^.reg), 316 | getsupreg(taicpu(p).oper[1]^.reg),p) then 317 | begin 318 | pTaiprop(p.optinfo)^.canBeRemoved := true; 319 | end; 320 | end; 321 | end; 322 | end; 323 | end; 324 | getNextInstruction(p,p); 325 | end; 326 | end; 327 | 328 | 329 | End. 330 | -------------------------------------------------------------------------------- /beta/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Klavarog β 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 |
19 |
20 |
21 | 22 |
23 | 24 |
25 |
26 |
27 |
`~
1!
2@
3#
4$
5%
6^
7&
8*
9(
0)
-_
=+
Back
28 |
Tab
Q
W
E
R
T
Y
U
I
O
P
[{
]}
\|
29 |
Caps
A
S
D
F
G
H
J
K
L
;:
'"
Ent ¶
30 |
Shift
Z
X
C
V
B
N
M
,<
.>
/?
Shift
31 |
Ctrl
Win
Alt
Space
Alt
Win
Ctrl
32 |
33 | 40 | 47 | 54 | 61 | 62 |
63 |
64 | 65 |
66 | 67 | 74 | 75 | 83 | 84 | 85 | 86 | ibnteo@gmail.com 87 |
88 | 89 |
90 | 91 |
92 |
93 | 96 | 99 |
100 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /speed/script.js: -------------------------------------------------------------------------------- 1 | /*if(typeof(localStorage) == 'undefined' ) { 2 | alert('Ваш браузер не поддерживает localStorage()'); 3 | } else { 4 | try { 5 | localStorage.setItem('name', 'Hello World!'); //сохраняет строку "Hello World" по ключу name 6 | } catch (e) { 7 | if (e == QUOTA_EXCEEDED_ERR) { 8 | alert('Кончилось место'); //данные не сохранены, так как кончилось доступное место 9 | } 10 | } 11 | console.log(localStorage.getItem('name')); //Hello World! 12 | localStorage.removeItem('name'); //удаляет значение по ключу name 13 | }*/ 14 | 15 | var metronome = 0; 16 | //var metronome = 400; 17 | $(function() { 18 | metronome = parseInt($('#info_metronome').text()); 19 | $($.browser.mozilla ? document : document.body).keydown(function(e) { 20 | var $input = $('#input input'); 21 | if (e.keyCode == 82 && e.ctrlKey) { 22 | $input.val(''); 23 | $('#text').data('mode', null).data('line', null); 24 | linesDraw(); 25 | return false; 26 | } 27 | if (e.keyCode == 27 || e.keyCode == 13) { 28 | if ($('div.annotation').is(':visible')) $('div.annotation').click(); 29 | } 30 | }); 31 | $('#input input').keydown(function(e) { 32 | if (e.keyCode == 8 && $(this).val() == '') { 33 | return false; 34 | } 35 | }); 36 | $('div.annotation').click(function() { 37 | $('#input input').focus(); 38 | $('div.annotation').fadeOut(); 39 | $('#info').css({fontSize: 12}); 40 | $('#input').data('error_words', {}); 41 | $('#input input').data('errors', 0).val(''); 42 | }); 43 | $('#input input').focus().data('prev', '').data('len', 0).data('errors', 0).keyup(function() { 44 | textDraw(); 45 | }).keydown(function() { 46 | setTimeout(function() { 47 | textDraw(); 48 | }, 0); 49 | }).focusout(function() { 50 | if ($('#input input').val() != '') { 51 | setTimeout(function() {$('#input input').focus();}, 0); 52 | } 53 | }); 54 | var text = $('#dict').val(); 55 | //var lines = text.replace(/\r/g, "\n").replace(/\n{2,}/g, "\n").replace(/\t/g,' ').replace(/ {2,}/g,' ').replace(/^ +/g, "").replace(/\n +/g, "\n").replace(/ +$/g, "").replace(/ +\n/g, "\n").replace(/^\n/, '').replace(/`(.)/g, '$1́').split("\n"); 56 | var lines = text.replace(/\r/g, "\n").replace(/\n{2,}/g, "\n").replace(/\t/g,' ').replace(/ {2,}/g,' ').replace(/^ +/g, "").replace(/\n +/g, "\n").replace(/ +$/g, "").replace(/ +\n/g, "\n").replace(/^\n/, '').split("\n"); 57 | $('#text').data('lines', lines); 58 | 59 | //$('#input').data('error_words', {'test':2, 'abc':3, 'the':1}); 60 | //$('#text').data('line', 1); 61 | 62 | linesDraw(); 63 | setInterval(function() {textDraw();}, 100); 64 | }); 65 | 66 | function linesDraw() { 67 | $('#info').data('aspeed', {time: 0, maxlen: 0, len: 0, errors: 0}); 68 | var lines = $('#text').data('lines'); 69 | var error_words = $('#input').data('error_words'); 70 | var error_words_len = 0; 71 | var words = []; 72 | for (var item in error_words) { 73 | for (var i=0; i 3 && ! $('#set_metronome').get(0).checked) { 81 | $('#text').data('mode', 'words'); 82 | $('#text').html(''); 83 | var i = 0; 84 | var max = (words.length > 5) ? ((words.length > 10) ? 5 : 4) : 3; 85 | for (var i=0; i=3 ? ' class="hide"' : '')+'>'); 91 | $('#text div:last').text(str); 92 | } 93 | $('#annotation_error').show(); 94 | } else { 95 | var line = $('#text').data('line'); 96 | var attempts = $('#text').data('attempts'); 97 | if (! line || attempts >= 5 || $('#text').data('mode') == 'text') { 98 | line = 0; 99 | var i = 0; 100 | while (line == 0 && i < 1000) { 101 | line = random(lines.length); 102 | if (lines[line].length < 20) line = 0; 103 | i ++; 104 | } 105 | $('#text').data('attempts', 1); 106 | if ($('#text').data('mode') == 'text') $('#annotation_next').show(); 107 | } else { 108 | $('#text').data('attempts', attempts ? attempts + 1 : 1); 109 | $('#annotation_rev').show(); 110 | } 111 | $('#text').data('mode', 'text'); 112 | var text = lines[line]; 113 | var len = 0; 114 | $('#text').html(''); 115 | $('#text').data('line', line); 116 | var i = 0; 117 | while (len < text.length && i < 10) { 118 | var end = text.lastIndexOf(' ', len + 76); 119 | var str = (end >= 0 && (text.length - len) > 74) ? text.substr(len, end - len + 1) : text.substr(len) ; 120 | $('#text').append('=3 ? ' class="hide"' : '')+'>'); 121 | $('#text div:last').text(str); 122 | i ++; 123 | len += str.length; 124 | } 125 | $('#annotation_text').show(); 126 | } 127 | $('div.annotation').show(); 128 | if (parseInt($('#info span.icon_speed').text()) == 0) $('#info').css({fontSize: 20}); else $('#info').animate({fontSize: 20}); 129 | textDraw(); 130 | } 131 | function random(num) { 132 | return Math.floor(Math.random() * num); 133 | } 134 | function textDraw() { 135 | var hide_error = $('#hide_error').get(0).checked; 136 | var $input = $('#input input'); 137 | var errors = $input.data('errors'); 138 | var mode = $('#text').data('mode'); 139 | var len = $input.data('len'); 140 | var prev = $input.data('prev'); 141 | var now = (new Date()).getTime(); 142 | var last = $input.data('last'); 143 | if (last && (now - last) > 20000) { 144 | $input.data('last', null); 145 | $input.val(''); 146 | } 147 | var val = $input.val(); 148 | if (val != prev) { 149 | len += Math.abs(val.length - prev.length); 150 | $input.data('last', (new Date()).getTime()); 151 | } 152 | if (val == '') { 153 | //$('#text').data('is_metronom', random(4) > 0); 154 | errors = 0; 155 | len = 0; 156 | $input.data('errors', errors); 157 | $input.data('len', len); 158 | } 159 | $input.data('len', len); 160 | var str1 = $('#text div:eq(0)').text().replace(/ /g, ' '); 161 | var start = $('#input').data('start'); 162 | var str1_if = str1.replace(/ё/gi, 'е'); 163 | var val_if = val.replace(/ё/gi, 'е'); 164 | if (str1_if.substr(0, val_if.length) == val_if && val_if.length >= str1_if.length && val_if != '') { 165 | val = val.substr(str1.length); 166 | $input.val(val); 167 | if (mode == 'text') { 168 | var aspeed = $('#info').data('aspeed'); 169 | aspeed['time'] = aspeed['time'] + (now - start); 170 | aspeed['maxlen'] = aspeed['maxlen'] + str1.length - 1; 171 | aspeed['len'] = aspeed['len'] + str1.length - 1; 172 | aspeed['errors'] = aspeed['errors'] + errors; 173 | $('#info').data('aspeed', aspeed); 174 | var speed = Math.floor(aspeed['len'] / (aspeed['time'] / 60000)); 175 | var maxspeed = Math.floor(aspeed['maxlen'] / (aspeed['time'] / 60000)); 176 | if (! $('#set_metronome').get(0).checked) { 177 | if ((! $('#text').data('is_metronom')) && str1.length > 50) metronome = speed; 178 | if (mode!='words' && maxspeed>metronome && str1.length > 50) metronome = maxspeed; 179 | if (mode!='words' && aspeed['maxspeed'] > metronome) metronome = aspeed['maxspeed']; 180 | $('#info_metronome').text(metronome); 181 | } 182 | $('#info span.icon_speed').text(speed); 183 | //$('#info span.icon_errors').text((aspeed['len'] ? Math.round(aspeed['errors'] / aspeed['len'] * 10000) / 100 : 0)+'%'); 184 | $('#input').data('start', now); 185 | } 186 | $('#text').data('is_metronom', true); 187 | start = now; 188 | errors = 0; 189 | $input.data('errors', errors); 190 | $('#text').data('pos', val.length); 191 | for (var i = 0; i < 9; i ++) { 192 | $('#text').find('div').eq(i).text(nbsp($('#text').find('div').eq(i+1).text())); 193 | } 194 | $('#text div:eq(9)').text(''); 195 | var str1 = $('#text div:eq(0)').text(); 196 | if (str1 == '') { 197 | linesDraw(); 198 | return; 199 | } 200 | } else if (str1_if.substr(0, val_if.length) == val_if) { 201 | $input.removeClass('error'); 202 | $input.removeClass('set_error'); 203 | $('#text').removeClass('error'); 204 | $('#text').data('pos', val.length); 205 | if (val == '') { 206 | start = null; 207 | $('#input').data('start', start); 208 | } else { 209 | if (start == null) { 210 | start = (new Date()).getTime(); 211 | $('#input').data('start', start); 212 | } 213 | } 214 | } else { 215 | var old = $('#text div:eq(0) span.old').text(); 216 | if (old.length > 0 && (! $input.hasClass('set_error')) && mode == 'words') { 217 | var pos = str1.lastIndexOf(' ', old.length-1); 218 | if (pos>=0) { 219 | val = val.substr(0, pos+1).replace(/[ ]+$/, ' '); 220 | } else { 221 | val = ''; 222 | } 223 | $input.val(val); 224 | } else if (old.length > 0 && ! $input.hasClass('set_error')) { 225 | errors ++; 226 | $input.data('errors', errors); 227 | var pos = val.length - 1; 228 | var str1e = str1.replace(/[-_]/g, ' '); 229 | var startpos = str1e.lastIndexOf(' ', pos)>=0?str1e.lastIndexOf(' ',pos):0; 230 | var word = str1e.substr(startpos, str1e.indexOf(' ',pos)>=0?str1e.indexOf(' ',pos)-startpos:null).replace(/[^a-zA-Zа-яА-Я0-9']/g, '').toLowerCase(); 231 | if (word.length > 2 && mode != 'words') { 232 | var error_words = $('#input').data('error_words'); 233 | if (! error_words) error_words = {}; 234 | error_words[word] = error_words[word] ? error_words[word] ++ : 1; 235 | $('#input').data('error_words', error_words); 236 | } 237 | $input.data('error_pressed', 0); 238 | } else if (val.length < prev.length) { 239 | var error_pressed = $input.data('error_pressed'); 240 | error_pressed ++; 241 | if (error_pressed > 3 && mode != 'words') { 242 | $('#text').data('is_metronom', false); 243 | error_pressed = 0; 244 | $input.data('last', null); 245 | $input.val(''); 246 | return; 247 | } 248 | $input.data('error_pressed', error_pressed); 249 | } 250 | if (str1 != '' && (errors / str1.length) > 0.05 && mode != 'words') { 251 | $('#text').data('is_metronom', false); 252 | $input.data('errors', 0); 253 | $input.val(''); 254 | textDraw(); 255 | return; 256 | } 257 | if (! hide_error) { 258 | $input.addClass('error'); 259 | $('#text').addClass('error'); 260 | } 261 | $input.addClass('set_error'); 262 | } 263 | var pos = $('#text').data('pos'); 264 | var is_metronom = $('#text').data('is_metronom') || $('#show_metronome').get(0).checked || $('#set_metronome').get(0).checked; 265 | if (isNaN(pos)) pos = 0; 266 | var posmetronome = 0; 267 | if (is_metronom && start != null && mode != 'words') { 268 | var now = (new Date()).getTime(); 269 | posmetronome = Math.floor(((now - start) / 1000 / 60) * metronome); 270 | } 271 | var text; 272 | if ($('#show_metronome').get(0).checked) { 273 | if (posmetronome > pos) { 274 | text = ''+nbsp(str1.substr(0, pos))+''+''+nbsp(str1.substr(pos, 1))+''+nbsp(str1.substr(pos+1, posmetronome - (pos + 1)))+''+nbsp(str1.substr(posmetronome)); 275 | } else { 276 | text = ''+nbsp(str1.substr(0, posmetronome))+''+nbsp(str1.substr(posmetronome, pos - posmetronome))+''+nbsp(str1.substr(pos, 1))+''+nbsp(str1.substr(pos + 1)); 277 | } 278 | } else { 279 | text = ''+nbsp(str1.substr(0, pos))+''+''+nbsp(str1.substr(pos, 1))+''+((posmetronome > pos + 1) ? ''+nbsp(str1.substr(pos+1, posmetronome - (pos + 1)))+''+nbsp(str1.substr(posmetronome)) : nbsp(str1.substr(pos+1))); 280 | } 281 | $('#text div:eq(0)').html(text); 282 | $input.data('prev', val); 283 | if (str1 != '' && start!=null && start!=0 && mode != 'words' && (posmetronome - pos) > 10 && $('#set_metronome').get(0).checked) { 284 | $('#text').data('is_metronom', false); 285 | $input.data('errors', 0); 286 | //$input.data('last', null); 287 | $input.val(''); 288 | } 289 | } 290 | function nbsp(text) { 291 | return text.replace(/ /g, ' '); 292 | } 293 | function set_metronome(checked) { 294 | if (checked) { 295 | $('#info_metronome').html(''); 296 | } else { 297 | $('#info_metronome').text(metronome); 298 | } 299 | } 300 | -------------------------------------------------------------------------------- /alpha/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Klavarog [Alpha] 6 | 7 | 8 | 128 | 207 | 208 | 209 |
210 | 211 |
212 |
213 |
214 |
215 | 216 |
217 | 218 |
219 |
220 |
`~
1!
2@
3#
4$
5%
6^
7&
8*
9(
0)
-_
=+
Back
221 |
Tab
Q
W
E
R
T
Y
U
I
O
P
[{
]}
\|
222 |
Caps
A
S
D
F
G
H
J
K
L
;:
'"
Enter
223 |
Shift
Z
X
C
V
B
N
M
,<
.>
/?
Shift
224 |
Ctrl
Win
Alt
Space
Alt
Win
Ctrl
225 |
226 | 233 | 240 | 241 |
242 | 243 |
244 | 250 | 255 |
256 | 257 |
258 | 259 | 261 | 262 |
263 | 264 | 265 | -------------------------------------------------------------------------------- /ie-css3.htc: -------------------------------------------------------------------------------- 1 | --Do not remove this if you are using-- 2 | Original Author: Remiz Rahnas 3 | Original Author URL: http://www.htmlremix.com 4 | Published date: 2008/09/24 5 | 6 | Changes by Nick Fetchak: 7 | - IE8 standards mode compatibility 8 | - VML elements now positioned behind original box rather than inside of it - should be less prone to breakage 9 | - Added partial support for 'box-shadow' style 10 | - Checks for VML support before doing anything 11 | - Updates VML element size and position via timer and also via window resize event 12 | - lots of other small things 13 | Published date : 2010/03/14 14 | http://fetchak.com/ie-css3 15 | 16 | Thanks to TheBrightLines.com (http://www.thebrightlines.com/2009/12/03/using-ies-filter-in-a-cross-browser-way) for enlightening me about the DropShadow filter 17 | 18 | 19 | 323 | 324 | --------------------------------------------------------------------------------