diff --git a/.github/backup.sql b/.github/backup.sql index 45b31da..c2442a7 100644 --- a/.github/backup.sql +++ b/.github/backup.sql @@ -7,13 +7,13 @@ INSERT INTO `categories` (`id`, `name`, `color`, `createdAt`, `updatedAt`) VALUE /* functions */ INSERT INTO `functions` (`id`, `title`, `slug`, `description`, `image`, `type`, `article`, `utilizationForm`, `isOnline`, `createdAt`, `updatedAt`, `categorieId`) VALUES -(1, 'Météo', 'weatherRequest', 'Affiche la météo et l\'heure locale.', '/images/functions/weatherRequest.png', 'form', NULL, '[{\"name\": \"cityName\", \"type\": \"text\", \"label\": \"Entrez le nom d\'une ville :\", \"placeholder\": \"(e.g : Paris, FR)\"}]', 1, '2019-08-16 00:00:00', '2020-04-16 17:34:49', 1), -(2, 'Nombre aléatoire', 'randomNumber', 'Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.', '/images/functions/randomNumber.png', 'form', NULL, '[{\"name\": \"min\", \"type\": \"integer\", \"label\": \"Entrez la valeur minimale :\", \"placeholder\": \"(e.g : 1)\"}, {\"name\": \"max\", \"type\": \"integer\", \"label\": \"Entrez la valeur maximale :\", \"placeholder\": \"(e.g : 100)\"}]', 1, '2019-08-16 00:00:00', '2020-04-21 14:43:40', 2), -(3, 'Quel âge avez-vous ?', 'calculateAge', 'Calcule l\'âge selon la date de naissance.', '/images/functions/calculateAge.png', 'form', NULL, '[{\"name\": \"birthDate\", \"type\": \"calendar\", \"label\": \"Entrez la date de naissance au format (dd/mm/yyyy) :\", \"placeholder\": \"Sélectionnez une date\"}]', 1, '2019-08-16 00:00:00', '2020-04-17 16:54:27', 1), -(4, 'Conversion de Température', 'convertTemperature', 'Convertis des Degré Celsius en Degré Fahrenheit et l\'inverse aussi.', '/images/functions/convertTemperature.png', 'form', NULL, '[{\"name\": \"degree\", \"type\": \"float\", \"label\": \"Entrez la température\", \"placeholder\": \"(e.g : 23)\"}, {\"name\": \"unitToConvert\", \"type\": \"select\", \"label\": \"Convertir en : \", \"options\": [{\"name\": \"Degré Celsius (°C)\", \"value\": \"°C\"}, {\"name\": \"Degré Fahrenheit (°F)\", \"value\": \"°F\"}], \"placeholder\": \"\"}]', 1, '2019-08-16 00:00:00', '2020-04-21 16:52:11', 1), -(5, 'Conversion de Distance', 'convertDistance', 'Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre.', '/images/functions/convertDistance.png', 'form', NULL, '[{\"name\": \"number\", \"type\": \"float\", \"label\": \"Entrez la distance que vous voulez convertir :\", \"placeholder\": \"(e.g : 50)\"}, {\"name\": \"numberUnit\", \"type\": \"select\", \"label\": \"L\'unité du nombre que vous voulez convertir : \", \"options\": [{\"name\": \"Picomètre (pm)\", \"value\": \"pm\"}, {\"name\": \"Nanomètre (nm)\", \"value\": \"nm\"}, {\"name\": \"Micromètre (µm)\", \"value\": \"µm\"}, {\"name\": \"Millimètre (mm)\", \"value\": \"mm\"}, {\"name\": \"Centimètre (cm)\", \"value\": \"cm\"}, {\"name\": \"Décimètre (dm)\", \"value\": \"dm\"}, {\"name\": \"Mètre (m)\", \"value\": \"m\"}, {\"name\": \"Décamètre (dam)\", \"value\": \"dam\"}, {\"name\": \"Hectomètre (hm)\", \"value\": \"hm\"}, {\"name\": \"Kilomètre (km)\", \"value\": \"km\"}, {\"name\": \"Mégamètre (Mm)\", \"value\": \"Mm\"}, {\"name\": \"Gigamètre (Gm)\", \"value\": \"Gm\"}, {\"name\": \"Téramètre (Tm)\", \"value\": \"Tm\"}], \"placeholder\": \"\"}, {\"name\": \"finalUnit\", \"type\": \"select\", \"label\": \"Choisissez l\'unité que vous voulez avoir après conversion :\", \"options\": [{\"name\": \"Picomètre (pm)\", \"value\": \"pm\"}, {\"name\": \"Nanomètre (nm)\", \"value\": \"nm\"}, {\"name\": \"Micromètre (µm)\", \"value\": \"µm\"}, {\"name\": \"Millimètre (mm)\", \"value\": \"mm\"}, {\"name\": \"Centimètre (cm)\", \"value\": \"cm\"}, {\"name\": \"Décimètre (dm)\", \"value\": \"dm\"}, {\"name\": \"Mètre (m)\", \"value\": \"m\"}, {\"name\": \"Décamètre (dam)\", \"value\": \"dam\"}, {\"name\": \"Hectomètre (hm)\", \"value\": \"hm\"}, {\"name\": \"Kilomètre (km)\", \"value\": \"km\"}, {\"name\": \"Mégamètre (Mm)\", \"value\": \"Mm\"}, {\"name\": \"Gigamètre (Gm)\", \"value\": \"Gm\"}, {\"name\": \"Téramètre (Tm)\", \"value\": \"Tm\"}], \"placeholder\": \"\"}]', 1, '2019-08-16 00:00:00', '2020-04-27 16:16:42', 1), -(6, 'Générateur de citations', 'randomQuote', 'Génère aléatoirement une citation ou un proverbe.', '/images/functions/randomQuote.png', 'page', NULL, NULL, 1, '2019-09-13 00:00:00', '2020-04-22 10:23:43', 1), -(7, 'Conversion de devise', 'convertCurrency', 'Convertis une valeur dans une devise dans une autre devise.', '/images/functions/convertCurrency.png', 'form', NULL, '[{\"name\": \"number\", \"type\": \"float\", \"label\": \"Entrez le nombre à convertir :\", \"placeholder\": \"(e.g : 50)\"}, {\"name\": \"baseCurrency\", \"type\": \"select\", \"label\": \"La devise du nombre que vous voulez convertir :\", \"options\": [{\"name\": \"Euro (€) - EUR\", \"value\": \"EUR\"}, {\"name\": \"Livre sterling (£) - GBP\", \"value\": \"GBP\"}, {\"name\": \"Dollar Américain ($) - USD\", \"value\": \"USD\"}, {\"name\": \"Dollar Canadien ($) - CAD\", \"value\": \"CAD\"}, {\"name\": \"Dollar Australien ($) - AUD\", \"value\": \"AUD\"}, {\"name\": \"Peso Mexicain ($) - MXN\", \"value\": \"MXN\"}, {\"name\": \"Franc Suisse (Fr) - CHF\", \"value\": \"CHF\"}, {\"name\": \"Rouble Russe (₽) - RUB\", \"value\": \"RUB\"}, {\"name\": \"Réal brésilien (R$) - BRL\", \"value\": \"BRL\"}, {\"name\": \"Yen (¥) - JPY\", \"value\": \"JPY\"}]}, {\"name\": \"finalCurrency\", \"type\": \"select\", \"label\": \"Choisissez la devise que voulez avoir après conversion :\", \"options\": [{\"name\": \"Livre sterling (£) - GBP\", \"value\": \"GBP\"}, {\"name\": \"Dollar Américain ($) - USD\", \"value\": \"USD\"}, {\"name\": \"Dollar Canadien ($) - CAD\", \"value\": \"CAD\"}, {\"name\": \"Dollar Australien ($) - AUD\", \"value\": \"AUD\"}, {\"name\": \"Peso Mexicain ($) - MXN\", \"value\": \"MXN\"}, {\"name\": \"Franc Suisse (Fr) - CHF\", \"value\": \"CHF\"}, {\"name\": \"Rouble Russe (₽) - RUB\", \"value\": \"RUB\"}, {\"name\": \"Réal brésilien (R$) - BRL\", \"value\": \"BRL\"}, {\"name\": \"Yen (¥) - JPY\", \"value\": \"JPY\"}, {\"name\": \"Euro (€) - EUR\", \"value\": \"EUR\"}]}]', 1, '2019-09-13 00:00:00', '2020-04-22 21:55:30', 1), +(1, 'Météo', 'weatherRequest', 'Affiche la météo et l\'heure locale.', '/images/functions/weatherRequest.png', 'form', '

Pour une meilleure précision, je recommande de préciser le pays de la ville. Il faut rentrer le nom anglais de la ville (s\"il est différent qu\"en français).

Exemples : Paris, FR - London, UK - Moscow, RU - etc.

La météo est récupérée grâce à l\"API openweathermap.org, une simple requête GET.

', '[{\"name\": \"cityName\", \"type\": \"text\", \"label\": \"Entrez le nom d\'une ville :\", \"placeholder\": \"(e.g : Paris, FR)\"}]', 1, '2019-08-16 00:00:00', '2020-05-08 13:43:26', 1), +(2, 'Nombre aléatoire', 'randomNumber', 'Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.', '/images/functions/randomNumber.png', 'form', '

Simple fonction très utile dans de nombreux cas, qui permet de générer un nombre aléatoire entre un nombre minimum et un nombre maximum :

function randomNumber(minmax) {
    return Math.floor(Math.random() * (max - min +1)) + min;
}
', '[{\"name\": \"min\", \"type\": \"integer\", \"label\": \"Entrez la valeur minimale :\", \"placeholder\": \"(e.g : 1)\"}, {\"name\": \"max\", \"type\": \"integer\", \"label\": \"Entrez la valeur maximale :\", \"placeholder\": \"(e.g : 100)\"}]', 1, '2019-08-16 00:00:00', '2020-05-08 13:23:22', 2), +(3, 'Quel âge avez-vous ?', 'calculateAge', 'Calcule l\'âge selon la date de naissance.', '/images/functions/calculateAge.png', 'form', '

Grâce à la librairie \"Moment.js\" c\"est très simple  : 

function calculateAge({ birthDateDaybirthDateMonthbirthDateYear }) {
    const currentDate = new Date();
    const day         = currentDate.getDate();
    const month       = currentDate.getMonth();
    const currentDateMoment = moment([currentDate.getFullYear(), monthday]);
    const birthDateMoment   = moment([birthDateYearbirthDateMonthbirthDateDay]);

    // Calcule l\'âge - Moment.js
    const ageYears = currentDateMoment.diff(birthDateMoment\'year\');
    birthDateMoment.add(ageYears\'years\');
    const ageMonths = currentDateMoment.diff(birthDateMoment\'months\');
    birthDateMoment.add(ageMonths\'months\');
    const ageDays = currentDateMoment.diff(birthDateMoment\'days\');

    const isBirthday = (birthDateDay === day && birthDateMonth === month); 
    return { ageYearsageMonthsageDaysisBirthday };
}
', '[{\"name\": \"birthDate\", \"type\": \"calendar\", \"label\": \"Entrez la date de naissance au format (dd/mm/yyyy) :\", \"placeholder\": \"Sélectionnez une date\"}]', 1, '2019-08-16 00:00:00', '2020-05-08 13:39:30', 1), +(4, 'Conversion de Température', 'convertTemperature', 'Convertis des Degré Celsius en Degré Fahrenheit et l\'inverse aussi.', '/images/functions/convertTemperature.png', 'form', '

Cette fonction n\"est pas trop intéressante, c\"est juste de l\"application de formules :

 * @description Convertis des °C en °F et l\'inverse aussi.
 * @param {number} degree - Nombre de degrès
 * @param {string} unit - Unité du nombre (°C ou °F) après conversion
 * @returns {object} le nombre résultat
 * @examples convertTemperature(23, \'°F\') → 73.4
 */
function convertTemperature(degreeunit) {
    let temperatureValue = 0;
    if (unit === \"°C\") {
        temperatureValue = (degree - 32) * 5/9;
    }
    else if (unit === \"°F\") {
        temperatureValue = ((degree * 9/5) + 32);
    }
    return temperatureValue;
', '[{\"name\": \"degree\", \"type\": \"float\", \"label\": \"Entrez la température\", \"placeholder\": \"(e.g : 23)\"}, {\"name\": \"unitToConvert\", \"type\": \"select\", \"label\": \"Convertir en : \", \"options\": [{\"name\": \"Degré Celsius (°C)\", \"value\": \"°C\"}, {\"name\": \"Degré Fahrenheit (°F)\", \"value\": \"°F\"}], \"placeholder\": \"\"}]', 1, '2019-08-16 00:00:00', '2020-05-08 13:34:26', 1), +(5, 'Conversion de Distance', 'convertDistance', 'Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre.', '/images/functions/convertDistance.png', 'form', '

Pour cette fonction on a un tableau de référence allant de pm à Tm :

const correspondancesDistance = [\"pm\"nullnull\"nm\"nullnull\"µm\"nullnull\"mm\"\"cm\"\"dm\"\"m\"\"dam\"\"hm\"\"km\"nullnull\"Mm\"nullnull\"Gm\"nullnull\"Tm\"];

Puis grâce à la différence des index des unités, on peut multiplier la valeur initiale par 10 puissance la différence :

/** 
 * @description Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre.
 * @param {number} firstValue - Le nombre que vous voulez convertir
 * @param {string} unitFirstValue - L\'unité du nombre que vous voulez convertir
 * @param {string} unitFinalValue -  L\'unité de votre nombre après la conversion
 * @returns {number} → le nombre résultat
 * @examples convertDistance(500, \'cm\', \'m\') → 5
 */
function convertDistance(firstValueunitFirstValueunitFinalValue) {
    const index1 = correspondancesDistance.indexOf(unitFirstValue); 
    const index2 = correspondancesDistance.indexOf(unitFinalValue);
    const difference = index1 - index2
    return firstValue * Math.pow(10difference);
}
', '[{\"name\": \"number\", \"type\": \"float\", \"label\": \"Entrez la distance que vous voulez convertir :\", \"placeholder\": \"(e.g : 50)\"}, {\"name\": \"numberUnit\", \"type\": \"select\", \"label\": \"L\'unité du nombre que vous voulez convertir : \", \"options\": [{\"name\": \"Picomètre (pm)\", \"value\": \"pm\"}, {\"name\": \"Nanomètre (nm)\", \"value\": \"nm\"}, {\"name\": \"Micromètre (µm)\", \"value\": \"µm\"}, {\"name\": \"Millimètre (mm)\", \"value\": \"mm\"}, {\"name\": \"Centimètre (cm)\", \"value\": \"cm\"}, {\"name\": \"Décimètre (dm)\", \"value\": \"dm\"}, {\"name\": \"Mètre (m)\", \"value\": \"m\"}, {\"name\": \"Décamètre (dam)\", \"value\": \"dam\"}, {\"name\": \"Hectomètre (hm)\", \"value\": \"hm\"}, {\"name\": \"Kilomètre (km)\", \"value\": \"km\"}, {\"name\": \"Mégamètre (Mm)\", \"value\": \"Mm\"}, {\"name\": \"Gigamètre (Gm)\", \"value\": \"Gm\"}, {\"name\": \"Téramètre (Tm)\", \"value\": \"Tm\"}], \"placeholder\": \"\"}, {\"name\": \"finalUnit\", \"type\": \"select\", \"label\": \"Choisissez l\'unité que vous voulez avoir après conversion :\", \"options\": [{\"name\": \"Picomètre (pm)\", \"value\": \"pm\"}, {\"name\": \"Nanomètre (nm)\", \"value\": \"nm\"}, {\"name\": \"Micromètre (µm)\", \"value\": \"µm\"}, {\"name\": \"Millimètre (mm)\", \"value\": \"mm\"}, {\"name\": \"Centimètre (cm)\", \"value\": \"cm\"}, {\"name\": \"Décimètre (dm)\", \"value\": \"dm\"}, {\"name\": \"Mètre (m)\", \"value\": \"m\"}, {\"name\": \"Décamètre (dam)\", \"value\": \"dam\"}, {\"name\": \"Hectomètre (hm)\", \"value\": \"hm\"}, {\"name\": \"Kilomètre (km)\", \"value\": \"km\"}, {\"name\": \"Mégamètre (Mm)\", \"value\": \"Mm\"}, {\"name\": \"Gigamètre (Gm)\", \"value\": \"Gm\"}, {\"name\": \"Téramètre (Tm)\", \"value\": \"Tm\"}], \"placeholder\": \"\"}]', 1, '2019-08-16 00:00:00', '2020-05-08 13:30:46', 1), +(6, 'Générateur de citations', 'randomQuote', 'Génère aléatoirement une citation ou un proverbe.', '/images/functions/randomQuote.png', 'page', '

Même principe que la fonction randomNumber, on a une liste de citation contenu dans un tableau et on sélectionne un index au hasard dans ce tableau grâce à la fonction randomNumber, par exemple :

function randomNumber(minmax) {
    return Math.floor(Math.random() * (max - min +1)) + min;
}
const quotes = [
    {
        quote: \"Deux choses sont infinies: l\'univers et la bêtise humaine; et je ne suis pas sûr de l\'univers.\",
        source: \"Albert Einstein\"
      },
      {
        quote: \"Exige beaucoup de toi-même et attends peu des autres. Ainsi beaucoup d\'ennuis te seront épargnés.\",
        source: \"Confucius\"
      }
];
console.log(quotes[randomNumber(0quotes.length - 1)]);
', NULL, 1, '2019-09-13 00:00:00', '2020-05-08 13:52:57', 1), +(7, 'Conversion de devise', 'convertCurrency', 'Convertis une valeur dans une devise dans une autre devise.', '/images/functions/convertCurrency.png', 'form', '

Les taux de changes sont récupérée grâce à l\"api : https://api.exchangeratesapi.io

Pas plus compliqué qu\'une simple requête GET.

', '[{\"name\": \"number\", \"type\": \"float\", \"label\": \"Entrez le nombre à convertir :\", \"placeholder\": \"(e.g : 50)\"}, {\"name\": \"baseCurrency\", \"type\": \"select\", \"label\": \"La devise du nombre que vous voulez convertir :\", \"options\": [{\"name\": \"Euro (€) - EUR\", \"value\": \"EUR\"}, {\"name\": \"Livre sterling (£) - GBP\", \"value\": \"GBP\"}, {\"name\": \"Dollar Américain ($) - USD\", \"value\": \"USD\"}, {\"name\": \"Dollar Canadien ($) - CAD\", \"value\": \"CAD\"}, {\"name\": \"Dollar Australien ($) - AUD\", \"value\": \"AUD\"}, {\"name\": \"Peso Mexicain ($) - MXN\", \"value\": \"MXN\"}, {\"name\": \"Franc Suisse (Fr) - CHF\", \"value\": \"CHF\"}, {\"name\": \"Rouble Russe (₽) - RUB\", \"value\": \"RUB\"}, {\"name\": \"Réal brésilien (R$) - BRL\", \"value\": \"BRL\"}, {\"name\": \"Yen (¥) - JPY\", \"value\": \"JPY\"}]}, {\"name\": \"finalCurrency\", \"type\": \"select\", \"label\": \"Choisissez la devise que voulez avoir après conversion :\", \"options\": [{\"name\": \"Livre sterling (£) - GBP\", \"value\": \"GBP\"}, {\"name\": \"Dollar Américain ($) - USD\", \"value\": \"USD\"}, {\"name\": \"Dollar Canadien ($) - CAD\", \"value\": \"CAD\"}, {\"name\": \"Dollar Australien ($) - AUD\", \"value\": \"AUD\"}, {\"name\": \"Peso Mexicain ($) - MXN\", \"value\": \"MXN\"}, {\"name\": \"Franc Suisse (Fr) - CHF\", \"value\": \"CHF\"}, {\"name\": \"Rouble Russe (₽) - RUB\", \"value\": \"RUB\"}, {\"name\": \"Réal brésilien (R$) - BRL\", \"value\": \"BRL\"}, {\"name\": \"Yen (¥) - JPY\", \"value\": \"JPY\"}, {\"name\": \"Euro (€) - EUR\", \"value\": \"EUR\"}]}]', 1, '2019-09-13 00:00:00', '2020-05-08 13:47:42', 1), (8, 'Conversion des Encodages de caractères', 'convertEncoding', 'Convertis des nombres de différentes bases et convertis en UTF-8.', '/images/functions/convertEncoding.png', 'form', NULL, '[{\"name\": \"value\", \"type\": \"text\", \"label\": \"Entrez votre valeur :\", \"placeholder\": \"Votre valeur...\"}, {\"name\": \"functionName\", \"type\": \"select\", \"label\": \"Choisissez une option :\", \"options\": [{\"name\": \"Décimal en Binaire\", \"value\": \"decimalToBinary\"}, {\"name\": \"Binaire en Décimal\", \"value\": \"binaryToDecimal\"}, {\"name\": \"Décimal en Hexadecimal\", \"value\": \"decimalToHexadecimal\"}, {\"name\": \"Hexadecimal en Décimal\", \"value\": \"hexadecimalToDecimal\"}, {\"name\": \"Binaire en Hexadécimal\", \"value\": \"binaryToHexadecimal\"}, {\"name\": \"Hexadécimal en Binaire\", \"value\": \"hexadecimalToBinary\"}, {\"name\": \"Chaque caractère a un nombre Unicode\", \"value\": \"textToNumberUnicode\"}, {\"name\": \"Chaque nombre Unicode a un caractère\", \"value\": \"numberUnicodeToText\"}, {\"name\": \"Texte en Binaire (UTF-8)\", \"value\": \"textToBinary\"}, {\"name\": \"Binaire (UTF-8) en Texte\", \"value\": \"binaryToText\"}, {\"name\": \"Texte en Hexadécimal (UTF-8)\", \"value\": \"textToHexadecimal\"}, {\"name\": \"Hexadécimal (UTF-8) en Texte\", \"value\": \"hexadecimalToText\"}], \"placeholder\": \"\"}]', 1, '2019-09-14 00:00:00', '2020-04-22 22:34:48', 2), (9, 'Conversion d\'un nombre arabe en nombre romain', 'convertRomanArabicNumbers', 'Convertis un nombre arabe en nombre romain (et l\'inverse aussi).', '/images/functions/convertRomanArabicNumbers.png', 'form', NULL, '[{\"name\": \"value\", \"type\": \"text\", \"label\": \"Entrez votre nombre :\", \"placeholder\": \"(e.g : 50 ou L)\"}, {\"name\": \"functionName\", \"type\": \"select\", \"label\": \"Convertir en :\", \"options\": [{\"name\": \"Nombre Romain\", \"value\": \"convertArabicToRomanOutput\"}, {\"name\": \"Nombre Arabe\", \"value\": \"convertRomanToArabicOutput\"}], \"placeholder\": \"\"}]', 1, '2019-09-21 00:00:00', '2020-04-22 22:43:50', 2), (10, 'Nombre d\'Armstrong', 'armstrongNumber', 'Permet de savoir si un nombre fait partie des nombres d\'Armstrong.', '/images/functions/armstrongNumber.png', 'form', NULL, '[{\"name\": \"number\", \"type\": \"integer\", \"label\": \"Entrez votre nombre :\", \"placeholder\": \"(e.g : 153)\"}]', 1, '2019-09-21 00:00:00', '2020-04-22 22:49:21', 2), @@ -21,9 +21,11 @@ INSERT INTO `functions` (`id`, `title`, `slug`, `description`, `image`, `type`, (12, 'Raccourcisseurs de liens', 'linkShortener', 'Une URL trop longue ? Raccourcissez-là !', '/images/functions/linkShortener.png', 'form', NULL, '[{\"name\": \"url\", \"type\": \"text\", \"label\": \"Entrez le lien à raccourcir :\", \"placeholder\": \"(e.g : https://divlo.fr)\"}, {\"name\": \"shortcutName\", \"type\": \"text\", \"label\": \"Entrez le nom du raccourci :\", \"placeholder\": \"(e.g : divlo)\"}]', 1, '2019-12-11 00:00:00', '2020-04-27 16:31:38', 1), (13, 'Liste de choses à faire', 'toDoList', 'Prévoyez la liste de choses que vous devez faire.', '/images/functions/toDoList.png', 'page', NULL, NULL, 1, '2019-12-26 00:00:00', '2020-04-27 16:34:34', 1), (14, 'Juste Prix', 'rightPrice', 'Arriverez-vous à deviner le prix d\'un objet ?', '/images/functions/rightPrice.png', 'page', NULL, NULL, 1, '2020-04-27 20:17:05', '2020-04-27 21:59:22', 3), -(15, 'Chronomètre', 'chronometerTimer', 'Gérer votre temps facilement (et adopter la technique Pomodoro).', '/images/functions/chronometerTimer.png', 'page', NULL, NULL, 1, '2020-04-29 09:28:08', '2020-04-29 09:45:29', 1), +(15, 'Chronomètre', 'chronometerTimer', 'Gérer votre temps facilement (et adopter la technique Pomodoro).', '/images/functions/chronometerTimer.png', 'page', NULL, NULL, 1, '2020-04-29 09:28:08', '2020-04-29 09:45:29', 1); +INSERT INTO `functions` (`id`, `title`, `slug`, `description`, `image`, `type`, `article`, `utilizationForm`, `isOnline`, `createdAt`, `updatedAt`, `categorieId`) VALUES (16, 'Les méthodes des tableaux', 'arrayMethods', 'Et si on refaisait les méthodes natives de l\'objet global \"Array\" ?', '/images/functions/arrayMethods.png', 'article', '

JavaScript est un langage orienté objet, chaque type comme \"String\",  \"Number\", ... sont en réalité des objets. 
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nCe sont des \"Objets globaux\", qui dispose de méthodes bien utiles. 😎  Pourquoi je vous dit ça ?
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nCar aujourd\"hui nous allons reproduire les méthodes de l\"objet global \"Array\",  c\"est un bon exercice pour progresser.
\n
\n\n\n\n\n\n\n\n\n\n\n\nNous allons réaliser une classe (syntaxe ES6+) qu\"on va appeler \"DivloArray\" par exemple et reproduire 6 méthodes (push, forEach, map, filter, reverse et join), bien évidemment libre à vous d\"en faire plus. 😊 Je vais expliquer le code une méthode après l\"autre donc bout de code par bout de code, si vous voulez avoir le code source complet, il est disponible sur ce GitHub Gist.
\n
\n\n\n\n\n\n\n\n\n\n\nDonc tout d\"abord, nous devons créer la classe avec un constructor et faire une nouvelle instance de cet objet dans une variable :
\n\n\n\n\n\n\n\n\n(Libre à vous de renommer les variables comme bon vous semble.) 
\n

class DivloArray {
    constructor(array) {
        this.array = array;
    }
}

\n\n
const divloArray = new DivloArray([574281625]);


\n\n\n\n\n\n\n- Nous allons commencer par créer la première méthode très utilisée qui consiste à ajouter un ou plusieurs éléments à la fin d\"un tableau, je parle bien évidemment de la méthode push.

/**
 * @description Ajoute un ou plusieurs éléments à la fin d\"un tableau et retourne la nouvelle taille du tableau.
 * @param {*} elements Éléments à ajoutés
 * @returns {Number} La taille (length) du nouveau tableau
 */
push(...elements) {
    let indexCourant = this.array.length;
    elements.forEach((element=> {
        this.array[indexCourant] = element;
        indexCourant++;
    });
    return this.array.length;
}

Alors on prend en paramètre des éléments avec le spread operator ce qui nous permet d\"obtenir un tableau (exemple: 1, 2, 3 devient [1, 2, 3]). On fait une variable indexCourant qui est égale à la taille du tableau qu\"on incrémentera de 1 à chaque tour de boucle, comme ça on peut accéder à l\"index qui n\"existe pas encore et lui attribuer une valeur, l\"élement en cours de la boucle, si vous avez des questions n\"hésitez pas à les poster en commentaire.
\n
\n\n\n\n\n\n\n- La méthode forEach : 

/**
 * @description Permet d\"exécuter une fonction donnée sur chaque élément du tableau. 
 * @param {Function} callback Une fonction qui accepte jusqu\"à trois arguments :
 * - valeurCourante → La valeur de l\"élément du tableau en cours de traitement.
 * - index → L\"indice de l\"élément du tableau en cours de traitement.
 * - array → Le tableau sur lequel la méthode forEach est appliquée.
 */
forEach(callback) {
    for (let index = 0index < this.array.lengthindex++) {
        const valeurCourante = this.array[index];
        callback(valeurCouranteindexthis.array);
    }
}

Prend une fonction callback, c\"est à dire une fonction qui va être exécutée dans le corps de la fonction et on fait une simple boucle for.
\n
\n\n\n\n\n\n- La méthode map :

/**
 * @description Crée un nouveau tableau avec les résultats de l\"appel d\"une fonction fournie sur chaque élément du tableau appelant.
 * @param {Function} callback Une fonction qui accepte jusqu\"à trois arguments.
 * - valeurCourante → La valeur de l\"élément du tableau en cours de traitement.
 * - index → L\"indice de l\"élément du tableau en cours de traitement.
 * - array → Le tableau sur lequel la méthode est appliquée.
 * @returns {Array} Un nouveau tableau composé des images de la fonction de rappel.
 */
map(callback) {
    const array = [...this.array]; // permet de ne pas changer les valeurs du tableau original (car passage par référence)
    this.forEach((elementCourantindexCourant=> {
        array[indexCourant] = callback(elementCourantindexCourantthis.array);
    });
    return array;
}


\n\n\n\n\n- La méthode filter

/**
 * @description Retourne un nouveau tableau contenant tous les éléments du tableau d\"origine qui remplissent une condition déterminée par la fonction callback.
 * @param {Function} callback La fonction de test à appliquer à chaque élément du tableau. Cette fonction est appelée avec les arguments suivants :
 * - elementCourant → L\"élément à traiter
 * - index → Son indice
 * - array → Le tableau complet
 * @returns {Array} Un nouveau tableau contenant les éléments qui respectent la condition du filtre. Si aucun élément ne respecte la condition, c\"est un tableau vide qui est renvoyé.
 */
filter(callback) {
    const resultArray = [];
    this.forEach((elementCourantindexCourant=> {
        const isTrue = callback(elementCourantindexCourantthis.array);
        if (isTrue) {
            resultArray.push(elementCourant);
        }
    });
    return resultArray;
}

Comme on peut le voir beaucoup de ces méthodes recoivent une fonction callback, en tout cas, cette méthode ressemble beaucoup à la méthode map sauf que cette fois çi à la place de faire une assignation on vérifie si la callback nous renvoie True et si oui on push l\"élément à notre tableau de résultats.
\n
\n\n\n- La méthode reverse qui inverse le tableau : 

/**
 * @description Transpose les éléments d\"un tableau : le premier élément devient le dernier et le dernier devient le premier et ainsi de suite.
 * @returns {Array} Le tableau inversé
 */
reverse() {
    const reverseArray = [];
    for (let index = this.array.length - 1index >= 0index--) {
        const element = this.array[index];
        reverseArray.push(element);
    }
    return reverseArray;
}

On fait l\"inverse de la méthode forEach, à la place de commencer l\"index à 0 et de l\"incrémenter par 1, cette fois çi on commence par le nombre d\"éléments dans le tableau - 1, et on enlève 1 à chaque tour de boucle.
\n
\n\n- Et pour finir la méthode join :

/**
 * Crée et renvoie une nouvelle chaîne de caractères en concaténant tous les éléments d\'un tableau
 * @param {String} separator Ce paramètre optionnel indique une chaine de caractères pour séparer chaque élément du tableau
 * @returns {String} Une chaîne de caractères composée de tous les éléments du tableau joints les uns aux autres.
 */
join(separator = \",\") {
    let resultString = \"\";
    this.forEach((elementindex=> {
        if (this.array.length - 1 === indexreturn resultString += element;
        resultString += element + separator;
    });
    return resultString;
}

Juste petite subtilité, on ne doit pas rajouter le séparateur à la dernière itrération de la boucle et donc pour ça on fait une simple condition.
\n
\nAlors ? Ce n\"est pas très compliqué, mais je trouve c\"est important de comprendre comment les méthodes/fonctions fonctionnent avant de s\"en servir et savoir les refaire c\"est toujours un bon plus même si en réalité dans un projet on ne va juste utiliser ces méthodes sans réfléchir comment elles fonctionnent.

', NULL, 1, '2020-04-29 20:16:09', '2020-05-06 10:50:26', 4), -(17, 'Est-ce un palindrome ?', 'isPalindrome', 'Un palindrome est un mot (ou phrase) qui peut s\'écrire dans les deux sens (ex: kayak).', '/images/functions/isPalindrome.png', 'form', NULL, '[{\"name\": \"string\", \"type\": \"text\", \"label\": \"Entrez la chaîne de caractères à vérifier :\", \"placeholder\": \"(e.g : kayak)\"}]', 1, '2020-05-06 20:16:41', '2020-05-07 09:32:02', 2), -(18, 'Quel est le mot le plus long ?', 'findLongestWord', 'Trouve le mot le plus long dans une chaîne de caractères.', '/images/functions/findLongestWord.png', 'form', NULL, '[{\"name\": \"string\", \"type\": \"text\", \"label\": \"Entrez la chaîne de caractères (phrase) à vérifier :\", \"placeholder\": \"(e.g : Une phrase quelconque.)\"}]', 1, '2020-05-06 20:29:05', '2020-05-07 13:31:30', 2), -(19, 'Suite de Fibonacci', 'fibonacci', 'Calcule la suite de Fibonacci.', '/images/functions/fibonacci.png', 'form', NULL, '[{\"name\": \"counter\", \"type\": \"integer\", \"label\": \"Combien de nombres de la suite de fibonacci voulez vous calculer ?\", \"placeholder\": \"(e.g : 14)\"}]', 1, '2020-05-06 20:43:21', '2020-05-07 14:00:09', 2), -(20, 'Trie les éléments d\'un tableau', 'sortArray', 'Trie les éléments d\'un tableau dans l\'ordre croissant.', '/images/functions/sortArray.png', 'form', NULL, '[{\"name\": \"numbersList\", \"type\": \"text\", \"label\": \"Entrez une liste de nombres (séparées par des virgules) :\", \"placeholder\": \"(e.g : 4, 12, 1, 8)\"}]', 1, '2020-05-06 20:57:48', '2020-05-07 14:42:56', 2); \ No newline at end of file +(17, 'Est-ce un palindrome ?', 'isPalindrome', 'Un palindrome est un mot (ou phrase) qui peut s\'écrire dans les deux sens (ex: kayak).', '/images/functions/isPalindrome.png', 'form', '

Pour réfléchir sur un problème, il faut le \"découper\" en petits autres problèmes, un palindrome est un mot qui peut s\"écrire dans les deux sens, donc le mot avec les lettres inversées devrait être exactement le même que le mot initial.
\n\n\nDonc pour cela faut d\"abord faire une fonction qui va retourner la chaîne de caractère à l\"envers, par exemple : \"Hello\" devient \"olleH.

Je vais vous montrer 2 techniques différentes pour arriver à écrire la fonction \"reverseString\" :

- 1ère méthode consiste à simplement faire une boucle à l\"envers :

function reverseString(string) {
    let result = \"\";
    const stringLength = string.length - 1;
    for (let index = stringLengthindex >= 0index--) {
        result += string[index];
    }
    return result;
}

- 2ème méthode qui tient sur une seule ligne grâce aux méthodes des objets globaux :

function reverseString(string) {
    return string.split(\"\").reverse().join(\"\");
}

Ici on \"split\" la chaîne de caractère sur chaque lettre (exemple: \"test\" devient [\"t\", \"e\", \"s\", \"t\"]), puis on utilise la méthode reverse() qui inverse le tableau et pour finir join qui nous permet d\"avoir une chaîne de caractères.

Maintenant, on peut rédiger la fonction \"isPalindrome\" : 

function isPalindrome(string) {
    return string === reverseString(string);
}

Cette fonction nous renvoie simplement un booléen si oui ou non c\'est un palindrome.

', '[{\"name\": \"string\", \"type\": \"text\", \"label\": \"Entrez la chaîne de caractères à vérifier :\", \"placeholder\": \"(e.g : kayak)\"}]', 1, '2020-05-06 20:16:41', '2020-05-08 07:06:10', 2), +(18, 'Quel est le mot le plus long ?', 'findLongestWord', 'Trouve le mot le plus long dans une chaîne de caractères.', '/images/functions/findLongestWord.png', 'form', '

function findLongestWord(string) {
    const arrayString = string.split(\" \");
    let wordLength = 0;
    let wordResult = \"\";

    arrayString.forEach((word=> {
        if (word.length > wordLength) {
            wordResult = word;
            wordLength = word.length;
        }
    });

    return wordResult;
}

On part du principe que chaque mot est séparé par des espaces. Au début, le mot le plus long a 0 caractère. Puis on fait une boucle qui vérifie si le mot qu\'on est en train de vérifier est plus long que le mot qui était jusqu\'à cette itération le plus long, si c\'est le cas, on met à jour les variables du mot le plus long, pour vérifier si c\'est encore le cas à la prochaine itération.

', '[{\"name\": \"string\", \"type\": \"text\", \"label\": \"Entrez la chaîne de caractères (phrase) à vérifier :\", \"placeholder\": \"(e.g : Une phrase quelconque.)\"}]', 1, '2020-05-06 20:29:05', '2020-05-08 07:23:23', 2), +(19, 'Suite de Fibonacci', 'fibonacci', 'Calcule la suite de Fibonacci.', '/images/functions/fibonacci.png', 'form', '

La suite de Fibonacci est une suite d\"entiers dans laquelle chaque terme est la somme des deux termes qui le précèdent, voici les 6 premiers chiffres de la suite :
\n\n\n\n\n\n0, 1, 1, 2, 3, 5

Nous allons coder une fonction récursive qui va nous calculer les \"x\" premiers nombres de la suite.

Pour commencer qu\"est ce qu\"une fonction récursive ? Une fonction récursive est une fonction qui s\"auto appelle dans le corps de la fonction, exemple :

function doSomeCode() {
    doSomeCode();
}
doSomeCode();

Bon ici, ça n\"a pas trop de sens, car ça causerait \"une boucle infinie\" on obtiendra une \"InternalError: too much recursion\", par contre si on exécute la fonction ou on retourne une valeur d\"après des conditions, ça peut-être très intéressant.

function fibonacci(counterresult = [], number1 = 0number2 = 1) {
    if (counter === 0) {
        return result
    }
    counter--;
    result.push(number1);
    return fibonacci(counterresultnumber2number1 + number2);
}

Cette fonction a en réalité un seul argument qui doit être passé lors de la première exécution, le \"counter\", le reste c\'est des arguments qu\"on passera dans le corps de la fonction quand on la réecutera.

On décrémente counter de -1 à chaque itération donc si counter est égale à 0 c\"est qu\"il faut retourner la suite de nombres sinon on peut continuer à push des nombres dans la liste.
\nPour rajouter des nombres dans la liste, il nous faut 2 variables (les deux termes qui précèdent) qui ici nous appelons \"number1\" et \"number2\".

', '[{\"name\": \"counter\", \"type\": \"integer\", \"label\": \"Combien de nombres de la suite de fibonacci voulez vous calculer ?\", \"placeholder\": \"(e.g : 14)\"}]', 1, '2020-05-06 20:43:21', '2020-05-08 12:02:53', 2); +INSERT INTO `functions` (`id`, `title`, `slug`, `description`, `image`, `type`, `article`, `utilizationForm`, `isOnline`, `createdAt`, `updatedAt`, `categorieId`) VALUES +(20, 'Trie les éléments d\'un tableau', 'sortArray', 'Trie les éléments d\'un tableau dans l\'ordre croissant.', '/images/functions/sortArray.png', 'form', '

Le but ici c\"est de recevoir un tableau de nombres et de pouvoir remettre dans l\"ordre croissant le tableau (exemple : [4, 12, 1, 8] devient [1, 4, 8, 12]).

Comme je le dis souvent, il faut penser un problème en petits autres problèmes plus facilement atteignable. Pour commencer, je décide de faire une fonction qui me retourne le nombre le plus petit d\"un tableau.
\n

function minNumber(array) {
    let minNumber = { index: 0value: array[0] };
    for (let index = 1index < array.lengthindex++) {
        const number = array[index];
        if (number < minNumber.value) {
            minNumber = { index: indexvalue:  array[index] };
        }
    }
    return minNumber;
}

Cette fonction retourne un objet contenant la valeur ainsi que son index du nombre le plus petit du tableau passé en argument.

Ensuite on peut passer à la fonction sortArray :

function sortArray(array) {
    const arrayDuplicated = [...array];
    const resultArray = [];
    while (array.length !== resultArray.length) {
        const min = minNumber(arrayDuplicated);
        resultArray.push(min.value);
        arrayDuplicated.splice(min.index1);
    }
    return resultArray;
}

Je duplique mon tableau (\"arrayDuplicated\") grâce au spread operator, c\'est sur ce tableau que je vais supprimer le nombre minimum pour l\'ajouter au tableau de resultat (\"resultArray\"), je fais une boucle while tant que le tableau de résultats n\'est pas égale au tableau initiale c\'est qu\'il faut rajouter encore des valeurs et continuer la boucle, splice modifie le tableau et \"array.splice(index, 1)\" permet de supprimer l\'élément à l\'index voulu, ici l\'index du nombre qu\'on a ajouté au tableau de résultat.

', '[{\"name\": \"numbersList\", \"type\": \"text\", \"label\": \"Entrez une liste de nombres (séparées par des virgules) :\", \"placeholder\": \"(e.g : 4, 12, 1, 8)\"}]', 1, '2020-05-06 20:57:48', '2020-05-08 13:17:26', 2); \ No newline at end of file diff --git a/api/assets/functions/main/convertTemperature.js b/api/assets/functions/main/convertTemperature.js index bb4b59e..2940dbb 100644 --- a/api/assets/functions/main/convertTemperature.js +++ b/api/assets/functions/main/convertTemperature.js @@ -7,7 +7,7 @@ const formatNumberResult = require('../secondary/formatNumberResul * @param {Number} degree - Nombre de degrès * @param {String} unit - Unité du nombre (°C ou °F) après conversion * @returns {Object} false si arguments non valides et sinon un objet contenant la string et le nombre résultat - * @examples convertTemperature(23, '°C') → { result: 73.4, resultHTML: "73.4 °F" } + * @examples convertTemperature(23, '°F') → { result: 73.4, resultHTML: "73.4 °F" } */ function convertTemperature(degree, unit) { let temperatureValue = 0; diff --git a/api/package-lock.json b/api/package-lock.json index 0905b35..f2a1fde 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,6 +1,6 @@ { - "name": "backend", - "version": "1.0.0", + "name": "api", + "version": "2.0.0", "lockfileVersion": 1, "requires": true, "dependencies": {