diff --git a/index.html b/index.html index a179d2f..5bc8e48 100644 --- a/index.html +++ b/index.html @@ -233,7 +233,7 @@

Изображение успешно загруже

Не удалось загрузить данные

+ - diff --git a/js/data.js b/js/data.js new file mode 100644 index 0000000..c4dc7d6 --- /dev/null +++ b/js/data.js @@ -0,0 +1,127 @@ +import { + getRandomInt, + getRandomUniqueInt, + getRandomArrElement +} from './util.js'; + +const OBJECT_QTY = 25; + +const IdPhotoRange = { + MIN: 1, + MAX: 25, +}; + +const IdMessageRange = { + MIN: 1, + MAX: 1111, +}; + +const UrlRange = { + MIN: 1, + MAX: 25, +}; + +const LikesRange = { + MIN: 15, + MAX: 200, +}; + +const CommentsRange = { + MIN: 0, + MAX: 30, +}; + +const MessageRange = { + MIN: 1, + MAX: 2, +}; + +const AvatarRange = { + MIN: 1, + MAX: 6, +}; + +const DESCRIPTION = [ + "Закат на берегу моря", + "Старинная улочка европейского города", + "Котенок спит на кровати", + "Заснеженные склоны Хибин", + "Букет цветов на столе", + "Велосипед пристегнутый на велопарковке", + "Чашка горячего кофе", + "Осенний парк с опавшей листвой", + "Маяк на скалистом берегу", + "Шмель на цветке", + "Деревенский домик в глухом лесу", + "Отражение звезд на поверхности Ладоги", + "Птенцы в гнезде", + "Радуга над зеленым полем после дождя", + "Следы на песчаном пляже", +]; + +const MESSAGE = [ + "Всё отлично!", + "В целом всё неплохо. Но не всё.", + "Когда вы делаете фотографию, хорошо бы убирать палец из кадра. В конце концов это просто непрофессионально.", + "Моя бабушка случайно чихнула с фотоаппаратом в руках и у неё получилась фотография лучше.", + "Я поскользнулся на банановой кожуре и уронил фотоаппарат на кота и у меня получилась фотография лучше.", + "Лица у людей на фотке перекошены, как будто их избивают. Как можно было поймать такой неудачный момент?!", +]; + +const AUTHOR_NAME = [ + "Довакин", + "Алдуин", + "Шеппард", + "Геральт", + "Супер Марио", + "Соник", + "Кратос", + "Солид Снейк", + "Клод Страйф", + "Лара Крофт", + "Наруто", + "Элли", + "Джоель", + "Сэм Фишер", +]; + +const getPhotoId = getRandomUniqueInt(IdPhotoRange.MIN, IdPhotoRange.MAX); + +const getRandomUrl = getRandomUniqueInt(UrlRange.MIN, UrlRange.MAX); + +const getMessageId = getRandomUniqueInt(IdMessageRange.MIN, IdMessageRange.MAX); + +const createComment = () => { + const messagesQty = []; + while ( + messagesQty.length < getRandomInt(MessageRange.MIN, MessageRange.MAX) + ) { + messagesQty.push(getRandomArrElement(MESSAGE)); + } + return { + id: getMessageId(), + avatar: `img/avatar-${getRandomInt(AvatarRange.MIN, AvatarRange.MAX)}.svg`, + message: messagesQty.join(" "), + name: getRandomArrElement(AUTHOR_NAME), + }; +}; + +const generateObj = () => { + const comments = Array.from( + { length: getRandomInt(CommentsRange.MIN, CommentsRange.MAX) }, + createComment + ); + return { + id: getPhotoId(), + url: `photos/${getRandomUrl()}.jpg`, + description: getRandomArrElement(DESCRIPTION), + likes: getRandomInt(LikesRange.MIN, LikesRange.MAX), + comments, + }; +}; + +const generateArrObj = () => Array.from({ length: OBJECT_QTY }, generateObj); + +export { + generateArrObj +}; diff --git a/js/function.js b/js/function.js deleted file mode 100644 index 150323e..0000000 --- a/js/function.js +++ /dev/null @@ -1,65 +0,0 @@ -const checkStringLength = (str, length) => str.length <= length; -console.log(checkStringLength('тестовая строка', 5)); - -function checkPalindrome(str) { - const normalizeStr = str.replaceAll(' ', '').toLowerCase(); - let emptyStr = ''; - for (let i = normalizeStr.length - 1; i >= 0; i--) { - emptyStr += normalizeStr[i]; - } - return normalizeStr === emptyStr; -} - -console.log('\n--- Тесты для palindromeChecker ---'); -console.log( - `Строка является палиндромом: ${checkPalindrome('топот') === true}` -); -console.log( - `Строка является палиндромом с разным регистром: ${ - checkPalindrome('ДовОд') === true - }` -); -console.log( - `Строка не является палиндромом: ${checkPalindrome('Кекс') === false}` -); -console.log( - `Строка является палиндромом: ${ - checkPalindrome('Лёша на полке клопа нашёл ') === true - }` -); - -function extractNumber (str) { - str = String(str); - let extractedStr = ''; - for (let i = 0; i <= str.length - 1; i++) { - const symbol = parseInt(str[i], 10); - if (!Number.isNaN(symbol)) { - extractedStr += symbol; - } - } - return Number(extractedStr) || NaN; -} - -console.log('\n--- Тесты для extractNumber---'); -console.log( - `Аргумент начинается с числа: ${extractNumber('2023 год') === 2023}` -); -console.log( - `Аргумент заканчивается на число: ${ - extractNumber('ECMAScript 2022') === 2022 - }` -); -console.log( - `Аргумент содержит несколько чисел, в том числе и с плавающей точкой: ${ - extractNumber('1 кефир, 0.5 батона') === 105 - }` -); -console.log( - `Аргумент заканчивается на число с нолями: ${ - extractNumber('агент 007') === 7 - }` -); -console.log(`Аргумент строка без чисел: ${isNaN(extractNumber('а я томат'))}`); -console.log(`Аргумент число: ${extractNumber(2023) === 2023}`); -console.log(`Аргумент отрицательное число: ${extractNumber(-1) === 1}`); -console.log(`Аргумент число с плавающей точкой: ${extractNumber(1.5) === 15}`); diff --git a/js/functions.js b/js/functions.js index 150323e..2d46ec7 100644 --- a/js/functions.js +++ b/js/functions.js @@ -1,65 +1,17 @@ -const checkStringLength = (str, length) => str.length <= length; -console.log(checkStringLength('тестовая строка', 5)); +const isWithinWorkingHours = (workdayStart, workdayEnd, meetingStart, meetingLength) => { + const convertToMinutes = (timeString) => { + const [hours, minutes] = timeString.split(':'); + return (Number(hours) * 60) + Number(minutes) + }; + const workdayStartMinutes = convertToMinutes(workdayStart); + const workdayEndMinutes = convertToMinutes(workdayEnd); + const meetingStartMinutes = convertToMinutes(meetingStart); + const meetingEndMinutes = meetingStartMinutes + meetingLength; + return meetingStartMinutes >= workdayStartMinutes && meetingEndMinutes <= workdayEndMinutes +}; -function checkPalindrome(str) { - const normalizeStr = str.replaceAll(' ', '').toLowerCase(); - let emptyStr = ''; - for (let i = normalizeStr.length - 1; i >= 0; i--) { - emptyStr += normalizeStr[i]; - } - return normalizeStr === emptyStr; -} - -console.log('\n--- Тесты для palindromeChecker ---'); -console.log( - `Строка является палиндромом: ${checkPalindrome('топот') === true}` -); -console.log( - `Строка является палиндромом с разным регистром: ${ - checkPalindrome('ДовОд') === true - }` -); -console.log( - `Строка не является палиндромом: ${checkPalindrome('Кекс') === false}` -); -console.log( - `Строка является палиндромом: ${ - checkPalindrome('Лёша на полке клопа нашёл ') === true - }` -); - -function extractNumber (str) { - str = String(str); - let extractedStr = ''; - for (let i = 0; i <= str.length - 1; i++) { - const symbol = parseInt(str[i], 10); - if (!Number.isNaN(symbol)) { - extractedStr += symbol; - } - } - return Number(extractedStr) || NaN; -} - -console.log('\n--- Тесты для extractNumber---'); -console.log( - `Аргумент начинается с числа: ${extractNumber('2023 год') === 2023}` -); -console.log( - `Аргумент заканчивается на число: ${ - extractNumber('ECMAScript 2022') === 2022 - }` -); -console.log( - `Аргумент содержит несколько чисел, в том числе и с плавающей точкой: ${ - extractNumber('1 кефир, 0.5 батона') === 105 - }` -); -console.log( - `Аргумент заканчивается на число с нолями: ${ - extractNumber('агент 007') === 7 - }` -); -console.log(`Аргумент строка без чисел: ${isNaN(extractNumber('а я томат'))}`); -console.log(`Аргумент число: ${extractNumber(2023) === 2023}`); -console.log(`Аргумент отрицательное число: ${extractNumber(-1) === 1}`); -console.log(`Аргумент число с плавающей точкой: ${extractNumber(1.5) === 15}`); +console.log(isWithinWorkingHours('08:00', '17:30', '14:00', 90)); +console.log(isWithinWorkingHours('8:0', '10:0', '8:0', 120)); +console.log(isWithinWorkingHours('08:00', '14:30', '14:00', 90)); +console.log(isWithinWorkingHours('14:00', '17:30', '08:0', 90)); +console.log(isWithinWorkingHours('8:00', '17:30', '08:00', 900)); diff --git a/js/main.js b/js/main.js index 92fd087..a4497b4 100644 --- a/js/main.js +++ b/js/main.js @@ -1,158 +1,6 @@ -// Количество генерируемых объектов -const OBJECT_QTY = 25; +import { + generateArrObj +} from './data.js'; -// диапазон ID фото -const IdPhotoRange = { - MIN: 1, - MAX: 25 -}; - -// диапазон ID комментария -const IdMessageRange = { - MIN: 1, - MAX: 1111 -}; - -// диапазон URL фотографий -const UrlRange = { - MIN: 1, - MAX: 25 -}; - -// диапазон количества лайков -const LikesRange = { - MIN: 15, - MAX: 200 -}; - -// диапазон количества комментариев -const CommentsRange = { - MIN: 0, - MAX: 30 -}; - -// диапазон количества сообщений -const MessageRange = { - MIN: 1, - MAX: 2 - }; - -// Диапазон номера картинки для аватара -const AvatarRange = { - MIN: 1, - MAX: 6 -}; - -// Набор описаний фотографий -const DESCRIPTION = [ - "Закат на берегу моря", - "Старинная улочка европейского города", - "Котенок спит на кровати", - "Заснеженные склоны Хибин", - "Букет цветов на столе", - "Велосипед пристегнутый на велопарковке", - "Чашка горячего кофе", - "Осенний парк с опавшей листвой", - "Маяк на скалистом берегу", - "Шмель на цветке", - "Деревенский домик в глухом лесу", - "Отражение звезд на поверхности Ладоги", - "Птенцы в гнезде", - "Радуга над зеленым полем после дождя", - "Следы на песчаном пляже" -]; - -// Набор сообщений в комментариях -const MESSAGE = [ - "Всё отлично!", - "В целом всё неплохо. Но не всё.", - "Когда вы делаете фотографию, хорошо бы убирать палец из кадра. В конце концов это просто непрофессионально.", - "Моя бабушка случайно чихнула с фотоаппаратом в руках и у неё получилась фотография лучше.", - "Я поскользнулся на банановой кожуре и уронил фотоаппарат на кота и у меня получилась фотография лучше.", - "Лица у людей на фотке перекошены, как будто их избивают. Как можно было поймать такой неудачный момент?!" -]; - -// Имена авторов комментариев -const AUTHOR_NAME = [ - "Довакин", - "Алдуин", - "Шеппард", - "Геральт", - "Супер Марио", - "Соник", - "Кратос", - "Солид Снейк", - "Клод Страйф", - "Лара Крофт", - "Наруто", - "Элли", - "Джоель", - "Сэм Фишер" -]; - -// Функция получения случайного положительного числа -const getRandomInt = (min, max) => { - min = Math.ceil(min); - max = Math.floor(max); - return Math.floor(Math.random() * (max - min + 1) + min); -}; - -// Функция получения уникального случайного положительного числа -const getRandomUniqueInt = (min, max) => { - const unAvailableInt = []; - return () => { - let currentInt = getRandomInt(min, max); - if (unAvailableInt.length >= (max - min + 1)) { - return null - } - while (unAvailableInt.includes(currentInt)) { - currentInt = getRandomInt(min, max) - }; - unAvailableInt.push(currentInt); - return currentInt - } -}; - -// Функция выбора случайного элемента массива -const getRandomArrElement = (array) => array[getRandomInt(0, array.length - 1)]; - -// Функция получения ID фото -const getPhotoId = getRandomUniqueInt(IdPhotoRange.MIN, IdPhotoRange.MAX); - -// Функция получения Url фото -const getRandomUrl = getRandomUniqueInt(UrlRange.MIN, UrlRange.MAX); - -// Функция получения ID комментария -const getMessageId = getRandomUniqueInt(IdMessageRange.MIN, IdMessageRange.MAX); - -// Функция создания комментария -const createComment = () => { - const messagesQty = []; - while (messagesQty.length < getRandomInt(MessageRange.MIN, MessageRange.MAX)) { - messagesQty.push(getRandomArrElement(MESSAGE)); - } - return { - id: getMessageId(), - avatar: `img/avatar-${getRandomInt(AvatarRange.MIN, AvatarRange.MAX)}.svg`, - message: messagesQty.join(' '), - name: getRandomArrElement(AUTHOR_NAME) - }; -}; - -// Функция генерирования объекта -const generateObj = () => { - const comments = Array.from({length: getRandomInt(CommentsRange.MIN, CommentsRange.MAX)}, createComment); - return { - id: getPhotoId(), - url: `photos/${getRandomUrl()}.jpg`, - description: getRandomArrElement(DESCRIPTION), - likes: getRandomInt(LikesRange.MIN, LikesRange.MAX), - comments - } - }; - - // Готовый массив сгенерированных объектов - const completeArr = Array.from({length: OBJECT_QTY}, generateObj); - - // Проверка с выводов в таблицу (удалить перед сдачей) - console.table(completeArr); +// Проверка вывода и работы. Удалить перед сдачей. +console.table(generateArrObj()); diff --git a/js/util.js b/js/util.js new file mode 100644 index 0000000..5dd824b --- /dev/null +++ b/js/util.js @@ -0,0 +1,28 @@ +const getRandomInt = (min, max) => { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1) + min); +}; + +const getRandomUniqueInt = (min, max) => { + const unAvailableInt = []; + return () => { + let currentInt = getRandomInt(min, max); + if (unAvailableInt.length >= max - min + 1) { + return null; + } + while (unAvailableInt.includes(currentInt)) { + currentInt = getRandomInt(min, max); + } + unAvailableInt.push(currentInt); + return currentInt; + }; +}; + +const getRandomArrElement = (array) => array[getRandomInt(0, array.length - 1)]; + +export { + getRandomInt, + getRandomUniqueInt, + getRandomArrElement +};