Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

just another first homework #2

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,12 @@
"body-parser": "^1.15.2",
"express": "^4.14.0",
"technologger": "1.0.0"
},
"devDependencies": {
"eslint": "^3.6.1",
"eslint-config-airbnb": "^12.0.0",
"eslint-plugin-import": "^1.16.0",
"eslint-plugin-jsx-a11y": "^2.2.2",
"eslint-plugin-react": "^6.3.0"
}
}
5 changes: 5 additions & 0 deletions public/css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ body {
padding: 20%;
box-sizing: border-box;
}

.form__warning {
color: red;
font-style: italic;
}
15 changes: 14 additions & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,22 @@
<link rel="stylesheet" href="/css/milligram.min.css"/>
<link rel="stylesheet" href="/css/main.css" />
<script src="lib.js"></script>
<script src="jquery-3.1.0.min.js"></script>
<script src="main.js"></script>
</head>
<body>
<h1>Hello, world</h1>
<h1 class="js-hello_message">Hello, world</h1>
<form action="/users" method="POST" onsubmit="onSubmit(this); return false;">
<input type="email" class="js-email_input" placeholder="Please enter your e-mail" required="true" name="email"></input>
<input type="text" class="js-name_input" placeholder="Please enter your name" required="true" name="user"></input>
<p><span class="js-select_lang">Please select your language: </span>
<select name="lang" class="js-lang" onchange="langChange();">
<option selected>en</option>
<option>ru</option>
<option>de</option>
</select>
</p>
<button type="submit">Submit</button>
</form>
</body>
</html>
71 changes: 71 additions & 0 deletions public/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
'use strict';

function langChange() {
switch ($('.js-lang')[0].value) {
case 'ru':
$('.js-email_input')[0].setAttribute('placeholder', 'Пожалуйста, введите e-mail');
$('.js-name_input')[0].setAttribute('placeholder', 'Пожалуйста, введите имя');
$('.js-select_lang').html('Выберите язык:');
break;
case 'de':
$('.js-email_input')[0].setAttribute('placeholder', 'Bitte geben Sie eine E-Mail-Adresse ein!');
$('.js-name_input')[0].setAttribute('placeholder', 'Bitte geben Sie Ihren Namen ein');
$('.js-select_lang').html('Bitte wähle eine Sprache:');
break;
default:
$('.js-email_input')[0].setAttribute('placeholder', 'Please enter your e-mail');
$('.js-name_input')[0].setAttribute('placeholder', 'Please enter your name');
$('.js-select_lang').html('Please select your language');
break;
}
}

function plural(n, lang) {
const pluralRules = {
en: 1,
ru: 7,
de: 1,
};
const pluralWords = {
en: ['time', 'times'],
ru: ['раз', 'раза', 'раз'],
de: ['mal', 'mal'],
};
const getPluralForm = function (rule) {
switch (rule) {
case 1:
return (n === 1) ? 0 : 1;
case 7:
if ([1, 11].indexOf(n) > -1) {
return 0;
}
if ([2, 3, 4].indexOf(n % 10) > -1 && (n < 12 || n > 14)) {
return 1;
}
return 2;
default:
return 0;
}
};
return pluralWords[lang][getPluralForm(pluralRules[lang])];
}

function helloText(user, email, lang) {
const n = request('/users', { email: email });
const message = {
en: `Hi ${user}! You have been here ${n} ${plural(n, lang)} already!`,
ru: `Привет, ${user}! Ты был здесь уже ${n} ${plural(n, lang)}!`,
de: `Hallo ${user}! Du warst hier schon ${n} ${plural(n,lang)}!`,
};
return message[lang];
}

function onSubmit(form) {
const user = form.elements.user.value;
const email = form.elements.email.value;
const lang = form.elements.lang.value ? form.elements.lang.value : 'en';
form.style.visibility = 'hidden';
$('.js-hello_message').html(helloText(user, email, lang));
}

exports.plural = plural;
24 changes: 15 additions & 9 deletions server.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
let express = require('express');
let technologger = require('technologger');
let parser = require('body-parser');
let app = express();
const express = require('express');
const technologger = require('technologger');
const parser = require('body-parser');

const app = express();

const userCount = {};

function userCountIncrement(email) {
userCount[email] = userCount[email] ? userCount[email] + 1 : 1;
}

app.use('/', express.static('public'));

app.use(parser.json());
app.use(technologger);

app.post('/users', (req, res, body) => {
console.log(body);
res.send('0');
// TODO: вернуть количество обращений
app.post('/users', (req, res) => {
userCountIncrement(req.body.email);
res.send(String(userCount[req.body.email]));
});

app.listen(process.env.PORT || 3000, () => {
console.log(`App started on port ${process.env.PORT || 3000}`);
console.log(`App started on port ${process.env.PORT || 3000}`);
});
26 changes: 18 additions & 8 deletions test.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,22 @@
let assert = require('assert');
let hello = require('./public/main').hello;
let plural = require('./public/main').plural;

assert.equal(hello('Test'), 'Привет, Test');
assert.equal(plural(0, 'en'), 'times');
assert.equal(plural(1, 'en'), 'time');
assert.equal(plural(2, 'en'), 'times');
assert.equal(plural(10, 'en'), 'times');
assert.equal(plural(990, 'en'), 'times');
assert.equal(plural(0, 'de'), 'mal');
assert.equal(plural(1, 'de'), 'mal');
assert.equal(plural(2, 'de'), 'mal');
assert.equal(plural(110, 'de'), 'mal');
assert.equal(plural(0, 'ru'), 'раз');
assert.equal(plural(1, 'ru'), 'раз');
assert.equal(plural(2, 'ru'), 'раза');
assert.equal(plural(11, 'ru'), 'раз');
assert.equal(plural(12, 'ru'), 'раз');
assert.equal(plural(13, 'ru'), 'раз');
assert.equal(plural(22, 'ru'), 'раза');
assert.equal(plural(14, 'ru'), 'раз');
assert.equal(plural(27, 'ru'), 'раз');

assert.equal(plural(0), 'Здравствуй, дух');
assert.equal(plural(1), 'Рады приветствовать на нашем курсе!');
assert.equal(plural(2), 'Кликай дальше!! Еще осталось 13 раз(а)');
assert.equal(plural(13), 'Кликай дальше!! Еще осталось 2 раз(а)');
assert.equal(plural(15), '01001000 01101001 00101100 00100000 01100010 01110010 01101111');
assert.equal(plural(100), '01001000 01101001 00101100 00100000 01100010 01110010 01101111');