├── .gitignore ├── README.md ├── build ├── css │ └── style.min.css ├── img │ ├── design-logo.png │ ├── favicon │ │ ├── 152.png │ │ ├── favicon.ico │ │ └── favicon.png │ └── social_img.png ├── js │ └── js.min.js └── material │ ├── material.min.css │ ├── material.min.css.map │ ├── material.min.js │ └── material.min.js.map ├── favicon.ico ├── gulpfile.js ├── imgs ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg └── README.md ├── index.html ├── package.json ├── screenshot.png └── sources ├── css ├── footer.styl ├── general.styl ├── icons.styl ├── result.styl └── style.styl ├── fonts └── fontello-427743df │ ├── LICENSE.txt │ ├── README.txt │ ├── config.json │ ├── css │ ├── animation.css │ ├── fontello-codes.css │ ├── fontello-embedded.css │ ├── fontello-ie7-codes.css │ ├── fontello-ie7.css │ └── fontello.css │ ├── demo.html │ └── font │ ├── fontello.eot │ ├── fontello.svg │ ├── fontello.ttf │ ├── fontello.woff │ └── fontello.woff2 ├── html └── index.jade ├── img ├── design-logo.png ├── favicon │ ├── 152.png │ ├── favicon.ico │ └── favicon.png └── social_img.png └── js ├── excuses.js ├── generator.js └── main.js /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | 3 | # Created by .ignore support plugin (hsz.mobi) 4 | ### Windows template 5 | # Windows image file caches 6 | Thumbs.db 7 | ehthumbs.db 8 | 9 | # Folder config file 10 | Desktop.ini 11 | 12 | # Recycle Bin used on file shares 13 | $RECYCLE.BIN/ 14 | 15 | # Windows Installer files 16 | *.cab 17 | *.msi 18 | *.msm 19 | *.msp 20 | 21 | # Windows shortcuts 22 | *.lnk 23 | ### JetBrains template 24 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio 25 | 26 | *.iml 27 | 28 | ## Directory-based project format: 29 | .idea/ 30 | # if you remove the above rule, at least ignore the following: 31 | 32 | # User-specific stuff: 33 | # .idea/workspace.xml 34 | # .idea/tasks.xml 35 | # .idea/dictionaries 36 | 37 | # Sensitive or high-churn files: 38 | # .idea/dataSources.ids 39 | # .idea/dataSources.xml 40 | # .idea/sqlDataSources.xml 41 | # .idea/dynamic.xml 42 | # .idea/uiDesigner.xml 43 | 44 | # Gradle: 45 | # .idea/gradle.xml 46 | # .idea/libraries 47 | 48 | # Mongo Explorer plugin: 49 | # .idea/mongoSettings.xml 50 | 51 | ## File-based project format: 52 | *.ipr 53 | *.iws 54 | 55 | ## Plugin-specific files: 56 | 57 | # IntelliJ 58 | /out/ 59 | 60 | # mpeltonen/sbt-idea plugin 61 | .idea_modules/ 62 | 63 | # JIRA plugin 64 | atlassian-ide-plugin.xml 65 | 66 | # Crashlytics plugin (for Android Studio and IntelliJ) 67 | com_crashlytics_export_strings.xml 68 | crashlytics.properties 69 | crashlytics-build.properties 70 | 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Генератор отговорок 2 | 3 | Вдохновлено постом в [Десигне](https://vk.com/wall-51016572_486907), на случай, если оригинальный пост будет удален - [смотрите здесь](./imgs/README.md) 4 | 5 | ## Суть 6 | 7 | [Сайт автоматически гененирует отмазку](https://lgg.github.io/excuse-generator/) 8 | 9 | ![ScreenShot](./screenshot.png) 10 | 11 | 12 | ## ToDo 13 | 14 | * добавить счетчик отмазок 15 | * добавить больше вариантов/отмазок 16 | * Есть выбор на "ты"/"вы" 17 | * трансформация имени в ласковое, если стоит "ты" 18 | 19 | * использовать урезанный material(взять только нужные компоненты) 20 | * запретить overscroll на ios -------------------------------------------------------------------------------- /build/css/style.min.css: -------------------------------------------------------------------------------- 1 | footer{-webkit-flex:0 0 auto;flex:0 0 auto}.mdl-mini-footer__link-list{color:#fff}@media (max-width:520px){.mdl-mini-footer__link-list{display:block!important}}.mdl-mini-footer__link-list a:hover{opacity:.7}.design-logo{width:80px;margin-left:5px} 2 | .flex-center,.flex-top{display:-webkit-flex!important}.flex-center{display:flex!important;-webkit-justify-content:center!important;justify-content:center!important;-webkit-align-items:center!important;align-items:center!important}.flex-top{display:flex!important;-webkit-justify-content:center;justify-content:center;-webkit-align-items:flex-start!important;align-items:flex-start!important}.flex-column{-webkit-flex-direction:column!important;flex-direction:column!important}.full-width{width:100%}.text-center{text-align:center}.flex{display:-webkit-flex!important;display:flex!important} 3 | @font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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AmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=) format('truetype')}.icon{font-family:fontello;font-style:normal;font-weight:400;width:24px;height:24px;margin-right:5px}.icon-github:before,.icon-star:before{font-family:fontello}.icon-github:before{content:'\e800'}.icon-star:before{content:'\e801'} 4 | @media (max-width:520px){.result-wrap .mdl-card{width:90%}}@media (min-width:520px){.result-wrap .mdl-card{width:60%}}@media (min-width:920px){.result-wrap .mdl-card{width:35%}}.result{padding:30px;font-size:130%;text-align:justify}.result-wrap{-webkit-flex:1 0 auto;flex:1 0 auto;padding-top:10px;padding-bottom:45px} 5 | *{position:relative}body{background:#fafafa}.mdl-card__actions{padding-bottom:16px!important}.main{-webkit-flex:1 1 auto;flex:1 1 auto}.main h1{-webkit-flex:0 0 auto;flex:0 0 auto} -------------------------------------------------------------------------------- /build/img/design-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/build/img/design-logo.png -------------------------------------------------------------------------------- /build/img/favicon/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/build/img/favicon/152.png -------------------------------------------------------------------------------- /build/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/build/img/favicon/favicon.ico -------------------------------------------------------------------------------- /build/img/favicon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/build/img/favicon/favicon.png -------------------------------------------------------------------------------- /build/img/social_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/build/img/social_img.png -------------------------------------------------------------------------------- /build/js/js.min.js: -------------------------------------------------------------------------------- 1 | 2 | var Excuses={names:["Друг","Товарищ","Заказчик","Приятель","Уважаемый начальник"],hello:["[name], привет","[name], здравствуй","[name], приветствую","[name], добрый день","[name], добрый вечер","[name], доброе утро","Здравствуй, [name]","Привет, [name]"],fail:["Самолет, в котором я летел, приземлился на запаснике в Новгороде","Я ехал в поезде, и кто-то сорвал стопкран, я резко упал и ударился головой, сейчас в больнице","Я поймал попутку, её остановила ГИБДД, и нашли крупную партию наркотиков. Сейчас я под следствием","Я вышел из дома, а дверь захлопнулась, я попытался залезть через балкон, но упал. Сейчас я в травмпункте, иду на поправку","Я шел по парку, и на меня напал бомж, он украл у меня кошелек и ключи от дома. Хорошо, хоть что не изнасиловал","У меня развалилась кровать во время сна, я повредил позвоночник. Сейчас иду на поправку","Я потерял паспорт","Я на похоронах был, последний дедушка умер","У меня рак нашли, я по больницам ездил","У меня рак печени, к сожалению, серьезно, я сейчас химиотерапию прохожу","Я потерял всё, что было в портмоне","Меня избили цыгане","Я просто в глуши был","Я просто был не в городе","Меня отправили по делам","Твой банк отклонил перевод","Мой счет заблокировали","Я потерял ноутбук","У меня сломался компьютер","Меня машина сбила","Я немного не успеваю","Я сейчас работаю по фрилансу","Скоро стартап окупится","Бабушка скоро пенсию получит","Деньги вернул твой банк, пишет отказ, проверь номер карты","Платеж на обработке","Платеж отклонен, буду ругаться с банком","Меня в армию забрали","У меня кошка рожала","У меня дочь родила","У меня молоко убежало","У меня квартира сгорела","Я недооценил задачу","Я недооценил масштаб задачи","Я столкнулся с непредвиденными сложностями"],action:["Я сделаю всё","Вышлю часть","Постараюсь","Доберусь и всё сделаю","Смогу сделать всё","Я закончу","Я доделаю","Я исправлю","Согласую всё","Объясню всё подробнее","Смогу отослать","Смогу решить этот вопрос","Смогу доделать","Смогу закончить","Сделаю перевод","Переведу","Приеду","Я лично встречусь с тобой","Я разберусь с этим","Я разгребу это","Решу всё","Отправлю","Скину","Доеду до дома","Приеду домой","Закрою этот вопрос","Попробую","Давай встретимся","Давай наличкой отдам"],date:["сейчас","завтра","завтра вечером","завтра днем","завтра утром","как можно быстрее","как можно скорее","наконец-то","чуть позже","позже","около 2 суток","в конце недели","в конце месяца","в конце дня","до конца следующей недели","до завтра","послезавтра","ближе к вечеру","ближе к утру","с утра","завтра крайний срок","на неделе","через пару дней","скоро","сразу","сейчас, в течение 3-4 дней"],general:["Хочу закрыть вопрос поскорее","Сам уже устал ждать","Я бы с радостью уже все сделал","Сам в шоке, что так всё получилось","Сам в шоке, что так всё затягивается","Сам не ожидал таких событий","Надо поскорее решить этот вопрос","Надо уже закрыть этот вопрос","Надо уже решить эту проблему","Я, конечно, очень извиняюсь, что так вышло"]}; 3 | 4 | var Generator={init:function(){},generate:function(name){var t=this;var text=[];var customName=!!name;if(!name){name=t.choose(Excuses.names)} 5 | text.push(t.insertName(t.choose(Excuses.hello),name,customName));text.push(t.choose(Excuses.fail));text.push(t.concat(t.choose(Excuses.action),t.choose(Excuses.date)));text.push(t.choose(Excuses.general));return t.concatAll(text);},insertName:function(str,name,customName){var nameComesFirst=/^.+\[name\]/.test(str);name=(nameComesFirst&&!customName)?name.toLowerCase():name;return str.replace('[name]',name);},needComma:function(str){var substring="как";return str.indexOf(substring)===0;},concat:function(str1,str2,separator){if(this.needComma(str2)){return str1+", "+str2;}else{if(separator){return str1+separator+" "+str2;}else{return str1+" "+str2;}}},concatAll:function(arr){var str="";arr.forEach(function(item,i){str+=item+". ";});return str;},choose:function(arr){return arr[getRandom(0,arr.length-1)];}};function getRandom(min,max){return Math.floor(Math.random()*(max-min+1))+min;} 6 | 7 | document.addEventListener('DOMContentLoaded',function(){var result=get("result"),name=get("name"),go=get("go");go.addEventListener("click",function(){generate();});document.body.addEventListener("keypress",function(event){if(event.which==13||event.keyCode==13){generate();}});function generate(){result.textContent=Generator.generate(name.value);}});function get(id){return document.getElementById(id);} -------------------------------------------------------------------------------- /build/material/material.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * material-design-lite - Material Design Components in CSS, JS and HTML 3 | * @version v1.1.3 4 | * @license Apache-2.0 5 | * @copyright 2015 Google, Inc. 6 | * @link https://github.com/google/material-design-lite 7 | */ 8 | !function(){"use strict";function e(e,t){if(e){if(t.element_.classList.contains(t.CssClasses_.MDL_JS_RIPPLE_EFFECT)){var s=document.createElement("span");s.classList.add(t.CssClasses_.MDL_RIPPLE_CONTAINER),s.classList.add(t.CssClasses_.MDL_JS_RIPPLE_EFFECT);var i=document.createElement("span");i.classList.add(t.CssClasses_.MDL_RIPPLE),s.appendChild(i),e.appendChild(s)}e.addEventListener("click",function(s){s.preventDefault();var i=e.href.split("#")[1],n=t.element_.querySelector("#"+i);t.resetTabState_(),t.resetPanelState_(),e.classList.add(t.CssClasses_.ACTIVE_CLASS),n.classList.add(t.CssClasses_.ACTIVE_CLASS)})}}function t(e,t,s,i){function n(){var n=e.href.split("#")[1],a=i.content_.querySelector("#"+n);i.resetTabState_(t),i.resetPanelState_(s),e.classList.add(i.CssClasses_.IS_ACTIVE),a.classList.add(i.CssClasses_.IS_ACTIVE)}if(i.tabBar_.classList.contains(i.CssClasses_.JS_RIPPLE_EFFECT)){var a=document.createElement("span");a.classList.add(i.CssClasses_.RIPPLE_CONTAINER),a.classList.add(i.CssClasses_.JS_RIPPLE_EFFECT);var l=document.createElement("span");l.classList.add(i.CssClasses_.RIPPLE),a.appendChild(l),e.appendChild(a)}e.addEventListener("click",function(t){"#"===e.getAttribute("href").charAt(0)&&(t.preventDefault(),n())}),e.show=n}var s={upgradeDom:function(e,t){},upgradeElement:function(e,t){},upgradeElements:function(e){},upgradeAllRegistered:function(){},registerUpgradedCallback:function(e,t){},register:function(e){},downgradeElements:function(e){}};s=function(){function e(e,t){for(var s=0;s_;_++){if(r=l[_],!r)throw new Error("Unable to find a registered component for the given class.");a.push(r.className),i.setAttribute("data-upgraded",a.join(","));var C=new r.classConstructor(i);C[p]=r,c.push(C);for(var u=0,E=r.callbacks.length;E>u;u++)r.callbacks[u](i);r.widget&&(i[r.className]=C);var m;"CustomEvent"in window&&"function"==typeof window.CustomEvent?m=new Event("mdl-componentupgraded",{bubbles:!0,cancelable:!1}):(m=document.createEvent("Events"),m.initEvent("mdl-componentupgraded",!0,!0)),i.dispatchEvent(m)}}function a(e){Array.isArray(e)||(e="function"==typeof e.item?Array.prototype.slice.call(e):[e]);for(var t,s=0,i=e.length;i>s;s++)t=e[s],t instanceof HTMLElement&&(n(t),t.children.length>0&&a(t.children))}function l(t){var s="undefined"==typeof t.widget&&"undefined"==typeof t.widget,i=!0;s||(i=t.widget||t.widget);var n={classConstructor:t.constructor||t.constructor,className:t.classAsString||t.classAsString,cssClass:t.cssClass||t.cssClass,widget:i,callbacks:[]};if(h.forEach(function(e){if(e.cssClass===n.cssClass)throw new Error("The provided cssClass has already been registered: "+e.cssClass);if(e.className===n.className)throw new Error("The provided className has already been registered")}),t.constructor.prototype.hasOwnProperty(p))throw new Error("MDL component classes must not have "+p+" defined as a property.");var a=e(t.classAsString,n);a||h.push(n)}function o(t,s){var i=e(t);i&&i.callbacks.push(s)}function r(){for(var e=0;e0&&this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)&&(e.keyCode===this.Keycodes_.UP_ARROW?(e.preventDefault(),t[t.length-1].focus()):e.keyCode===this.Keycodes_.DOWN_ARROW&&(e.preventDefault(),t[0].focus()))}},d.prototype.handleItemKeyboardEvent_=function(e){if(this.element_&&this.container_){var t=this.element_.querySelectorAll("."+this.CssClasses_.ITEM+":not([disabled])");if(t&&t.length>0&&this.container_.classList.contains(this.CssClasses_.IS_VISIBLE)){var s=Array.prototype.slice.call(t).indexOf(e.target);if(e.keyCode===this.Keycodes_.UP_ARROW)e.preventDefault(),s>0?t[s-1].focus():t[t.length-1].focus();else if(e.keyCode===this.Keycodes_.DOWN_ARROW)e.preventDefault(),t.length>s+1?t[s+1].focus():t[0].focus();else if(e.keyCode===this.Keycodes_.SPACE||e.keyCode===this.Keycodes_.ENTER){e.preventDefault();var i=new MouseEvent("mousedown");e.target.dispatchEvent(i),i=new MouseEvent("mouseup"),e.target.dispatchEvent(i),e.target.click()}else e.keyCode===this.Keycodes_.ESCAPE&&(e.preventDefault(),this.hide())}}},d.prototype.handleItemClick_=function(e){e.target.hasAttribute("disabled")?e.stopPropagation():(this.closing_=!0,window.setTimeout(function(e){this.hide(),this.closing_=!1}.bind(this),this.Constant_.CLOSE_TIMEOUT))},d.prototype.applyClip_=function(e,t){this.element_.classList.contains(this.CssClasses_.UNALIGNED)?this.element_.style.clip="":this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)?this.element_.style.clip="rect(0 "+t+"px 0 "+t+"px)":this.element_.classList.contains(this.CssClasses_.TOP_LEFT)?this.element_.style.clip="rect("+e+"px 0 "+e+"px 0)":this.element_.classList.contains(this.CssClasses_.TOP_RIGHT)?this.element_.style.clip="rect("+e+"px "+t+"px "+e+"px "+t+"px)":this.element_.style.clip=""},d.prototype.removeAnimationEndListener_=function(e){e.target.classList.remove(d.prototype.CssClasses_.IS_ANIMATING)},d.prototype.addAnimationEndListener_=function(){this.element_.addEventListener("transitionend",this.removeAnimationEndListener_),this.element_.addEventListener("webkitTransitionEnd",this.removeAnimationEndListener_)},d.prototype.show=function(e){if(this.element_&&this.container_&&this.outline_){var t=this.element_.getBoundingClientRect().height,s=this.element_.getBoundingClientRect().width;this.container_.style.width=s+"px",this.container_.style.height=t+"px",this.outline_.style.width=s+"px",this.outline_.style.height=t+"px";for(var i=this.Constant_.TRANSITION_DURATION_SECONDS*this.Constant_.TRANSITION_DURATION_FRACTION,n=this.element_.querySelectorAll("."+this.CssClasses_.ITEM),a=0;a0&&this.showSnackbar(this.queuedNotifications_.shift())},C.prototype.cleanup_=function(){this.element_.classList.remove(this.cssClasses_.ACTIVE),setTimeout(function(){this.element_.setAttribute("aria-hidden","true"),this.textElement_.textContent="",Boolean(this.actionElement_.getAttribute("aria-hidden"))||(this.setActionHidden_(!0),this.actionElement_.textContent="",this.actionElement_.removeEventListener("click",this.actionHandler_)),this.actionHandler_=void 0,this.message_=void 0,this.actionText_=void 0,this.active=!1,this.checkQueue_()}.bind(this),this.Constant_.ANIMATION_LENGTH)},C.prototype.setActionHidden_=function(e){e?this.actionElement_.setAttribute("aria-hidden","true"):this.actionElement_.removeAttribute("aria-hidden")},s.register({constructor:C,classAsString:"MaterialSnackbar",cssClass:"mdl-js-snackbar",widget:!0});var u=function(e){this.element_=e,this.init()};window.MaterialSpinner=u,u.prototype.Constant_={MDL_SPINNER_LAYER_COUNT:4},u.prototype.CssClasses_={MDL_SPINNER_LAYER:"mdl-spinner__layer",MDL_SPINNER_CIRCLE_CLIPPER:"mdl-spinner__circle-clipper",MDL_SPINNER_CIRCLE:"mdl-spinner__circle",MDL_SPINNER_GAP_PATCH:"mdl-spinner__gap-patch",MDL_SPINNER_LEFT:"mdl-spinner__left",MDL_SPINNER_RIGHT:"mdl-spinner__right"},u.prototype.createLayer=function(e){var t=document.createElement("div");t.classList.add(this.CssClasses_.MDL_SPINNER_LAYER),t.classList.add(this.CssClasses_.MDL_SPINNER_LAYER+"-"+e);var s=document.createElement("div");s.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER),s.classList.add(this.CssClasses_.MDL_SPINNER_LEFT);var i=document.createElement("div");i.classList.add(this.CssClasses_.MDL_SPINNER_GAP_PATCH);var n=document.createElement("div");n.classList.add(this.CssClasses_.MDL_SPINNER_CIRCLE_CLIPPER),n.classList.add(this.CssClasses_.MDL_SPINNER_RIGHT);for(var a=[s,i,n],l=0;l=this.maxRows&&e.preventDefault()},L.prototype.onFocus_=function(e){this.element_.classList.add(this.CssClasses_.IS_FOCUSED)},L.prototype.onBlur_=function(e){this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)},L.prototype.onReset_=function(e){this.updateClasses_()},L.prototype.updateClasses_=function(){this.checkDisabled(),this.checkValidity(),this.checkDirty(),this.checkFocus()},L.prototype.checkDisabled=function(){this.input_.disabled?this.element_.classList.add(this.CssClasses_.IS_DISABLED):this.element_.classList.remove(this.CssClasses_.IS_DISABLED)},L.prototype.checkDisabled=L.prototype.checkDisabled,L.prototype.checkFocus=function(){Boolean(this.element_.querySelector(":focus"))?this.element_.classList.add(this.CssClasses_.IS_FOCUSED):this.element_.classList.remove(this.CssClasses_.IS_FOCUSED)},L.prototype.checkFocus=L.prototype.checkFocus,L.prototype.checkValidity=function(){this.input_.validity&&(this.input_.validity.valid?this.element_.classList.remove(this.CssClasses_.IS_INVALID):this.element_.classList.add(this.CssClasses_.IS_INVALID))},L.prototype.checkValidity=L.prototype.checkValidity,L.prototype.checkDirty=function(){this.input_.value&&this.input_.value.length>0?this.element_.classList.add(this.CssClasses_.IS_DIRTY):this.element_.classList.remove(this.CssClasses_.IS_DIRTY)},L.prototype.checkDirty=L.prototype.checkDirty,L.prototype.disable=function(){this.input_.disabled=!0,this.updateClasses_()},L.prototype.disable=L.prototype.disable,L.prototype.enable=function(){this.input_.disabled=!1,this.updateClasses_()},L.prototype.enable=L.prototype.enable,L.prototype.change=function(e){this.input_.value=e||"",this.updateClasses_()},L.prototype.change=L.prototype.change,L.prototype.init=function(){if(this.element_&&(this.label_=this.element_.querySelector("."+this.CssClasses_.LABEL),this.input_=this.element_.querySelector("."+this.CssClasses_.INPUT),this.input_)){this.input_.hasAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE)&&(this.maxRows=parseInt(this.input_.getAttribute(this.Constant_.MAX_ROWS_ATTRIBUTE),10),isNaN(this.maxRows)&&(this.maxRows=this.Constant_.NO_MAX_ROWS)),this.input_.hasAttribute("placeholder")&&this.element_.classList.add(this.CssClasses_.HAS_PLACEHOLDER),this.boundUpdateClassesHandler=this.updateClasses_.bind(this),this.boundFocusHandler=this.onFocus_.bind(this),this.boundBlurHandler=this.onBlur_.bind(this),this.boundResetHandler=this.onReset_.bind(this),this.input_.addEventListener("input",this.boundUpdateClassesHandler),this.input_.addEventListener("focus",this.boundFocusHandler),this.input_.addEventListener("blur",this.boundBlurHandler),this.input_.addEventListener("reset",this.boundResetHandler),this.maxRows!==this.Constant_.NO_MAX_ROWS&&(this.boundKeyDownHandler=this.onKeyDown_.bind(this),this.input_.addEventListener("keydown",this.boundKeyDownHandler));var e=this.element_.classList.contains(this.CssClasses_.IS_INVALID);this.updateClasses_(),this.element_.classList.add(this.CssClasses_.IS_UPGRADED),e&&this.element_.classList.add(this.CssClasses_.IS_INVALID),this.input_.hasAttribute("autofocus")&&(this.element_.focus(),this.checkFocus())}},s.register({constructor:L,classAsString:"MaterialTextfield",cssClass:"mdl-js-textfield",widget:!0});var I=function(e){this.element_=e,this.init()};window.MaterialTooltip=I,I.prototype.Constant_={},I.prototype.CssClasses_={IS_ACTIVE:"is-active",BOTTOM:"mdl-tooltip--bottom",LEFT:"mdl-tooltip--left",RIGHT:"mdl-tooltip--right",TOP:"mdl-tooltip--top"},I.prototype.handleMouseEnter_=function(e){var t=e.target.getBoundingClientRect(),s=t.left+t.width/2,i=t.top+t.height/2,n=-1*(this.element_.offsetWidth/2),a=-1*(this.element_.offsetHeight/2);this.element_.classList.contains(this.CssClasses_.LEFT)||this.element_.classList.contains(this.CssClasses_.RIGHT)?(s=t.width/2,0>i+a?(this.element_.style.top=0,this.element_.style.marginTop=0):(this.element_.style.top=i+"px",this.element_.style.marginTop=a+"px")):0>s+n?(this.element_.style.left=0,this.element_.style.marginLeft=0):(this.element_.style.left=s+"px",this.element_.style.marginLeft=n+"px"),this.element_.classList.contains(this.CssClasses_.TOP)?this.element_.style.top=t.top-this.element_.offsetHeight-10+"px":this.element_.classList.contains(this.CssClasses_.RIGHT)?this.element_.style.left=t.left+t.width+10+"px":this.element_.classList.contains(this.CssClasses_.LEFT)?this.element_.style.left=t.left-this.element_.offsetWidth-10+"px":this.element_.style.top=t.top+t.height+10+"px",this.element_.classList.add(this.CssClasses_.IS_ACTIVE)},I.prototype.handleMouseLeave_=function(){this.element_.classList.remove(this.CssClasses_.IS_ACTIVE)},I.prototype.init=function(){if(this.element_){var e=this.element_.getAttribute("for");e&&(this.forElement_=document.getElementById(e)),this.forElement_&&(this.forElement_.hasAttribute("tabindex")||this.forElement_.setAttribute("tabindex","0"),this.boundMouseEnterHandler=this.handleMouseEnter_.bind(this),this.boundMouseLeaveHandler=this.handleMouseLeave_.bind(this),this.forElement_.addEventListener("mouseenter",this.boundMouseEnterHandler,!1),this.forElement_.addEventListener("touchend",this.boundMouseEnterHandler,!1),this.forElement_.addEventListener("mouseleave",this.boundMouseLeaveHandler,!1),window.addEventListener("touchstart",this.boundMouseLeaveHandler))}},s.register({constructor:I,classAsString:"MaterialTooltip",cssClass:"mdl-tooltip"});var f=function(e){this.element_=e,this.init()};window.MaterialLayout=f,f.prototype.Constant_={MAX_WIDTH:"(max-width: 1024px)",TAB_SCROLL_PIXELS:100,RESIZE_TIMEOUT:100,MENU_ICON:"",CHEVRON_LEFT:"chevron_left",CHEVRON_RIGHT:"chevron_right"},f.prototype.Keycodes_={ENTER:13,ESCAPE:27,SPACE:32},f.prototype.Mode_={STANDARD:0,SEAMED:1,WATERFALL:2,SCROLL:3},f.prototype.CssClasses_={CONTAINER:"mdl-layout__container",HEADER:"mdl-layout__header",DRAWER:"mdl-layout__drawer",CONTENT:"mdl-layout__content",DRAWER_BTN:"mdl-layout__drawer-button",ICON:"material-icons",JS_RIPPLE_EFFECT:"mdl-js-ripple-effect",RIPPLE_CONTAINER:"mdl-layout__tab-ripple-container",RIPPLE:"mdl-ripple",RIPPLE_IGNORE_EVENTS:"mdl-js-ripple-effect--ignore-events",HEADER_SEAMED:"mdl-layout__header--seamed",HEADER_WATERFALL:"mdl-layout__header--waterfall",HEADER_SCROLL:"mdl-layout__header--scroll",FIXED_HEADER:"mdl-layout--fixed-header",OBFUSCATOR:"mdl-layout__obfuscator",TAB_BAR:"mdl-layout__tab-bar",TAB_CONTAINER:"mdl-layout__tab-bar-container",TAB:"mdl-layout__tab",TAB_BAR_BUTTON:"mdl-layout__tab-bar-button",TAB_BAR_LEFT_BUTTON:"mdl-layout__tab-bar-left-button",TAB_BAR_RIGHT_BUTTON:"mdl-layout__tab-bar-right-button",PANEL:"mdl-layout__tab-panel",HAS_DRAWER:"has-drawer",HAS_TABS:"has-tabs",HAS_SCROLLING_HEADER:"has-scrolling-header",CASTING_SHADOW:"is-casting-shadow",IS_COMPACT:"is-compact",IS_SMALL_SCREEN:"is-small-screen",IS_DRAWER_OPEN:"is-visible",IS_ACTIVE:"is-active",IS_UPGRADED:"is-upgraded",IS_ANIMATING:"is-animating",ON_LARGE_SCREEN:"mdl-layout--large-screen-only",ON_SMALL_SCREEN:"mdl-layout--small-screen-only"},f.prototype.contentScrollHandler_=function(){if(!this.header_.classList.contains(this.CssClasses_.IS_ANIMATING)){var e=!this.element_.classList.contains(this.CssClasses_.IS_SMALL_SCREEN)||this.element_.classList.contains(this.CssClasses_.FIXED_HEADER);this.content_.scrollTop>0&&!this.header_.classList.contains(this.CssClasses_.IS_COMPACT)?(this.header_.classList.add(this.CssClasses_.CASTING_SHADOW),this.header_.classList.add(this.CssClasses_.IS_COMPACT),e&&this.header_.classList.add(this.CssClasses_.IS_ANIMATING)):this.content_.scrollTop<=0&&this.header_.classList.contains(this.CssClasses_.IS_COMPACT)&&(this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW),this.header_.classList.remove(this.CssClasses_.IS_COMPACT),e&&this.header_.classList.add(this.CssClasses_.IS_ANIMATING))}},f.prototype.keyboardEventHandler_=function(e){e.keyCode===this.Keycodes_.ESCAPE&&this.drawer_.classList.contains(this.CssClasses_.IS_DRAWER_OPEN)&&this.toggleDrawer()},f.prototype.screenSizeHandler_=function(){this.screenSizeMediaQuery_.matches?this.element_.classList.add(this.CssClasses_.IS_SMALL_SCREEN):(this.element_.classList.remove(this.CssClasses_.IS_SMALL_SCREEN),this.drawer_&&(this.drawer_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN),this.obfuscator_.classList.remove(this.CssClasses_.IS_DRAWER_OPEN)))},f.prototype.drawerToggleHandler_=function(e){if(e&&"keydown"===e.type){if(e.keyCode!==this.Keycodes_.SPACE&&e.keyCode!==this.Keycodes_.ENTER)return;e.preventDefault()}this.toggleDrawer()},f.prototype.headerTransitionEndHandler_=function(){this.header_.classList.remove(this.CssClasses_.IS_ANIMATING)},f.prototype.headerClickHandler_=function(){this.header_.classList.contains(this.CssClasses_.IS_COMPACT)&&(this.header_.classList.remove(this.CssClasses_.IS_COMPACT),this.header_.classList.add(this.CssClasses_.IS_ANIMATING))},f.prototype.resetTabState_=function(e){for(var t=0;ta;a++){var l=i[a];l.classList&&l.classList.contains(this.CssClasses_.HEADER)&&(this.header_=l),l.classList&&l.classList.contains(this.CssClasses_.DRAWER)&&(this.drawer_=l),l.classList&&l.classList.contains(this.CssClasses_.CONTENT)&&(this.content_=l)}window.addEventListener("pageshow",function(e){e.persisted&&(this.element_.style.overflowY="hidden",requestAnimationFrame(function(){this.element_.style.overflowY=""}.bind(this)))}.bind(this),!1),this.header_&&(this.tabBar_=this.header_.querySelector("."+this.CssClasses_.TAB_BAR));var o=this.Mode_.STANDARD;if(this.header_&&(this.header_.classList.contains(this.CssClasses_.HEADER_SEAMED)?o=this.Mode_.SEAMED:this.header_.classList.contains(this.CssClasses_.HEADER_WATERFALL)?(o=this.Mode_.WATERFALL,this.header_.addEventListener("transitionend",this.headerTransitionEndHandler_.bind(this)),this.header_.addEventListener("click",this.headerClickHandler_.bind(this))):this.header_.classList.contains(this.CssClasses_.HEADER_SCROLL)&&(o=this.Mode_.SCROLL,e.classList.add(this.CssClasses_.HAS_SCROLLING_HEADER)),o===this.Mode_.STANDARD?(this.header_.classList.add(this.CssClasses_.CASTING_SHADOW),this.tabBar_&&this.tabBar_.classList.add(this.CssClasses_.CASTING_SHADOW)):o===this.Mode_.SEAMED||o===this.Mode_.SCROLL?(this.header_.classList.remove(this.CssClasses_.CASTING_SHADOW),this.tabBar_&&this.tabBar_.classList.remove(this.CssClasses_.CASTING_SHADOW)):o===this.Mode_.WATERFALL&&(this.content_.addEventListener("scroll",this.contentScrollHandler_.bind(this)),this.contentScrollHandler_())),this.drawer_){var r=this.element_.querySelector("."+this.CssClasses_.DRAWER_BTN);if(!r){r=document.createElement("div"),r.setAttribute("aria-expanded","false"),r.setAttribute("role","button"),r.setAttribute("tabindex","0"),r.classList.add(this.CssClasses_.DRAWER_BTN);var _=document.createElement("i");_.classList.add(this.CssClasses_.ICON),_.innerHTML=this.Constant_.MENU_ICON,r.appendChild(_)}this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)?r.classList.add(this.CssClasses_.ON_LARGE_SCREEN):this.drawer_.classList.contains(this.CssClasses_.ON_SMALL_SCREEN)&&r.classList.add(this.CssClasses_.ON_SMALL_SCREEN),r.addEventListener("click",this.drawerToggleHandler_.bind(this)),r.addEventListener("keydown",this.drawerToggleHandler_.bind(this)),this.element_.classList.add(this.CssClasses_.HAS_DRAWER),this.element_.classList.contains(this.CssClasses_.FIXED_HEADER)?this.header_.insertBefore(r,this.header_.firstChild):this.element_.insertBefore(r,this.content_);var d=document.createElement("div");d.classList.add(this.CssClasses_.OBFUSCATOR),this.element_.appendChild(d),d.addEventListener("click",this.drawerToggleHandler_.bind(this)),this.obfuscator_=d,this.drawer_.addEventListener("keydown",this.keyboardEventHandler_.bind(this)),this.drawer_.setAttribute("aria-hidden","true")}if(this.screenSizeMediaQuery_=window.matchMedia(this.Constant_.MAX_WIDTH),this.screenSizeMediaQuery_.addListener(this.screenSizeHandler_.bind(this)),this.screenSizeHandler_(),this.header_&&this.tabBar_){this.element_.classList.add(this.CssClasses_.HAS_TABS);var h=document.createElement("div");h.classList.add(this.CssClasses_.TAB_CONTAINER),this.header_.insertBefore(h,this.tabBar_),this.header_.removeChild(this.tabBar_);var c=document.createElement("div");c.classList.add(this.CssClasses_.TAB_BAR_BUTTON),c.classList.add(this.CssClasses_.TAB_BAR_LEFT_BUTTON);var p=document.createElement("i");p.classList.add(this.CssClasses_.ICON),p.textContent=this.Constant_.CHEVRON_LEFT,c.appendChild(p),c.addEventListener("click",function(){this.tabBar_.scrollLeft-=this.Constant_.TAB_SCROLL_PIXELS}.bind(this));var C=document.createElement("div");C.classList.add(this.CssClasses_.TAB_BAR_BUTTON),C.classList.add(this.CssClasses_.TAB_BAR_RIGHT_BUTTON);var u=document.createElement("i");u.classList.add(this.CssClasses_.ICON),u.textContent=this.Constant_.CHEVRON_RIGHT,C.appendChild(u),C.addEventListener("click",function(){this.tabBar_.scrollLeft+=this.Constant_.TAB_SCROLL_PIXELS}.bind(this)),h.appendChild(c),h.appendChild(this.tabBar_),h.appendChild(C);var E=function(){this.tabBar_.scrollLeft>0?c.classList.add(this.CssClasses_.IS_ACTIVE):c.classList.remove(this.CssClasses_.IS_ACTIVE),this.tabBar_.scrollLeft0)return;this.setFrameCount(1);var i,n,a=e.currentTarget.getBoundingClientRect();if(0===e.clientX&&0===e.clientY)i=Math.round(a.width/2),n=Math.round(a.height/2);else{var l=e.clientX?e.clientX:e.touches[0].clientX,o=e.clientY?e.clientY:e.touches[0].clientY;i=Math.round(l-a.left),n=Math.round(o-a.top)}this.setRippleXY(i,n),this.setRippleStyles(!0),window.requestAnimationFrame(this.animFrameHandler.bind(this))}},y.prototype.upHandler_=function(e){e&&2!==e.detail&&window.setTimeout(function(){this.rippleElement_.classList.remove(this.CssClasses_.IS_VISIBLE)}.bind(this),0)},y.prototype.init=function(){if(this.element_){var e=this.element_.classList.contains(this.CssClasses_.RIPPLE_CENTER);this.element_.classList.contains(this.CssClasses_.RIPPLE_EFFECT_IGNORE_EVENTS)||(this.rippleElement_=this.element_.querySelector("."+this.CssClasses_.RIPPLE),this.frameCount_=0,this.rippleSize_=0,this.x_=0,this.y_=0,this.ignoringMouseDown_=!1,this.boundDownHandler=this.downHandler_.bind(this),this.element_.addEventListener("mousedown",this.boundDownHandler),this.element_.addEventListener("touchstart",this.boundDownHandler),this.boundUpHandler=this.upHandler_.bind(this),this.element_.addEventListener("mouseup",this.boundUpHandler),this.element_.addEventListener("mouseleave",this.boundUpHandler),this.element_.addEventListener("touchend",this.boundUpHandler),this.element_.addEventListener("blur",this.boundUpHandler),this.getFrameCount=function(){return this.frameCount_},this.setFrameCount=function(e){this.frameCount_=e},this.getRippleElement=function(){return this.rippleElement_},this.setRippleXY=function(e,t){this.x_=e,this.y_=t},this.setRippleStyles=function(t){if(null!==this.rippleElement_){var s,i,n,a="translate("+this.x_+"px, "+this.y_+"px)";t?(i=this.Constant_.INITIAL_SCALE,n=this.Constant_.INITIAL_SIZE):(i=this.Constant_.FINAL_SCALE,n=this.rippleSize_+"px",e&&(a="translate("+this.boundWidth/2+"px, "+this.boundHeight/2+"px)")),s="translate(-50%, -50%) "+a+i,this.rippleElement_.style.webkitTransform=s,this.rippleElement_.style.msTransform=s,this.rippleElement_.style.transform=s,t?this.rippleElement_.classList.remove(this.CssClasses_.IS_ANIMATING):this.rippleElement_.classList.add(this.CssClasses_.IS_ANIMATING)}},this.animFrameHandler=function(){this.frameCount_-- >0?window.requestAnimationFrame(this.animFrameHandler.bind(this)):this.setRippleStyles(!1)})}},s.register({constructor:y,classAsString:"MaterialRipple",cssClass:"mdl-js-ripple-effect",widget:!1})}(); 10 | //# sourceMappingURL=material.min.js.map 11 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/favicon.ico -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | /* Vars */ 2 | var gulp = require('gulp'), 3 | livereload = require('gulp-livereload'), 4 | cssmin = require('gulp-cssmin'), 5 | rename = require('gulp-rename'), 6 | jsmin = require('gulp-jsmin'), 7 | concat = require('gulp-concat'), 8 | autoprefixer = require('gulp-autoprefixer'), 9 | 10 | //optional 11 | imagemin = require('gulp-imagemin'), 12 | pngquant = require('imagemin-pngquant'), 13 | 14 | stylus = require('gulp-stylus'), 15 | //preprocess = require('gulp-preprocess'), 16 | jade = require('gulp-jade'); 17 | 18 | 19 | /* Sources */ 20 | var src_js = 'sources/js/**/*.js', 21 | src_css = 'sources/css/**/*.css', 22 | src_stylus = 'sources/css/**/*.styl', 23 | src_html = 'sources/html/**/*.html', 24 | src_img = 'sources/img/**/*', 25 | src_ico = 'sources/img/favicon/*.ico', 26 | src_jade = 'sources/html/**/*.jade', 27 | src_fonts = 'sources/fonts/**/*', 28 | src_material = 'node_modules/material-design-lite/material.min.*'; 29 | 30 | 31 | /* Destination folder */ 32 | var DEST = 'build/'; 33 | var dest_html = ""; // DEST + ''; 34 | 35 | 36 | /* Other */ 37 | var YOUR_LOCALS = {}; //for jade 38 | 39 | var browsers_ver = ['not ie <= 9', 'iOS > 7']; 40 | 41 | 42 | /* Tasks */ 43 | gulp.task('default', ['build', 'watch']); 44 | 45 | gulp.task('build', ['buildJs', 46 | 'buildCss', 47 | 'buildStylus', 48 | 'buildHtml', 49 | 'buildJade', 50 | //'buildFonts', 51 | 'buildImg', 52 | 'buildFavicon', 53 | 'buildMaterial' 54 | ]); 55 | 56 | 57 | // Watch Files For Changes 58 | gulp.task('watch', function () { 59 | livereload.listen(); //default web-server 60 | 61 | gulp.watch(src_js, ['reloadJs']); 62 | gulp.watch(src_css, ['reloadCss']); 63 | gulp.watch(src_stylus, ['reloadStylus']); 64 | gulp.watch(src_html, ['reloadHtml']); 65 | gulp.watch(src_jade, ['reloadJade']); 66 | gulp.watch(src_img, ['reloadImg']); 67 | gulp.watch(src_fonts, ['reloadFonts']); 68 | }); 69 | 70 | /* -------------------- Dependencies */ 71 | //Material 72 | gulp.task('buildMaterial', function () { 73 | gulp.src(src_material) 74 | .pipe(gulp.dest(DEST + 'material')) 75 | .pipe(livereload()); 76 | }); 77 | 78 | 79 | 80 | /* -------------------- JS */ 81 | //Reload 82 | gulp.task('reloadJs', function () { 83 | gulp.src(src_js) 84 | .pipe(concat("js.min.js")) 85 | .pipe(gulp.dest(DEST + 'js')) 86 | .pipe(livereload()); 87 | }); 88 | 89 | //Build 90 | gulp.task('buildJs', function () { 91 | gulp.src(src_js) 92 | .pipe(jsmin()) 93 | .pipe(rename({suffix: '.min'})) 94 | .pipe(concat("js.min.js")) 95 | .pipe(gulp.dest(DEST + 'js')) 96 | .pipe(livereload()); 97 | }); 98 | 99 | 100 | /* -------------------- CSS */ 101 | //Reload 102 | gulp.task('reloadCss', function () { 103 | gulp.src(src_css) 104 | .pipe(concat("css.min.css")) 105 | .pipe(gulp.dest(DEST + 'css')) 106 | .pipe(livereload()); 107 | }); 108 | 109 | //Build 110 | gulp.task('buildCss', function () { 111 | gulp.src(src_css) 112 | .pipe(autoprefixer({ 113 | browsers: browsers_ver, 114 | cascade: false 115 | })) 116 | .pipe(cssmin()) 117 | .pipe(concat("css.min.css")) 118 | .pipe(gulp.dest(DEST + 'css')) 119 | .pipe(livereload()); 120 | }); 121 | 122 | 123 | /* -------------------- Stylus */ 124 | //Reload 125 | gulp.task('reloadStylus', ['buildStylus']); 126 | 127 | //Build 128 | gulp.task('buildStylus', function () { 129 | gulp.src(src_stylus) 130 | .pipe(stylus()) 131 | .pipe(autoprefixer({ 132 | browsers: browsers_ver, 133 | cascade: false 134 | })) 135 | .pipe(cssmin()) 136 | .pipe(concat("style.min.css")) 137 | .pipe(gulp.dest(DEST + 'css')) 138 | .pipe(livereload()); 139 | }); 140 | 141 | 142 | /* -------------------- Html */ 143 | //Reload 144 | gulp.task('reloadHtml', function () { 145 | gulp.src(src_html) 146 | .pipe(gulp.dest(dest_html)) 147 | .pipe(livereload()); 148 | }); 149 | 150 | //Build 151 | gulp.task('buildHtml', ['reloadHtml']); 152 | //see jade 153 | 154 | 155 | /* -------------------- Jade */ 156 | //Reload 157 | gulp.task('reloadJade', function () { 158 | gulp.src(src_jade) 159 | .pipe(jade({ 160 | locals: YOUR_LOCALS, 161 | pretty: true 162 | })) 163 | .pipe(gulp.dest(dest_html)) 164 | .pipe(livereload()); 165 | }); 166 | 167 | //Build 168 | gulp.task('buildJade', function () { 169 | gulp.src(src_jade) 170 | .pipe(jade({ 171 | locals: YOUR_LOCALS 172 | })) 173 | .pipe(gulp.dest(dest_html)) 174 | .pipe(livereload()); 175 | }); 176 | 177 | 178 | /* -------------------- Images */ 179 | //Reload 180 | gulp.task('reloadImg', ['buildImg']); 181 | 182 | //Build 183 | gulp.task('buildImg', function () { 184 | gulp.src(src_img) 185 | .pipe(imagemin({ 186 | progressive: true, 187 | svgoPlugins: [{removeViewBox: false}], 188 | use: [pngquant()] 189 | })) 190 | .pipe(gulp.dest(DEST + 'img')) 191 | .pipe(livereload()); 192 | }); 193 | 194 | //Build 195 | gulp.task('buildFavicon', function () { 196 | gulp.src(src_ico) 197 | .pipe(gulp.dest(dest_html)) 198 | .pipe(livereload()); 199 | }); 200 | 201 | 202 | /* -------------------- Fonts */ 203 | //Reload 204 | gulp.task('reloadFonts', ['buildFonts']); 205 | 206 | //Build 207 | gulp.task('buildFonts', function () { 208 | gulp.src(src_fonts) 209 | .pipe(gulp.dest(DEST + 'fonts')) 210 | .pipe(livereload()); 211 | }); 212 | 213 | 214 | /* -------------------- Other */ 215 | //Gulp-preprocess example 216 | /* 217 | gulp.task('test-preprocess', function () { 218 | gulp.src('test.css') 219 | .pipe(preprocess({context: {RELEASE_TAG: 'here goes our replace'}})) 220 | .pipe(rename({suffix: '.b'})) 221 | .pipe(gulp.dest('')); 222 | });*/ 223 | -------------------------------------------------------------------------------- /imgs/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/imgs/1.jpg -------------------------------------------------------------------------------- /imgs/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/imgs/2.jpg -------------------------------------------------------------------------------- /imgs/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/imgs/3.jpg -------------------------------------------------------------------------------- /imgs/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/imgs/4.jpg -------------------------------------------------------------------------------- /imgs/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/imgs/5.jpg -------------------------------------------------------------------------------- /imgs/README.md: -------------------------------------------------------------------------------- 1 | # Оригинальный пост 2 | На случай, если в ВК он будет удален 3 | 4 | * ![1](./1.jpg) 5 | * ![2](./2.jpg) 6 | * ![3](./3.jpg) 7 | * ![4](./4.jpg) 8 | * ![5](./5.jpg) -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | Генератор отмазок

Генератор отмазок

Здесь будет отмазка
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "excuse-generator", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.html", 6 | "scripts": { 7 | "init": "mkdir -p sources\\img\\favicon && npm update --save && npm install", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/lgg/excuse-generator.git" 13 | }, 14 | "bugs": { 15 | "url": "https://github.com/lgg/excuse-generator/issues" 16 | }, 17 | "homepage": "https://lgg.github.io/excuse-generator", 18 | "author": "lgg", 19 | "license": "MIT", 20 | "dependencies": { 21 | "material-design-lite": "^1.1.3" 22 | }, 23 | "devDependencies": { 24 | "gulp": "*", 25 | "gulp-autoprefixer": "*", 26 | "gulp-concat": "*", 27 | "gulp-cssmin": "*", 28 | "gulp-imagemin": "*", 29 | "gulp-jade": "*", 30 | "gulp-jsmin": "*", 31 | "gulp-livereload": "*", 32 | "gulp-rename": "*", 33 | "gulp-stylus": "*", 34 | "imagemin-pngquant": "*" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/screenshot.png -------------------------------------------------------------------------------- /sources/css/footer.styl: -------------------------------------------------------------------------------- 1 | footer 2 | flex: 0 0 auto; 3 | 4 | .mdl-mini-footer__link-list 5 | color white 6 | @media (max-width: 520px) 7 | display block !important 8 | 9 | .mdl-mini-footer__link-list a:hover 10 | opacity .7 11 | 12 | .design-logo 13 | width 80px 14 | margin-left 5px -------------------------------------------------------------------------------- /sources/css/general.styl: -------------------------------------------------------------------------------- 1 | .flex-center 2 | display flex !important 3 | justify-content center !important 4 | align-items center !important 5 | 6 | .flex-top 7 | display flex !important 8 | justify-content center 9 | align-items flex-start !important 10 | 11 | .flex-column 12 | flex-direction column !important 13 | 14 | .full-width 15 | width 100% 16 | 17 | .text-center 18 | text-align center 19 | 20 | .flex 21 | display flex !important -------------------------------------------------------------------------------- /sources/css/icons.styl: -------------------------------------------------------------------------------- 1 | @font-face{ 2 | font-family: 'fontello'; 3 | src: url('data:application/octet-stream;base64,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') format('woff'), 4 | url('data:application/octet-stream;base64,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AmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); 5 | } 6 | 7 | .icon 8 | font-family: "fontello"; 9 | font-style: normal; 10 | font-weight: normal; 11 | width: 24px 12 | height 24px 13 | margin-right 5px 14 | 15 | .icon-github:before 16 | font-family: 'fontello'; 17 | content '\e800' 18 | 19 | .icon-star:before 20 | font-family: 'fontello'; 21 | content '\e801' -------------------------------------------------------------------------------- /sources/css/result.styl: -------------------------------------------------------------------------------- 1 | .result-wrap .mdl-card 2 | @media (max-width: 520px) 3 | width 90% 4 | @media (min-width: 520px) 5 | width 60% 6 | @media (min-width: 920px) 7 | width 35% 8 | 9 | .result 10 | padding 30px 11 | font-size 130% 12 | text-align justify 13 | 14 | .result-wrap 15 | flex 1 0 auto 16 | padding-top 10px 17 | padding-bottom 45px -------------------------------------------------------------------------------- /sources/css/style.styl: -------------------------------------------------------------------------------- 1 | * 2 | position: relative 3 | 4 | body 5 | background #FAFAFA 6 | 7 | //Overwrites 8 | .mdl-card__actions 9 | padding-bottom 16px !important 10 | 11 | .main 12 | flex: 1 1 auto; 13 | 14 | .main h1 15 | flex: 0 0 auto; -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Font license info 2 | 3 | 4 | ## Font Awesome 5 | 6 | Copyright (C) 2012 by Dave Gandy 7 | 8 | Author: Dave Gandy 9 | License: SIL () 10 | Homepage: http://fortawesome.github.com/Font-Awesome/ 11 | 12 | 13 | -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/README.txt: -------------------------------------------------------------------------------- 1 | This webfont is generated by http://fontello.com open source project. 2 | 3 | 4 | ================================================================================ 5 | Please, note, that you should obey original font licenses, used to make this 6 | webfont pack. Details available in LICENSE.txt file. 7 | 8 | - Usually, it's enough to publish content of LICENSE.txt file somewhere on your 9 | site in "About" section. 10 | 11 | - If your project is open-source, usually, it will be ok to make LICENSE.txt 12 | file publicly available in your repository. 13 | 14 | - Fonts, used in Fontello, don't require a clickable link on your site. 15 | But any kind of additional authors crediting is welcome. 16 | ================================================================================ 17 | 18 | 19 | Comments on archive content 20 | --------------------------- 21 | 22 | - /font/* - fonts in different formats 23 | 24 | - /css/* - different kinds of css, for all situations. Should be ok with 25 | twitter bootstrap. Also, you can skip style and assign icon classes 26 | directly to text elements, if you don't mind about IE7. 27 | 28 | - demo.html - demo file, to show your webfont content 29 | 30 | - LICENSE.txt - license info about source fonts, used to build your one. 31 | 32 | - config.json - keeps your settings. You can import it back into fontello 33 | anytime, to continue your work 34 | 35 | 36 | Why so many CSS files ? 37 | ----------------------- 38 | 39 | Because we like to fit all your needs :) 40 | 41 | - basic file, .css - is usually enough, it contains @font-face 42 | and character code definitions 43 | 44 | - *-ie7.css - if you need IE7 support, but still don't wish to put char codes 45 | directly into html 46 | 47 | - *-codes.css and *-ie7-codes.css - if you like to use your own @font-face 48 | rules, but still wish to benefit from css generation. That can be very 49 | convenient for automated asset build systems. When you need to update font - 50 | no need to manually edit files, just override old version with archive 51 | content. See fontello source code for examples. 52 | 53 | - *-embedded.css - basic css file, but with embedded WOFF font, to avoid 54 | CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. 55 | We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` 56 | server headers. But if you ok with dirty hack - this file is for you. Note, 57 | that data url moved to separate @font-face to avoid problems with 2 | 3 | 4 | 278 | 279 | 291 | 292 | 293 |
294 |

295 | fontello 296 | font demo 297 |

298 | 301 |
302 |
303 |
304 |
icon-github0xe800
305 |
icon-star0xe801
306 |
307 |
308 | 309 | 310 | -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/font/fontello.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/fonts/fontello-427743df/font/fontello.eot -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/font/fontello.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Copyright (C) 2016 by original authors @ fontello.com 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/font/fontello.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/fonts/fontello-427743df/font/fontello.ttf -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/font/fontello.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/fonts/fontello-427743df/font/fontello.woff -------------------------------------------------------------------------------- /sources/fonts/fontello-427743df/font/fontello.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/fonts/fontello-427743df/font/fontello.woff2 -------------------------------------------------------------------------------- /sources/html/index.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html(lang="ru") 3 | head 4 | title Генератор отмазок 5 | meta(charset="UTF-8") 6 | meta(content='width=device-width, initial-scale=1, maximum-scale=1', name='viewport') 7 | meta(name='description', 8 | content="Теперь не надо выдумывать самому") 9 | meta(name='keywords', 10 | content="Генератор отмазок, отмазки, отговорки, оправдания") 11 | link(rel='author', 12 | href='https://github.com/lgg') 13 | 14 | meta(property="og:type", 15 | content="website") 16 | meta(property="og:title", 17 | content="Генератор отмазок") 18 | meta(property="og:site_name", 19 | content="Генератор отмазок") 20 | meta(property="og:url", 21 | content="https://lgg.github.io/excuse-generator") 22 | meta(property="og:description", 23 | content="Теперь не надо выдумывать самому") 24 | meta(property="og:image", 25 | content="http://lgg.github.io/excuse-generator/build/img/social_img.png") 26 | meta(property="og:image:secure_url", 27 | content="https://lgg.github.io/excuse-generator/build/img/social_img.png") 28 | meta(property="og:image:type", 29 | content="image/png") 30 | meta(property="og:image:width", 31 | content="1200") 32 | meta(property="og:image:height", 33 | content="630") 34 | 35 | link(rel="shortcut icon", href="build/img/favicon/favicon.ico") 36 | link(rel="icon", sizes="16x16 32x32", href="build/img/favicon/favicon.ico") 37 | link(rel="apple-touch-icon-precomposed", href="build/img/favicon/152.png") 38 | 39 | link(rel='stylesheet', href='build/css/style.min.css') 40 | link(rel='stylesheet', href='build/material/material.min.css') 41 | 42 | script(type='text/javascript' src='build/js/js.min.js') 43 | script(type='text/javascript' src='build/material/material.min.js') 44 | body 45 | div.mdl-layout.mdl-js-layout 46 | div.mdl-layout__content.flex 47 | div.container.full-width.main.flex.flex-column 48 | h1.text-center Генератор отмазок 49 | div.result-wrap.flex-center.full-width 50 | div.mdl-card.mdl-shadow--2dp.card-result 51 | div.mdl-card__title.mdl-card--expand.flex-center 52 | div#result.result.mdl-typography--text-left Здесь будет отмазка 53 | div.mdl-card__actions.mdl-card--border.flex-center.flex-column 54 | div.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label 55 | input#name(type="text").mdl-textfield__input 56 | label(for="name").mdl-textfield__label Введите имя, от кого отмазываемся 57 | button#go.mdl-button.mdl-js-button.mdl-button--raised.mdl-js-ripple-effect.mdl-button--accent.mdl-color--blue-800 Получить отмазку 58 | footer.mdl-mini-footer.flex-center.text-center.full-width 59 | div.mdl-mini-footer__left-section 60 | ul.mdl-mini-footer__link-list.flex-column 61 | li 62 | a(href="https://vk.com/public51016572") 63 | img.design-logo(src="build/img/design-logo.png") 64 | li 65 | span.icon.icon-github 66 | a(href="https://github.com/lgg/excuse-generator") Исходный код на github -------------------------------------------------------------------------------- /sources/img/design-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/img/design-logo.png -------------------------------------------------------------------------------- /sources/img/favicon/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/img/favicon/152.png -------------------------------------------------------------------------------- /sources/img/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/img/favicon/favicon.ico -------------------------------------------------------------------------------- /sources/img/favicon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/img/favicon/favicon.png -------------------------------------------------------------------------------- /sources/img/social_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgg/excuse-generator/ab621aec33674453001731abe02ce3759300d4dc/sources/img/social_img.png -------------------------------------------------------------------------------- /sources/js/excuses.js: -------------------------------------------------------------------------------- 1 | var Excuses = { 2 | names: [ 3 | "Друг", 4 | "Товарищ", 5 | "Заказчик", 6 | "Приятель", 7 | "Уважаемый начальник" 8 | ], 9 | hello: [ 10 | "[name], привет", 11 | "[name], здравствуй", 12 | "[name], приветствую", 13 | "[name], добрый день", 14 | "[name], добрый вечер", 15 | "[name], доброе утро", 16 | "Здравствуй, [name]", 17 | "Привет, [name]" 18 | ], 19 | fail: [ 20 | "Самолет, в котором я летел, приземлился на запаснике в Новгороде", 21 | "Я ехал в поезде, и кто-то сорвал стоп-кран, я резко упал и ударился головой, сейчас в больнице", 22 | "Я поймал попутку, её остановила ГИБДД, и нашли крупную партию наркотиков. Сейчас я под следствием", 23 | "Я вышел из дома, а дверь захлопнулась, я попытался залезть через балкон, но упал. Сейчас я в травмпункте, иду на поправку", 24 | "Я шел по парку, и на меня напал бомж, он украл у меня кошелек и ключи от дома. Хорошо, хоть что не изнасиловал", 25 | "У меня развалилась кровать во время сна, я повредил позвоночник. Сейчас иду на поправку", 26 | "Я потерял паспорт", 27 | "Я на похоронах был, последний дедушка умер", 28 | "У меня рак нашли, я по больницам ездил", 29 | "У меня рак печени, к сожалению, серьезно, я сейчас химиотерапию прохожу", 30 | "Я потерял всё, что было в портмоне", 31 | "Меня избили цыгане", 32 | "Я просто в глуши был", 33 | "Я просто был не в городе", 34 | "Меня отправили по делам", 35 | "Твой банк отклонил перевод", 36 | "Мой счет заблокировали", 37 | "Я потерял ноутбук", 38 | "У меня сломался компьютер", 39 | "У меня полетел Windows", 40 | "Меня машина сбила", 41 | "Я немного не успеваю", 42 | "Я сейчас работаю по фрилансу", 43 | "Скоро стартап окупится", 44 | "Бабушка скоро пенсию получит", 45 | "Деньги вернул твой банк, пишет отказ, проверь номер карты", 46 | "Платеж на обработке", 47 | "Платеж отклонен, буду ругаться с банком", 48 | "Меня в армию забрали", 49 | "У меня кошка рожала", 50 | "У меня дочь родила", 51 | "У меня молоко убежало", 52 | "У меня квартира сгорела", 53 | "Я недооценил задачу", 54 | "Я недооценил масштаб задачи", 55 | "Я столкнулся с непредвиденными сложностями", 56 | "Мою собаку внезапно кастрировали и я должен о ней позаботиться" 57 | ], 58 | action: [ 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 | date: [ 90 | "сейчас", 91 | "завтра", 92 | "завтра вечером", 93 | "завтра днем", 94 | "завтра утром", 95 | "как можно быстрее", 96 | "как можно скорее", 97 | "наконец-то", 98 | "чуть позже", 99 | "позже", 100 | "в течение 2 суток", 101 | "в конце недели", 102 | "в конце месяца", 103 | "в конце дня", 104 | "до конца следующей недели", 105 | "до завтра", 106 | "послезавтра", 107 | "ближе к вечеру", 108 | "ближе к утру", 109 | "с утра", 110 | "в крайнем случае завтра", 111 | "на неделе", 112 | "через пару дней", 113 | "скоро", 114 | "сразу", 115 | "сейчас, в течение 3-4 дней" 116 | ], 117 | general: [ 118 | "Хочу закрыть вопрос поскорее", 119 | "Сам уже устал ждать", 120 | "Я бы с радостью уже все сделал", 121 | "Сам в шоке, что так всё получилось", 122 | "Сам в шоке, что так всё затягивается", 123 | "Сам не ожидал таких событий", 124 | "Надо поскорее решить этот вопрос", 125 | "Надо уже закрыть этот вопрос", 126 | "Надо уже решить эту проблему", 127 | "Я, конечно, очень извиняюсь, что так вышло" 128 | ] 129 | }; -------------------------------------------------------------------------------- /sources/js/generator.js: -------------------------------------------------------------------------------- 1 | var Generator = { 2 | init: function () { 3 | 4 | }, 5 | generate: function (name) { 6 | var t = this; 7 | var text = []; 8 | var customName = !!name; 9 | //Check if we have empty name 10 | if(!name){ 11 | name = t.choose(Excuses.names) 12 | } 13 | 14 | //Get hello part 15 | text.push( 16 | t.insertName(t.choose(Excuses.hello), name, customName) 17 | ); 18 | 19 | //Get fail 20 | text.push( 21 | t.choose(Excuses.fail) 22 | ); 23 | 24 | //Get action and date 25 | text.push( 26 | t.concat(t.choose(Excuses.action), t.choose(Excuses.date)) 27 | ); 28 | 29 | //Get last part 30 | text.push( 31 | t.choose(Excuses.general) 32 | ); 33 | 34 | //Create single string 35 | return t.concatAll(text); 36 | }, 37 | insertName: function (str, name, customName) { 38 | var nameComesFirst = /^.+\[name\]/.test(str); 39 | name = (nameComesFirst && !customName) ? name.toLowerCase() : name; 40 | return str.replace('[name]', name); 41 | }, 42 | concat: function (str1, str2, separator) { 43 | if (separator) { 44 | return str1 + separator + " " + str2; 45 | } else { 46 | return str1 + " " + str2; 47 | } 48 | }, 49 | concatAll: function (arr) { 50 | var str = ""; 51 | arr.forEach(function (item, i) { 52 | str += item + ". "; 53 | }); 54 | return str; 55 | }, 56 | choose: function (arr) { 57 | return arr[getRandom(0, arr.length - 1)]; 58 | } 59 | }; 60 | 61 | function getRandom(min, max) { 62 | return Math.floor(Math.random() * (max - min + 1)) + min; 63 | } 64 | -------------------------------------------------------------------------------- /sources/js/main.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', function () { 2 | var result = get("result"), 3 | name = get("name"), 4 | go = get("go"); 5 | 6 | //Generate button 7 | go.addEventListener("click", function(){ 8 | generate(); 9 | }); 10 | 11 | //On enter press 12 | document.body.addEventListener("keypress", function(event){ 13 | if (event.which == 13 || event.keyCode == 13) { 14 | generate(); 15 | } 16 | }); 17 | 18 | //Generator function 19 | function generate(){ 20 | result.textContent = Generator.generate(name.value); 21 | } 22 | }); 23 | 24 | //I'm too lazy 25 | function get(id){ 26 | return document.getElementById(id); 27 | } --------------------------------------------------------------------------------