Code Documentation

This commit is contained in:
Divlo 2019-11-11 17:55:52 +01:00
parent 7da569db96
commit 4056781fac
32 changed files with 18680 additions and 108 deletions

View File

@ -8,8 +8,6 @@
Le projet est disponible sur [function.divlo.fr](https://function.divlo.fr/).
[Projet uniquement en français]
[![FunctionProject](./img/FunctionProject.png)](https://function.divlo.fr/)
## Installation
@ -35,39 +33,9 @@ Enjoy! =D
* [jQuery UI](https://jqueryui.com/)
* [Moment.js](https://momentjs.com/)
## La liste des Fonctions Principales :
> Les fonctions principales se trouvent dans /scripts/fonctions_principales.js, n'hésitez pas à reprendre les fonctions pour vos projets personnels.
## Documentation
Pour le moment dans le dossier ```/__documentation```, bientôt un README.md pour bien comprendre comment fonctionne la doc.
La documentation est disponible sur [function.divlo.fr/__documentation](https://function.divlo.fr/__documentation).
| Nom | Description | Paramètre(s) |
| -- | -- | -- |
| **weatherRequest()** | Affiche la météo et l'heure locale grâce à l'API : [openweathermap.org](https://openweathermap.org/). | Aucun paramètre, le nom de la ville où il faut récupérer la météo se récupère en php grâce au cookie fait en Javascript (voir main.js) |
| **randomNumber(min, max)** | Génère un nombre aléatoire entre un minimum inclus et un maximum inclus. | - min : Nombre Minimum - max : Nombre Maximum |
| **calculateAge(birthDate)** | Calcule l'âge de quelqu'un selon ça date de naissance. | - birthDate : date de naissance au format (dd/mm/yyyy). |
| **convertTemperature(degree,unit)** | Convertit des Degré Celsius en Degré Fahrenheit et l'inverse aussi. | - degre : Le nombre que vous voulez convertir - unite : l'unité du nombre que vous voulez convertir (°C ou °F) |
| **convertDistance (firstValue, unitFirstValue, unitFinalValue)** | Convertit la longueur (distance) avec les unités allant de picomètre au Téramètre. | - firstValue : Le nombre que vous voulez convertir - unitFirstValue : l'unité du nombre que vous voulez convertir - unitFinalValue : l'unité de votre nombre après la conversion |
| **filterStudents(filteredLetter, students)** | Affiche uniquement les prénoms (qui sont dans la liste) qui commence par la lettre souhaitée. | - filteredLetter : la lettre à filtré - students : la liste des prénoms |
| **randomQuote()** | Génère aléatoirement une citation ou un proverbe. | Aucun paramètre |
| **convertCurrency(value, currency, url)** | Convertis une valeur dans une devise dans une autre devise grâce à l'API [exchangeratesapi.io](https://exchangeratesapi.io/). | - value : la valeur à convertir - currency : la devise à avoir après conversion - url : l'url de la requête à l'API en fonction du paramètre dans l'url '?base=' |
| **convertArabicToRoman(nombre)** | Convertis un nombre arabe en nombre romain. | - nombre : le nombre à convertir |
| **convertRomanToArabic(str)** | Convertis un nombre romain en nombre arabe. | - str : le nombre romain à convertir |
| **armstrongNumber(nombre)** | Vérifie si un nombre fait partie des nombres d'Armstrong. | - nombre : le nombre à tester |
| **stringPermutations(string)** | Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot | - string : le mot |
## La liste des Fonctions Annexes :
> Les fonctions annexes se trouvent dans /scripts/fonctions_annexes.js, n'hésitez pas à reprendre les fonctions pour vos projets personnels.
| Nom | Description | Paramètre(s) |
| -- | -- | -- |
| **isEmptyValue(value)** | Vérifie si une valeur est vide. | - value : valeur à testé |
| **formatNumberResult(num)** | Formate les nombres avec des espaces (ex : 76120 = 76 120). | - num : nombre à formaté |
| **isFloat(value)** | Vérifie si une string est un float (integer exclu). | - value : valeur à testé |
| **convertPuissanceToNumber(num)** | Convertit les puissances de 10 en nombre (ex: 1e+5 = 100 000). | - num : nombre à formaté |
| **capitalize (s)** | Majuscule à la 1ère lettre d'une string. | - s : string à formaté |
| **dateTimeUTC(utc)** | Donne la date et l'heure selon l'UTC (Universal Time Coordinated). | - utc : heure de décalage avec l'utc |
| **showDateTime(enteredOffset)** | Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00). | - enteredOffset : date à formaté |
| **realDateTime(id)** | Affiche l'heure en temps réel. | - id : l'id de votre span/div où vous voulez afficher l'heure en temps réel |
| **isValidDate(s)** | Vérifie si une date est valide par rapport à la date d'aujourd'hui. | - s : la date à verifier (format : dd/mm/yyyy) |
| **createSessionCookie(name, value)** | Créer un cookie de session | - name : nom du cookie - value : valeur du cookie |
## License
## Licence
Ce projet est sous licence MIT - voir le fichier [LICENSE](./LICENSE) pour plus de détails.

View File

@ -0,0 +1,211 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: fonctions_annexes.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: fonctions_annexes.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/* Fonctions Annexes */
/**
* @function isEmptyValue
* @description Vérifie si une valeur est vide.
* @param {string} value
* @returns {boolean}
* @example isEmptyValue(null) → true
*/
function isEmptyValue(value) {
return value === '' || value === null || value === undefined;
}
/**
* @function formatNumberResult
* @description Formate un nombre avec des espaces.
* @param {number} num
* @returns {(number|string)} - Le nombre formaté soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example formatNumberResult(76120) → '76 120'
*/
function formatNumberResult(num) {
if(!isNaN(num) &amp;&amp; num >= 1000) {
return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 ');
}
else {
return num;
}
}
/**
* @function isFloat
* @description Vérifie si une string est un float (integer exclu).
* @param {number} value
* @returns {boolean}
* @example isFloat(76120.474) → true
*/
function isFloat(value) {
return !isNaN(value) &amp;&amp; value.toString().includes('.');
}
/**
* @function capitalize
* @description Majuscule à la 1ère lettre d'une string.
* @param {string} s
* @returns {string}
* @example capitalize('hello world!') → 'Hello world!'
*/
function capitalize(s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
/**
* @function dateTimeUTC
* @description Donne la date et l'heure selon l'UTC (Universal Time Coordinated).
* @requires {@link fonctions_annexes.js: showDateTime}
* @requires {@link variables.js: timeNow, utcOffset, timeNow.setMinutes(timeNow.getMinutes() + utcOffset)}
* @param {string} utc Heure de décalage par rapport à l'UTC
* @returns {function} → showDateTime(enteredOffset) → Retourne l'exécution de la fonction showDateTime
* @example dateTimeUTC('0')
*/
function dateTimeUTC(utc) {
const enteredOffset = parseFloat(utc)*60;
timeNow.setMinutes(timeNow.getMinutes() + enteredOffset);
return showDateTime(enteredOffset);
}
/**
* @function showDateTime
* @description Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00).
* @requires {@link fonctions_annexes.js: showDateTime}
* @param {string} utc Heure de décalage par rapport à l'UTC
* @returns {object} Retourne un objet contenant l'année, le mois, le jour, l'heure, les minutes, les secondes et la date formaté
* @example dateTimeUTC('0') → dateTimeUTC vous renvoie l'exécution de showDateTime
*/
function showDateTime(enteredOffset) {
const year = timeNow.getFullYear();
const month = ('0'+(timeNow.getMonth()+1)).slice(-2);
const day = ('0'+timeNow.getDate()).slice(-2);
const hour = ('0'+timeNow.getHours()).slice(-2);
const minute = ('0'+timeNow.getMinutes()).slice(-2);
const second = ('0'+timeNow.getSeconds()).slice(-2);
const showDateTimeValue = day + "/" + month + "/" + year + " - " + hour + ":" + minute + ":" + second;
const objectDateTime = {
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second,
showDateTimeValue: showDateTimeValue
};
timeNow.setMinutes(timeNow.getMinutes() - enteredOffset)
return objectDateTime;
}
/**
* @function realDateTime
* @description Affiche l'heure en temps réel.
* @param {string} id
* @returns {boolean} true → Toujours true
* @example window.onload = realDateTime('realDateTime') → va afficher l'heure en temps réel au chargement de la page dans la balise avec l'id realDateTime
*/
function realDateTime(id) {
const realDateTimeNow = new Date;
// const year = realDateTimeNow.getFullYear();
// const month = ('0'+(realDateTimeNow.getMonth()+1)).slice(-2);
// const day = ('0'+realDateTimeNow.getDate()).slice(-2);
const hour = ('0'+realDateTimeNow.getHours()).slice(-2);
const minute = ('0'+realDateTimeNow.getMinutes()).slice(-2);
const second = ('0'+realDateTimeNow.getSeconds()).slice(-2);
const resultat = hour + ":" + minute + ":" + second;
document.getElementById(id).innerHTML = resultat;
setTimeout('realDateTime("'+id+'");','1000');
return true;
}
/**
* @function isValidDate
* @description Vérifie si une date est valide (si la variable verifyDate a déjà exister avant la variable currentDate).
* @param {string} verifyDate (format : dd/mm/yyyy) sachant qu'il faut faire -1 au mois car de 0 à 11 donc par exemple 14/12/2019 sera le 14 novembre 2019
* @param {string} currentDate (format : dd/mm/yyyy) pas besoin de faire -1 au mois donc par exemple 14/12/2019 sera le 14 décembre 2019
* @returns {boolean}
* @example
* isValidDate('10/11/2019', '11/11/2019') → false → Comparaison entre le 10 décembre 2019 et le 11 novembre 2019
* isValidDate('10/10/2019', '11/11/2019') → true → Comparison entre le 10 novembre 2019 et le 11 novembre 2019
*/
function isValidDate(verifyDate, currentDate) {
// Date à vérifier
const toVerifyDate = verifyDate.split('/');
const splitedToVerifyDate = toVerifyDate[2] + '-' + (parseInt(toVerifyDate[1]) + 1) + '-' + toVerifyDate[0];
const msToVerifyDate = Date.parse(splitedToVerifyDate);
// Date courante
currentDate = currentDate.substr(0,10);
const currentDateSplited = currentDate.split('/');
const currentDateFormat = currentDateSplited[2] + '-' + currentDateSplited[1] + '-' + currentDateSplited[0];
const msCurrentDate = Date.parse(currentDateFormat);
if(msToVerifyDate &lt;= msCurrentDate) {
return true;
} else if(msToVerifyDate > msCurrentDate) {
return false;
} else {
return messageError;
}
}
/**
* @function createSessionCookie
* @description Créer un cookie de session.
* @param {string} name Nom du cookie
* @param {string} value Valeur du cookie
*/
function createSessionCookie(name, value) {
document.cookie = escape(name) + "=" + escape(value) + " ; path=/";
} </code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#armstrongNumber">armstrongNumber</a></li><li><a href="global.html#binaryToDecimal">binaryToDecimal</a></li><li><a href="global.html#binaryToHexadecimal">binaryToHexadecimal</a></li><li><a href="global.html#binaryToText">binaryToText</a></li><li><a href="global.html#calculateAge">calculateAge</a></li><li><a href="global.html#capitalize">capitalize</a></li><li><a href="global.html#convertArabicToRoman">convertArabicToRoman</a></li><li><a href="global.html#convertCurrency">convertCurrency</a></li><li><a href="global.html#convertDistance">convertDistance</a></li><li><a href="global.html#convertRomanToArabic">convertRomanToArabic</a></li><li><a href="global.html#convertTemperature">convertTemperature</a></li><li><a href="global.html#createSessionCookie">createSessionCookie</a></li><li><a href="global.html#dateTimeUTC">dateTimeUTC</a></li><li><a href="global.html#decimalToBinary">decimalToBinary</a></li><li><a href="global.html#decimalToHexadecimal">decimalToHexadecimal</a></li><li><a href="global.html#filterStudents">filterStudents</a></li><li><a href="global.html#formatNumberResult">formatNumberResult</a></li><li><a href="global.html#getRandomQuote">getRandomQuote</a></li><li><a href="global.html#hexadecimalToBinary">hexadecimalToBinary</a></li><li><a href="global.html#hexadecimalToDecimal">hexadecimalToDecimal</a></li><li><a href="global.html#hexadecimalToText">hexadecimalToText</a></li><li><a href="global.html#isEmptyValue">isEmptyValue</a></li><li><a href="global.html#isFloat">isFloat</a></li><li><a href="global.html#isValidDate">isValidDate</a></li><li><a href="global.html#numberUnicodeToText">numberUnicodeToText</a></li><li><a href="global.html#randomNumber">randomNumber</a></li><li><a href="global.html#realDateTime">realDateTime</a></li><li><a href="global.html#showDateTime">showDateTime</a></li><li><a href="global.html#stringPermutations">stringPermutations</a></li><li><a href="global.html#textToBinary">textToBinary</a></li><li><a href="global.html#textToHexadecimal">textToHexadecimal</a></li><li><a href="global.html#textToNumberUnicode">textToNumberUnicode</a></li><li><a href="global.html#weatherRequest">weatherRequest</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a> on Mon Nov 11 2019 17:45:44 GMT+0100 (GMT+01:00)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

View File

@ -0,0 +1,635 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: fonctions_principales.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: fonctions_principales.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/* Fonctions Principales */
/**
* @function weatherRequest
* @description Affiche la météo et l'heure locale grâce à l'API : openweathermap.org.
* Le nom de la ville se récupère en Javascript qui créé un cookie pour récupérer cette variable en php.
* Ainsi PHP va récupérer le JSON de l'api openweathermap.org puis ajax va se charger d'afficher le résultat.
* Plus d'informations : {@link /scripts/main.js} et {@link /php/getWeatherJson.php}
* @requires {@link fonctions_annexes.js: formatNumberResult, dateTimeUTC, showDateTime, capitalize}
* @see {@link https://jquery.com/} Requête en AJAX avec jQuery
* @see {@link https://openweathermap.org/} API de météo
* @example
* Ajoute au DOM de la page dans la div .results, la météo de la ville demandée.
*/
function weatherRequest() {
$.ajax({
url: '/php/getWeatherJson.php',
type: "POST",
success: function(data) {
try {
const json = jQuery.parseJSON(data);
const city = json.name;
const showDateTimeValue = dateTimeUTC((json.timezone / 60 / 60).toString()).showDateTimeValue;
$('.results').html(`🌎 Position : &lt;a href='https://www.google.com/maps/search/?api=1&amp;query=${json.coord.lat},${json.coord.lon}' class="yellow-color" target="_blank">${city}, ${json.sys.country}&lt;/a>&lt;br>⏰ Date et heure : ${showDateTimeValue}&lt;br>☁️ Météo : ${capitalize(json.weather[0].description)}&lt;br> 🌡️ Température : ${json.main.temp} °C&lt;br> 💧 Humidité : ${json.main.humidity}% &lt;br> &lt;img src="https://openweathermap.org/img/wn/${json.weather[0].icon}@2x.png"/>`);
}
catch(error) {
$('.results').html("La ville que vous avez rentré n'existe pas (dans l'API).");
}
}
});
}
/**
* @function randomNumber
* @description Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.
* @param {number} min Nombre Minimum
* @param {number} max Nombre Maximum
* @returns {number} Nombre aléatoire
* @example randomNumber(1, 2) → retourne soit 1 ou 2
*/
function randomNumber(min, max) {
if (!isNaN(min) &amp;&amp; !isNaN(max)) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min +1)) + min;
}
else {
return messageError;
}
}
/**
* @function calculateAge
* @description Calcule l'âge de quelqu'un selon ça date de naissance.
* @requires {@link fonctions_annexes.js: formatNumberResult, isValidDate}
* @requires {@link "external:moment.js"}
* @see {@link https://momentjs.com/}
* @param {string} birthDateEntered - Date de naissance (dd/mm/yyyy)
* @returns {string} - L'âge en jours, mois et années
* @example calculateAge('31/03/2003')
*/
function calculateAge(birthDateEntered) {
// Les variables de la fonction
const birthDateDay = parseInt(birthDateEntered.substring(0, 2));
const birthDateMonth = parseInt((birthDateEntered.substring(3, 5)) - 1);
const birthDateYear = parseInt(birthDateEntered.substring(6, 10));
const currentDateObject = dateTimeUTC('0');
const day = parseInt(currentDateObject.day);
const month = parseInt(currentDateObject.month - 1);
const year = parseInt(currentDateObject.year);
let dateNow = moment([year, month, day]);
let birthDate = moment([birthDateYear, birthDateMonth, birthDateDay]);
// Calcule l'âge - Moment.js
let ageYears = dateNow.diff(birthDate, 'year');
birthDate.add(ageYears, 'years');
let ageMonths = dateNow.diff(birthDate, 'months');
birthDate.add(ageMonths, 'months');
let ageDays = dateNow.diff(birthDate, 'days');
const isValidDateFunction = isValidDate(birthDateDay + '/' + birthDateMonth + '/' + birthDateYear, currentDateObject.showDateTimeValue);
// Vérifie si la valeur entrée correspond à une date de naissance valide
if(isValidDateFunction === true &amp;&amp; !isNaN(ageDays)) {
ageYears = formatNumberResult(ageYears);
// Si c'est ton anniversaire aujourd'hui
if(birthDateDay === day &amp;&amp; parseInt(birthDateMonth) === month) {
return 'Vous avez ' + ageYears + ' ans. Joyeux Anniversaire! 🥳';
}
else {
return 'Vous avez ' + ageYears + ' ans, ' + ageMonths + ' mois et ' + ageDays + ' jour(s).';
}
}
else {
return messageError;
}
}
/**
* @function convertTemperature
* @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)
* @returns {string} - degree unit = temperatureValue
* @example convertTemperature(23, '°C') → 23 °C = 73.4 °F
*/
function convertTemperature(degree, unit) {
if (!isNaN(degree) &amp;&amp; unit === "°C") {
const temperatureValue = ((degree * 9/5) + 32) + " °F";
return degree + " " + unit + " = " + temperatureValue;
}
else if (!isNaN(degree) &amp;&amp; unit === "°F") {
const temperatureValue = (degree - 32) * 5/9 + " °C";
return degree + " " + unit + " = " + temperatureValue;
}
else {
return messageError;
}
}
/**
* @function convertDistance
* @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 {string} - Conversion de longueur : firstValue unitFirstValue = result
* @example convertDistance(500, 'cm', 'm') → Conversion de longueur : 500 cm = 5 m
*/
function convertDistance (firstValue, unitFirstValue, unitFinalValue) {
const reference = ["pm",null,null,"nm",null,null,"µm",null,null,"mm","cm","dm","m","dam","hm","km",null,null,"Mm",null,null,"Gm",null,null,"Tm"];
const index1 = reference.indexOf(unitFirstValue);
const index2 = reference.indexOf(unitFinalValue);
// Condition qui vérifie si les valeurs entrées sont justes
if (!isNaN(firstValue) &amp;&amp; typeof unitFirstValue === 'string' &amp;&amp; typeof unitFinalValue === 'string' &amp;&amp; (index1.toString() &amp;&amp; index2.toString()) != '-1') {
// Conversion des longueurs :
const difference = index1 - index2;
const result = firstValue*Math.pow(10,difference);
return 'Conversion de longueur : ' + formatNumberResult(firstValue).toString() + ' ' + unitFirstValue + ' = ' + formatNumberResult(result) + ' ' + unitFinalValue;
}
else {
return messageError;
}
}
/**
* @function filterStudents
* @description Affiche uniquement les prénoms (qui sont dans la liste) qui commencent par la lettre souhaitée.
* @param {string} filteredLetter - La lettre à filtré
* @param {array} students - La liste des prénoms
* @returns {string} - Prénoms qui commence par filteredLetter (totalfilteredLetterStudents) : filteredStudents
* @example filterStudents('P', ['Prénom1', 'Prénom2', 'Divlo']) → Prénoms qui commence par P (2) : Prénom1 et Prénom2.
*/
function filterStudents(filteredLetter, students)
{
let filteredStudents = [];
for(let i = 0; i &lt; students.length; i++) {
let studentBoucle = capitalize(students[i]);
if (studentBoucle[0] === filteredLetter) {
filteredStudents.push(studentBoucle);
}
}
if (filteredStudents.length === 1) {
return ("Prénom qui commence par " + filteredLetter + " : " + filteredStudents + '.');
}
else if (filteredStudents.length >= 2) {
// Affiche la liste des prénoms...
const last = filteredStudents[filteredStudents.length - 1]; // Accéde au dernier élément du tableau
const totalfilteredLetterStudents = filteredStudents.length;
filteredStudents.pop(); // Supprime le dernier élément du tableau
// filteredStudents.join(', ') permet de rajouter un espace entre chaque élément du tableau
return ("Prénoms qui commence par " + filteredLetter + " (" + totalfilteredLetterStudents + ") : " + filteredStudents.join(', ') + ' et ' + last + '.');
}
else {
return ("Il n'y a pas de prénom commencant par " + filteredLetter + ".");
}
}
/**
* @function getRandomQuote
* @description Génère aléatoirement une citation ou un proverbe.
* @requires {@link variables.js: quotes}
* @requires {@link fonctions_principales.js: randomNumber}
* @returns {string} - une citation au hasard à partir de la constante 'quotes' dans variables.js
* @example getRandomQuote() → " Ne fais jamais rien contre ta conscience, même si l'Etat te le demande. " &lt;br> &lt;br> - Albert Einstein
*/
function getRandomQuote() {
const randomNbr = randomNumber(0, (quotes.length - 1));
const randomQuotes = quotes[randomNbr];
return '" ' + randomQuotes["quote"] + ' " &lt;br> &lt;br> - ' + randomQuotes["source"];
}
/**
* @function convertCurrency
* @description Convertis une valeur dans une devise dans une autre devise grâce à l'API exchangeratesapi.io.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @requires {@link variables.js: correspondancesMonnaie}
* @see {@link https://jquery.com/} Requête en AJAX avec jQuery
* @see {@link https://api.exchangeratesapi.io/} API de taux de change
* @param {number} value - la valeur à convertir
* @param {string} currency - la devise à avoir après conversion
* @param {string} url - l'url de la requête à l'API en fonction du paramètre dans l'url '?base='
* @example convertCurrency(50, "$ Américain", "https://api.exchangeratesapi.io/latest?base=EUR")
* Ajoute au DOM de la page dans la div .results et .rateDate :
* 50 EUR = 55.17 $ Américain
* Dernier rafraîchissement du taux d'échange : 08/11/2019
*/
function convertCurrency(value, currency, url) {
function currencyTest(currencyToTest) {
for (let index in correspondancesMonnaie) {
if(currencyToTest === correspondancesMonnaie[index]['currency']) {
return correspondancesMonnaie[index]['symbol'];
}
continue;
}
}
$.ajax({
url : url,
dataType : "json",
success: function (jsonFixer) {
try {
let currencySymboleAPI = eval(`jsonFixer.rates.${currencyTest(currency)}`);
if (currencySymboleAPI === undefined) {
currencySymboleAPI = 1;
}
$('.results').html(formatNumberResult(value) + ' ' + jsonFixer.base + ' = ' + formatNumberResult((currencySymboleAPI * value).toFixed(2)) + ' ' + currency);
$('.rateDate').html(`Dernier rafraîchissement du taux d'échange : ${jsonFixer.date[8] + jsonFixer.date[9]}/${jsonFixer.date[5] + jsonFixer.date[6]}/${jsonFixer.date[0] + jsonFixer.date[1] + jsonFixer.date[2] + jsonFixer.date[3]}`);
}
catch (error) {
$('.results').html(messageError);
}
}
});
}
// Convertis des nombres de différentes bases et convertis en UTF-8. (source : http://jsfiddle.net/47zwb41o)
/**
* @function decimalToBinary
* @description Convertis un nombre décimal en binaire.
* @param {string} value - Le nombre à convertir en string
* @returns {string} - Le nombre en binaire
* @example decimalToBinary('2') → '10'
*/
function decimalToBinary(value) {
value = value.replace(" ", "");
value = Number(value);
if (isNaN(value)) {
return messageError;
} else {
return value.toString(2);
}
}
/**
* @function binaryToDecimal
* @description Convertis un nombre binaire en décimal.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @param {string} value - Le nombre à convertir
* @returns {(number|string)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example binaryToDecimal('10') → 2
*/
function binaryToDecimal(value) {
const result = parseInt(Number(value), 2);
if (isNaN(result)) {
return messageError;
} else {
return formatNumberResult(result);
}
}
/**
* @function decimalToHexadecimal
* @description Convertis un nombre décimal en hexadécimal.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en hexadécimal
* @example decimalToHexadecimal('15') → 'F'
*/
function decimalToHexadecimal(value) {
value = value.replace(" ", "");
value = Number(value);
if (isNaN(value)) {
return messageError;
} else {
return value.toString(16).toUpperCase();
}
}
/**
* @function hexadecimalToDecimal
* @description Convertis un nombre hexadécimal en décimal.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @param {string} value - Le nombre à convertir
* @returns {(number|string)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example hexadecimalToDecimal('F') → 15
*/
function hexadecimalToDecimal(value) {
const result = parseInt(value, 16);
if (isNaN(result)) {
return messageError;
} else {
return formatNumberResult(result);
}
}
/**
* @function binaryToHexadecimal
* @description Convertis un nombre binaire en hexadécimal.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en hexadécimal
* @example binaryToHexadecimal('1111') → 'F'
*/
function binaryToHexadecimal(value) {
value = Number(value);
value = parseInt(value, 2);
if (isNaN(value)) {
return messageError;
} else {
return parseInt(value).toString(16).toUpperCase();
}
}
/**
* @function hexadecimalToBinary
* @description Convertis un nombre hexadécimal en binaire.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en binaire
* @example hexadecimalToBinary('F') → '1111'
*/
function hexadecimalToBinary(value) {
value = parseInt(value, 16);
if (isNaN(value)) {
return messageError;
} else {
return parseInt(value).toString(2);
}
}
/**
* @function textToNumberUnicode
* @description Convertis chaque caractère d'une string en codePoint Unicode.
* @param {string} value - La chaîne de caractère à convertir
* @returns {string}
* @example textToNumberUnicode('abc') → '97 98 99'
*/
function textToNumberUnicode(string) {
try {
let resultat = "";
for (let index in string) {
resultat = resultat + string.codePointAt(index) + " ";
}
return resultat;
}
catch(error) {
return messageError;
}
}
/**
* @function numberUnicodeToText
* @description Convertis chaque codePoint Unicode en caractère.
* @param {string} string - Nombre Unicode à convertir espacé par un espace à chaque fois
* @returns {string}
* @example numberUnicodeToText('97 98 99') → 'abc'
*/
function numberUnicodeToText(string) {
try {
const array = string.split(" ");
let resultat = "";
for (let index in array) {
resultat = resultat + String.fromCodePoint(parseInt(array[index]).toString());
}
return resultat;
}
catch(error) {
return messageError;
}
}
/**
* @function textToBinary
* @description Convertis un Texte en Binaire (UTF-8).
* @param {string} s - La chaîne de caractère à convertir
* @returns {string}
* @example textToBinary('abc') → '01100001 01100010 01100011'
*/
function textToBinary(s) {
try {
s = unescape( encodeURIComponent(s));
let chr, i = 0, l = s.length, out = '';
for( ; i &lt; l; i ++ ){
chr = s.charCodeAt( i ).toString(2);
while(chr.length % 8 != 0 ){ chr = '0' + chr; }
out += chr;
}
return out.replace(/(\d{8})/g, '$1 ').replace(/(^\s+|\s+$)/,'');
} catch (error) {
return s;
}
}
/**
* @function binaryToText
* @description Convertis du Binaire (UTF-8) en Texte.
* @param {string} s - La chaîne de caractère contenant tous les octets à convertir
* @returns {string}
* @example binaryToText('01100001 01100010 01100011') → 'abc'
*/
function binaryToText(s){
try {
s = s.replace(/\s/g,'')
let i = 0, l = s.length, chr, out = '';
for( ; i &lt; l; i += 8){
chr = parseInt( s.substr(i, 8 ), 2).toString(16);
out += '%' + ((chr.length % 2 == 0) ? chr : '0' + chr);
}
return decodeURIComponent(out);
} catch (error) {
return s;
}
}
/**
* @function textToHexadecimal
* @description Convertis un Texte en Hexadécimal (UTF-8).
* @param {string} s - La chaîne de caractère à convertir
* @returns {string}
* @example textToHexadecimal('abc') → '61 62 63'
*/
function textToHexadecimal (s) {
try {
s = unescape( encodeURIComponent( s ) );
let chr, i = 0, l = s.length, out = '';
for( ; i &lt; l; i++ ){
chr = s.charCodeAt( i ).toString( 16 );
out += ( chr.length % 2 == 0 ) ? chr : '0' + chr;
out += " ";
}
return out.toUpperCase();
}
catch (error) {
return s;
}
}
/**
* @function hexadecimalToText
* @description Convertis de l'Hexadécimal (UTF-8) en Texte.
* @param {string} s - La chaîne de caractère contenant tous les nombres Hexadécimal à convertir
* @returns {string}
* @example hexadecimalToText('61 62 63') → 'abc'
*/
function hexadecimalToText (s) {
try {
s = s.replace(/\s/g,'');
return decodeURIComponent( s.replace( /../g, '%$&amp;' ) );
}
catch (error) {
return s;
}
}
/**
* @function convertArabicToRoman
* @description Convertis un nombre arabe en nombre romain.
* @requires {@link variables.js: correspondancesRomainArabe}
* @param {number} nombre - Le nombre arabe à convertir
* @returns {string}
* @example convertArabicToRoman(24) → 'XXIV'
*/
function convertArabicToRoman(nombre) {
// Initialisation de la variable qui va contenir le résultat de la conversion
let chiffresRomains = "";
/*
Étapes pour écrire un nombre romain :
On vérifie quand le nombre arabe est >= à la plus grande valeur possible dans la table de correspondance des nombres romains de haut en bas puis on rajoute la lettre romaine correspondante à la plus grande valeur possible dans la variable chiffresRomains et on soustrait la valeur du chiffre romain qu'on vient d'ajouter au nombre arabe puis on répète l'opération jusqu'à nombre arabe vaut 0...
Exemple avec 27 :
27 - X (10) = 17
17 - X (10) = 7
7 - V (5) = 2
2 - I (1) = 1
1 - I (1) = 0
XXVII
*/
function extraireChiffreRomain(valeurLettre, lettres) {
while (nombre >= valeurLettre) {
chiffresRomains = chiffresRomains + lettres;
nombre = nombre - valeurLettre;
}
}
correspondancesRomainArabe.forEach(correspondance => {
extraireChiffreRomain(correspondance[0], correspondance[1]);
});
if (chiffresRomains === '') {
return messageError;
} else {
return chiffresRomains;
}
}
/**
* @function convertRomanToArabic
* @description Convertis un nombre romain en nombre arabe.
* @requires {@link variables.js: correspondancesRomainArabe}
* @param {string} str - Le nombre romain à convertir
* @returns {number}
* @example convertRomanToArabic('XXIV') → 24
*/
function convertRomanToArabic(str) {
let result = 0;
for (let i = 0;i &lt; correspondancesRomainArabe.length; i++) {
while (str.indexOf(correspondancesRomainArabe[i][1]) === 0){
// Adding the decimal value to our result counter
result += correspondancesRomainArabe[i][0];
// Remove the matched Roman letter from the beginning
str = str.replace(correspondancesRomainArabe[i][1],'');
}
}
if (str != '') {
result = 0;
}
return result;
}
/**
* @function armstrongNumber
* @description Vérifie si un nombre fait partie des nombres d'Armstrong.
* @param {number} number - Le nombre à tester
* @returns {string}
* @example armstrongNumber(153) → 153 est un nombre d'Armstrong, car 1&lt;sup>3&lt;/sup> + 5&lt;sup>3&lt;/sup> + 3&lt;sup>3&lt;/sup> = 153.
*/
function armstrongNumber(number) {
let numberString = number.toString();
let numberStringLength = numberString.length;
let result = 0;
let resultString = "";
for (let i = 0; i &lt; numberStringLength; i++) {
result = result + parseInt(numberString[i])**numberStringLength;
resultString = resultString + " + " + numberString[i] + "&lt;sup>" + numberStringLength + "&lt;/sup>";
}
number = formatNumberResult(number);
if (result === number) {
return `${number} est un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.`;
} else {
return `${number} n'est pas un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.`;
}
}
/**
* @function stringPermutations
* @description Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot.
* @param {string} string - La chaîne de caractère à permuter
* @returns {array}
* @example stringPermutations('abc') → ["abc", "acb", "bac", "bca", "cab", "cba"]
*/
function stringPermutations(string) {
let results = [];
if (string.length === 1) {
results.push(string);
return results;
}
for (let i = 0; i &lt; string.length; i++) {
let firstChar = string[i];
let charsLeft = string.substring(0, i) + string.substring(i + 1);
let innerPermutations = stringPermutations(charsLeft);
for (let i = 0; i &lt; innerPermutations.length; i++) {
results.push(firstChar + innerPermutations[i]);
}
}
return results;
} </code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3>Global</h3><ul><li><a href="global.html#armstrongNumber">armstrongNumber</a></li><li><a href="global.html#binaryToDecimal">binaryToDecimal</a></li><li><a href="global.html#binaryToHexadecimal">binaryToHexadecimal</a></li><li><a href="global.html#binaryToText">binaryToText</a></li><li><a href="global.html#calculateAge">calculateAge</a></li><li><a href="global.html#capitalize">capitalize</a></li><li><a href="global.html#convertArabicToRoman">convertArabicToRoman</a></li><li><a href="global.html#convertCurrency">convertCurrency</a></li><li><a href="global.html#convertDistance">convertDistance</a></li><li><a href="global.html#convertRomanToArabic">convertRomanToArabic</a></li><li><a href="global.html#convertTemperature">convertTemperature</a></li><li><a href="global.html#createSessionCookie">createSessionCookie</a></li><li><a href="global.html#dateTimeUTC">dateTimeUTC</a></li><li><a href="global.html#decimalToBinary">decimalToBinary</a></li><li><a href="global.html#decimalToHexadecimal">decimalToHexadecimal</a></li><li><a href="global.html#filterStudents">filterStudents</a></li><li><a href="global.html#formatNumberResult">formatNumberResult</a></li><li><a href="global.html#getRandomQuote">getRandomQuote</a></li><li><a href="global.html#hexadecimalToBinary">hexadecimalToBinary</a></li><li><a href="global.html#hexadecimalToDecimal">hexadecimalToDecimal</a></li><li><a href="global.html#hexadecimalToText">hexadecimalToText</a></li><li><a href="global.html#isEmptyValue">isEmptyValue</a></li><li><a href="global.html#isFloat">isFloat</a></li><li><a href="global.html#isValidDate">isValidDate</a></li><li><a href="global.html#numberUnicodeToText">numberUnicodeToText</a></li><li><a href="global.html#randomNumber">randomNumber</a></li><li><a href="global.html#realDateTime">realDateTime</a></li><li><a href="global.html#showDateTime">showDateTime</a></li><li><a href="global.html#stringPermutations">stringPermutations</a></li><li><a href="global.html#textToBinary">textToBinary</a></li><li><a href="global.html#textToHexadecimal">textToHexadecimal</a></li><li><a href="global.html#textToNumberUnicode">textToNumberUnicode</a></li><li><a href="global.html#weatherRequest">weatherRequest</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a> on Mon Nov 11 2019 17:45:44 GMT+0100 (GMT+01:00)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

5607
__documentation/global.html Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Home</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">FunctionProject</h1>
<h3> </h3>
<section>
<article>
<p><img src="https://cloud.divlo.fr/public_files/others/Trash/under_dev.svg" alt="Badge Status"></p>
<p><a href="https://divlo.fr/">À propos de Divlo</a> | <a href="https://www.youtube.com/c/Divlo">Youtube</a> | <a href="https://www.twitch.tv/divlo">Twitch</a> | <a href="https://twitter.com/Divlo_FR">Twitter</a> | <a href="mailto:contact@divlo.fr">E-mail</a></p>
<h2>À propos de FunctionProject</h2>
<p><a href="https://function.divlo.fr/">FunctionProject</a> est un projet créé par <a href="https://divlo.fr/">Divlo</a> qui a pour but de rassembler plein de mini-programmes permettant de faire plusieurs choses comme <strong>savoir la météo</strong>, générer un <strong>nombre aléatoire</strong>, etc.</p>
<p>Le projet est disponible sur <a href="https://function.divlo.fr/">function.divlo.fr</a>.</p>
<p><a href="https://function.divlo.fr/"><img src="../img/FunctionProject.png" alt="FunctionProject"></a></p>
<h2>Installation</h2>
<p><strong>Note :</strong> Vous aurez besoin dun serveur Apache pour utiliser PHP (exemple: <a href="https://www.apachefriends.org">XAMPP</a>).</p>
<p>Cloner le dépôt en utilisant git :</p>
<pre class="prettyprint source lang-text"><code>git clone https://github.com/Divlo/FunctionProject
</code></pre>
<p>Puis créer un nouveau fichier dans <code>/php</code> du nom de <code>keyVariable.php</code>, puis vous mettrez ce code à l'intérieur, il faudra modifier la valeur de la variable '$apiWeather' par votre clé d'api de <a href="https://openweathermap.org/">openweathermap.org</a>.</p>
<pre class="prettyprint source lang-php"><code>&lt;?php
$apiWeather = 'votre clé api pour openweathermap.org';
</code></pre>
<p>Enjoy! =D</p>
<h2>Librairies</h2>
<ul>
<li><a href="https://fontawesome.com/">Fontawesome</a></li>
<li><a href="https://getbootstrap.com/">Bootstrap</a></li>
<li><a href="https://jquery.com/">jQuery</a></li>
<li><a href="https://jqueryui.com/">jQuery UI</a></li>
<li><a href="https://momentjs.com/">Moment.js</a></li>
</ul>
<h2>Documentation</h2>
<p>Pour le moment dans le dossier <code>/__documentation</code>, bientôt un README.md pour bien comprendre comment fonctionne la doc.</p>
<h2>Licence</h2>
<p>Ce projet est sous licence MIT - voir le fichier <a href="./LICENSE">LICENSE</a> pour plus de détails.</p></article>
</section>
</div>
<nav>
<h2><a href="index.html">Home</a></h2><h3><a href="./global.html">Global</a></h3><ul><li><a href="global.html#armstrongNumber">armstrongNumber</a></li><li><a href="global.html#binaryToDecimal">binaryToDecimal</a></li><li><a href="global.html#binaryToHexadecimal">binaryToHexadecimal</a></li><li><a href="global.html#binaryToText">binaryToText</a></li><li><a href="global.html#calculateAge">calculateAge</a></li><li><a href="global.html#capitalize">capitalize</a></li><li><a href="global.html#convertArabicToRoman">convertArabicToRoman</a></li><li><a href="global.html#convertCurrency">convertCurrency</a></li><li><a href="global.html#convertDistance">convertDistance</a></li><li><a href="global.html#convertRomanToArabic">convertRomanToArabic</a></li><li><a href="global.html#convertTemperature">convertTemperature</a></li><li><a href="global.html#createSessionCookie">createSessionCookie</a></li><li><a href="global.html#dateTimeUTC">dateTimeUTC</a></li><li><a href="global.html#decimalToBinary">decimalToBinary</a></li><li><a href="global.html#decimalToHexadecimal">decimalToHexadecimal</a></li><li><a href="global.html#filterStudents">filterStudents</a></li><li><a href="global.html#formatNumberResult">formatNumberResult</a></li><li><a href="global.html#getRandomQuote">getRandomQuote</a></li><li><a href="global.html#hexadecimalToBinary">hexadecimalToBinary</a></li><li><a href="global.html#hexadecimalToDecimal">hexadecimalToDecimal</a></li><li><a href="global.html#hexadecimalToText">hexadecimalToText</a></li><li><a href="global.html#isEmptyValue">isEmptyValue</a></li><li><a href="global.html#isFloat">isFloat</a></li><li><a href="global.html#isValidDate">isValidDate</a></li><li><a href="global.html#numberUnicodeToText">numberUnicodeToText</a></li><li><a href="global.html#randomNumber">randomNumber</a></li><li><a href="global.html#realDateTime">realDateTime</a></li><li><a href="global.html#showDateTime">showDateTime</a></li><li><a href="global.html#stringPermutations">stringPermutations</a></li><li><a href="global.html#textToBinary">textToBinary</a></li><li><a href="global.html#textToHexadecimal">textToHexadecimal</a></li><li><a href="global.html#textToNumberUnicode">textToNumberUnicode</a></li><li><a href="global.html#weatherRequest">weatherRequest</a></li></ul>
</nav>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.3</a> on Mon Nov 11 2019 17:45:44 GMT+0100 (GMT+01:00)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>

View File

@ -0,0 +1,25 @@
/*global document */
(() => {
const source = document.getElementsByClassName('prettyprint source linenums');
let i = 0;
let lineNumber = 0;
let lineId;
let lines;
let totalLines;
let anchorHash;
if (source && source[0]) {
anchorHash = document.location.hash.substring(1);
lines = source[0].getElementsByTagName('li');
totalLines = lines.length;
for (; i < totalLines; i++) {
lineNumber++;
lineId = `line${lineNumber}`;
lines[i].id = lineId;
if (lineId === anchorHash) {
lines[i].className += ' selected';
}
}
}
})();

View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,2 @@
PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);

View File

@ -0,0 +1,28 @@
var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();

View File

@ -0,0 +1,358 @@
@font-face {
font-family: 'Open Sans';
font-weight: normal;
font-style: normal;
src: url('../fonts/OpenSans-Regular-webfont.eot');
src:
local('Open Sans'),
local('OpenSans'),
url('../fonts/OpenSans-Regular-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Regular-webfont.woff') format('woff'),
url('../fonts/OpenSans-Regular-webfont.svg#open_sansregular') format('svg');
}
@font-face {
font-family: 'Open Sans Light';
font-weight: normal;
font-style: normal;
src: url('../fonts/OpenSans-Light-webfont.eot');
src:
local('Open Sans Light'),
local('OpenSans Light'),
url('../fonts/OpenSans-Light-webfont.eot?#iefix') format('embedded-opentype'),
url('../fonts/OpenSans-Light-webfont.woff') format('woff'),
url('../fonts/OpenSans-Light-webfont.svg#open_sanslight') format('svg');
}
html
{
overflow: auto;
background-color: #fff;
font-size: 14px;
}
body
{
font-family: 'Open Sans', sans-serif;
line-height: 1.5;
color: #4d4e53;
background-color: white;
}
a, a:visited, a:active {
color: #0095dd;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
header
{
display: block;
padding: 0px 4px;
}
tt, code, kbd, samp {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
}
.class-description {
font-size: 130%;
line-height: 140%;
margin-bottom: 1em;
margin-top: 1em;
}
.class-description:empty {
margin: 0;
}
#main {
float: left;
width: 70%;
}
article dl {
margin-bottom: 40px;
}
article img {
max-width: 100%;
}
section
{
display: block;
background-color: #fff;
padding: 12px 24px;
border-bottom: 1px solid #ccc;
margin-right: 30px;
}
.variation {
display: none;
}
.signature-attributes {
font-size: 60%;
color: #aaa;
font-style: italic;
font-weight: lighter;
}
nav
{
display: block;
float: right;
margin-top: 28px;
width: 30%;
box-sizing: border-box;
border-left: 1px solid #ccc;
padding-left: 16px;
}
nav ul {
font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif;
font-size: 100%;
line-height: 17px;
padding: 0;
margin: 0;
list-style-type: none;
}
nav ul a, nav ul a:visited, nav ul a:active {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
line-height: 18px;
color: #4D4E53;
}
nav h3 {
margin-top: 12px;
}
nav li {
margin-top: 6px;
}
footer {
display: block;
padding: 6px;
margin-top: 12px;
font-style: italic;
font-size: 90%;
}
h1, h2, h3, h4 {
font-weight: 200;
margin: 0;
}
h1
{
font-family: 'Open Sans Light', sans-serif;
font-size: 48px;
letter-spacing: -2px;
margin: 12px 24px 20px;
}
h2, h3.subsection-title
{
font-size: 30px;
font-weight: 700;
letter-spacing: -1px;
margin-bottom: 12px;
}
h3
{
font-size: 24px;
letter-spacing: -0.5px;
margin-bottom: 12px;
}
h4
{
font-size: 18px;
letter-spacing: -0.33px;
margin-bottom: 12px;
color: #4d4e53;
}
h5, .container-overview .subsection-title
{
font-size: 120%;
font-weight: bold;
letter-spacing: -0.01em;
margin: 8px 0 3px 0;
}
h6
{
font-size: 100%;
letter-spacing: -0.01em;
margin: 6px 0 3px 0;
font-style: italic;
}
table
{
border-spacing: 0;
border: 0;
border-collapse: collapse;
}
td, th
{
border: 1px solid #ddd;
margin: 0px;
text-align: left;
vertical-align: top;
padding: 4px 6px;
display: table-cell;
}
thead tr
{
background-color: #ddd;
font-weight: bold;
}
th { border-right: 1px solid #aaa; }
tr > th:last-child { border-right: 1px solid #ddd; }
.ancestors, .attribs { color: #999; }
.ancestors a, .attribs a
{
color: #999 !important;
text-decoration: none;
}
.clear
{
clear: both;
}
.important
{
font-weight: bold;
color: #950B02;
}
.yes-def {
text-indent: -1000px;
}
.type-signature {
color: #aaa;
}
.name, .signature {
font-family: Consolas, Monaco, 'Andale Mono', monospace;
}
.details { margin-top: 14px; border-left: 2px solid #DDD; }
.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; }
.details dd { margin-left: 70px; }
.details ul { margin: 0; }
.details ul { list-style-type: none; }
.details li { margin-left: 30px; padding-top: 6px; }
.details pre.prettyprint { margin: 0 }
.details .object-value { padding-top: 0; }
.description {
margin-bottom: 1em;
margin-top: 1em;
}
.code-caption
{
font-style: italic;
font-size: 107%;
margin: 0;
}
.source
{
border: 1px solid #ddd;
width: 80%;
overflow: auto;
}
.prettyprint.source {
width: inherit;
}
.source code
{
font-size: 100%;
line-height: 18px;
display: block;
padding: 4px 12px;
margin: 0;
background-color: #fff;
color: #4D4E53;
}
.prettyprint code span.line
{
display: inline-block;
}
.prettyprint.linenums
{
padding-left: 70px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.prettyprint.linenums ol
{
padding-left: 0;
}
.prettyprint.linenums li
{
border-left: 3px #ddd solid;
}
.prettyprint.linenums li.selected,
.prettyprint.linenums li.selected *
{
background-color: lightyellow;
}
.prettyprint.linenums li *
{
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
}
.params .name, .props .name, .name code {
color: #4D4E53;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
font-size: 100%;
}
.params td.description > p:first-child,
.props td.description > p:first-child
{
margin-top: 0;
padding-top: 0;
}
.params td.description > p:last-child,
.props td.description > p:last-child
{
margin-bottom: 0;
padding-bottom: 0;
}
.disabled {
color: #454545;
}

View File

@ -0,0 +1,111 @@
/* JSDoc prettify.js theme */
/* plain text */
.pln {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* string content */
.str {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a keyword */
.kwd {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a comment */
.com {
font-weight: normal;
font-style: italic;
}
/* a type name */
.typ {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* a literal value */
.lit {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* punctuation */
.pun {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* lisp open bracket */
.opn {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* lisp close bracket */
.clo {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a markup tag name */
.tag {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a markup attribute name */
.atn {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a markup attribute value */
.atv {
color: #006400;
font-weight: normal;
font-style: normal;
}
/* a declaration */
.dec {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* a variable name */
.var {
color: #000000;
font-weight: normal;
font-style: normal;
}
/* a function name */
.fun {
color: #000000;
font-weight: bold;
font-style: normal;
}
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
margin-top: 0;
margin-bottom: 0;
}

View File

@ -0,0 +1,132 @@
/* Tomorrow Theme */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Pretty printing styles. Used with prettify.js. */
/* SPAN elements with the classes below are added by prettyprint. */
/* plain text */
.pln {
color: #4d4d4c; }
@media screen {
/* string content */
.str {
color: #718c00; }
/* a keyword */
.kwd {
color: #8959a8; }
/* a comment */
.com {
color: #8e908c; }
/* a type name */
.typ {
color: #4271ae; }
/* a literal value */
.lit {
color: #f5871f; }
/* punctuation */
.pun {
color: #4d4d4c; }
/* lisp open bracket */
.opn {
color: #4d4d4c; }
/* lisp close bracket */
.clo {
color: #4d4d4c; }
/* a markup tag name */
.tag {
color: #c82829; }
/* a markup attribute name */
.atn {
color: #f5871f; }
/* a markup attribute value */
.atv {
color: #3e999f; }
/* a declaration */
.dec {
color: #f5871f; }
/* a variable name */
.var {
color: #c82829; }
/* a function name */
.fun {
color: #4271ae; } }
/* Use higher contrast and text-weight for printable form. */
@media print, projection {
.str {
color: #060; }
.kwd {
color: #006;
font-weight: bold; }
.com {
color: #600;
font-style: italic; }
.typ {
color: #404;
font-weight: bold; }
.lit {
color: #044; }
.pun, .opn, .clo {
color: #440; }
.tag {
color: #006;
font-weight: bold; }
.atn {
color: #404; }
.atv {
color: #060; } }
/* Style */
/*
pre.prettyprint {
background: white;
font-family: Consolas, Monaco, 'Andale Mono', monospace;
font-size: 12px;
line-height: 1.5;
border: 1px solid #ccc;
padding: 10px; }
*/
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
margin-top: 0;
margin-bottom: 0; }
/* IE indents via margin-left */
li.L0,
li.L1,
li.L2,
li.L3,
li.L4,
li.L5,
li.L6,
li.L7,
li.L8,
li.L9 {
/* */ }
/* Alternate shading for lines */
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 {
/* */ }

View File

@ -1,11 +1,23 @@
/* Fonctions Annexes */
// Vérifie si une valeur est vide
/**
* @function isEmptyValue
* @description Vérifie si une valeur est vide.
* @param {string} value
* @returns {boolean}
* @example isEmptyValue(null) true
*/
function isEmptyValue(value) {
return value === '' || value === null || value === undefined;
}
// Formate les nombres avec des espaces (ex : 76120 = 76 120)
/**
* @function formatNumberResult
* @description Formate un nombre avec des espaces.
* @param {number} num
* @returns {(number|string)} - Le nombre formaté soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example formatNumberResult(76120) '76 120'
*/
function formatNumberResult(num) {
if(!isNaN(num) && num >= 1000) {
return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1 ');
@ -15,30 +27,52 @@ function formatNumberResult(num) {
}
}
// Vérifie si une string est un float (integer exclu)
/**
* @function isFloat
* @description Vérifie si une string est un float (integer exclu).
* @param {number} value
* @returns {boolean}
* @example isFloat(76120.474) true
*/
function isFloat(value) {
return !isNaN(value) && value.toString().includes('.');
}
// Convertit les puissances de 10 en nombre (ex: 1e+20 = 100 000 000 000 000 000 000), ne peut pas dépasser 1e+20 (21 ne fonctionne pas)
function convertPuissanceToNumber(num) {
return formatNumberResult((num).toFixed(0));
}
// Majuscule à la 1ère lettre d'une string
function capitalize (s) {
/**
* @function capitalize
* @description Majuscule à la 1ère lettre d'une string.
* @param {string} s
* @returns {string}
* @example capitalize('hello world!') 'Hello world!'
*/
function capitalize(s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
// Donne la date et l'heure selon l'UTC (Universal Time Coordinated)
/**
* @function dateTimeUTC
* @description Donne la date et l'heure selon l'UTC (Universal Time Coordinated).
* @requires {@link fonctions_annexes.js: showDateTime}
* @requires {@link variables.js: timeNow, utcOffset, timeNow.setMinutes(timeNow.getMinutes() + utcOffset)}
* @param {string} utc Heure de décalage par rapport à l'UTC
* @returns {function} showDateTime(enteredOffset) Retourne l'exécution de la fonction showDateTime
* @example dateTimeUTC('0')
*/
function dateTimeUTC(utc) {
const enteredOffset = parseFloat(utc)*60;
timeNow.setMinutes(timeNow.getMinutes() + enteredOffset);
return showDateTime(enteredOffset);
}
// Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00)
/**
* @function showDateTime
* @description Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00).
* @requires {@link fonctions_annexes.js: showDateTime}
* @param {string} utc Heure de décalage par rapport à l'UTC
* @returns {object} Retourne un objet contenant l'année, le mois, le jour, l'heure, les minutes, les secondes et la date formaté
* @example dateTimeUTC('0') dateTimeUTC vous renvoie l'exécution de showDateTime
*/
function showDateTime(enteredOffset) {
const year = timeNow.getFullYear();
const month = ('0'+(timeNow.getMonth()+1)).slice(-2);
@ -62,7 +96,13 @@ function showDateTime(enteredOffset) {
return objectDateTime;
}
// Affiche l'heure en temps réel
/**
* @function realDateTime
* @description Affiche l'heure en temps réel.
* @param {string} id
* @returns {boolean} true Toujours true
* @example window.onload = realDateTime('realDateTime') va afficher l'heure en temps réel au chargement de la page dans la balise avec l'id realDateTime
*/
function realDateTime(id) {
const realDateTimeNow = new Date;
// const year = realDateTimeNow.getFullYear();
@ -79,7 +119,16 @@ function realDateTime(id) {
return true;
}
// Vérifie si une date est valide par rapport à la date d'aujourd'hui
/**
* @function isValidDate
* @description Vérifie si une date est valide (si la variable verifyDate a déjà exister avant la variable currentDate).
* @param {string} verifyDate (format : dd/mm/yyyy) sachant qu'il faut faire -1 au mois car de 0 à 11 donc par exemple 14/12/2019 sera le 14 novembre 2019
* @param {string} currentDate (format : dd/mm/yyyy) pas besoin de faire -1 au mois donc par exemple 14/12/2019 sera le 14 décembre 2019
* @returns {boolean}
* @example
* isValidDate('10/11/2019', '11/11/2019') false Comparaison entre le 10 décembre 2019 et le 11 novembre 2019
* isValidDate('10/10/2019', '11/11/2019') true Comparison entre le 10 novembre 2019 et le 11 novembre 2019
*/
function isValidDate(verifyDate, currentDate) {
// Date à vérifier
const toVerifyDate = verifyDate.split('/');
@ -101,7 +150,12 @@ function isValidDate(verifyDate, currentDate) {
}
}
// Créer un cookie de session
/**
* @function createSessionCookie
* @description Créer un cookie de session.
* @param {string} name Nom du cookie
* @param {string} value Valeur du cookie
*/
function createSessionCookie(name, value) {
document.cookie = escape(name) + "=" + escape(value) + " ; path=/";
}

View File

@ -1,6 +1,17 @@
/* Fonctions Principales */
// Affiche la météo et l'heure locale.
/**
* @function weatherRequest
* @description Affiche la météo et l'heure locale grâce à l'API : openweathermap.org.
* Le nom de la ville se récupère en Javascript qui créé un cookie pour récupérer cette variable en php.
* Ainsi PHP va récupérer le JSON de l'api openweathermap.org puis ajax va se charger d'afficher le résultat.
* Plus d'informations : {@link /scripts/main.js} et {@link /php/getWeatherJson.php}
* @requires {@link fonctions_annexes.js: formatNumberResult, dateTimeUTC, showDateTime, capitalize}
* @see {@link https://jquery.com/} Requête en AJAX avec jQuery
* @see {@link https://openweathermap.org/} API de météo
* @example
* Ajoute au DOM de la page dans la div .results, la météo de la ville demandée.
*/
function weatherRequest() {
$.ajax({
url: '/php/getWeatherJson.php',
@ -20,7 +31,14 @@ function weatherRequest() {
});
}
// Génère un nombre aléatoire entre un minimum inclus et un maximum inclus
/**
* @function randomNumber
* @description Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.
* @param {number} min Nombre Minimum
* @param {number} max Nombre Maximum
* @returns {number} Nombre aléatoire
* @example randomNumber(1, 2) retourne soit 1 ou 2
*/
function randomNumber(min, max) {
if (!isNaN(min) && !isNaN(max)) {
min = Math.ceil(min);
@ -32,7 +50,16 @@ function randomNumber(min, max) {
}
}
// Calcule l'âge de quelqu'un selon ça date de naissance
/**
* @function calculateAge
* @description Calcule l'âge de quelqu'un selon ça date de naissance.
* @requires {@link fonctions_annexes.js: formatNumberResult, isValidDate}
* @requires {@link "external:moment.js"}
* @see {@link https://momentjs.com/}
* @param {string} birthDateEntered - Date de naissance (dd/mm/yyyy)
* @returns {string} - L'âge en jours, mois et années
* @example calculateAge('31/03/2003')
*/
function calculateAge(birthDateEntered) {
// Les variables de la fonction
const birthDateDay = parseInt(birthDateEntered.substring(0, 2));
@ -71,7 +98,14 @@ function calculateAge(birthDateEntered) {
}
}
// Convertis des °C en °F et l'inverse aussi
/**
* @function convertTemperature
* @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)
* @returns {string} - degree unit = temperatureValue
* @example convertTemperature(23, '°C') 23 °C = 73.4 °F
*/
function convertTemperature(degree, unit) {
if (!isNaN(degree) && unit === "°C") {
const temperatureValue = ((degree * 9/5) + 32) + " °F";
@ -86,7 +120,15 @@ function convertTemperature(degree, unit) {
}
}
// Convertis la longueur (distance) avec les unités allant de picomètre au Téramètre
/**
* @function convertDistance
* @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 {string} - Conversion de longueur : firstValue unitFirstValue = result
* @example convertDistance(500, 'cm', 'm') Conversion de longueur : 500 cm = 5 m
*/
function convertDistance (firstValue, unitFirstValue, unitFinalValue) {
const reference = ["pm",null,null,"nm",null,null,"µm",null,null,"mm","cm","dm","m","dam","hm","km",null,null,"Mm",null,null,"Gm",null,null,"Tm"];
@ -98,15 +140,21 @@ function convertDistance (firstValue, unitFirstValue, unitFinalValue) {
// Conversion des longueurs :
const difference = index1 - index2;
const result = firstValue*Math.pow(10,difference);
const response = 'Conversion de longueur : ' + formatNumberResult(firstValue).toString() + ' ' + unitFirstValue + ' = ' + formatNumberResult(result) + ' ' + unitFinalValue;
return response;
return 'Conversion de longueur : ' + formatNumberResult(firstValue).toString() + ' ' + unitFirstValue + ' = ' + formatNumberResult(result) + ' ' + unitFinalValue;
}
else {
return messageError;
}
}
// Affiche uniquement les prénoms (qui sont dans la liste) qui commencent par la lettre souhaitée
/**
* @function filterStudents
* @description Affiche uniquement les prénoms (qui sont dans la liste) qui commencent par la lettre souhaitée.
* @param {string} filteredLetter - La lettre à filtré
* @param {array} students - La liste des prénoms
* @returns {string} - Prénoms qui commence par filteredLetter (totalfilteredLetterStudents) : filteredStudents
* @example filterStudents('P', ['Prénom1', 'Prénom2', 'Divlo']) Prénoms qui commence par P (2) : Prénom1 et Prénom2.
*/
function filterStudents(filteredLetter, students)
{
let filteredStudents = [];
@ -132,14 +180,35 @@ function filterStudents(filteredLetter, students)
}
}
// Génère aléatoirement une citation ou un proverbe
/**
* @function getRandomQuote
* @description Génère aléatoirement une citation ou un proverbe.
* @requires {@link variables.js: quotes}
* @requires {@link fonctions_principales.js: randomNumber}
* @returns {string} - une citation au hasard à partir de la constante 'quotes' dans variables.js
* @example getRandomQuote() " Ne fais jamais rien contre ta conscience, même si l'Etat te le demande. " <br> <br> - Albert Einstein
*/
function getRandomQuote() {
const randomNbr = randomNumber(0, (quotes.length - 1));
const randomQuotes = quotes[randomNbr];
return '" ' + randomQuotes["quote"] + ' " <br> <br> - ' + randomQuotes["source"];
}
// Convertis une valeur dans une devise dans une autre devise
/**
* @function convertCurrency
* @description Convertis une valeur dans une devise dans une autre devise grâce à l'API exchangeratesapi.io.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @requires {@link variables.js: correspondancesMonnaie}
* @see {@link https://jquery.com/} Requête en AJAX avec jQuery
* @see {@link https://api.exchangeratesapi.io/} API de taux de change
* @param {number} value - la valeur à convertir
* @param {string} currency - la devise à avoir après conversion
* @param {string} url - l'url de la requête à l'API en fonction du paramètre dans l'url '?base='
* @example convertCurrency(50, "$ Américain", "https://api.exchangeratesapi.io/latest?base=EUR")
* Ajoute au DOM de la page dans la div .results et .rateDate :
* 50 EUR = 55.17 $ Américain
* Dernier rafraîchissement du taux d'échange : 08/11/2019
*/
function convertCurrency(value, currency, url) {
function currencyTest(currencyToTest) {
for (let index in correspondancesMonnaie) {
@ -158,11 +227,8 @@ function convertCurrency(value, currency, url) {
if (currencySymboleAPI === undefined) {
currencySymboleAPI = 1;
}
const exchangeRateYear = jsonFixer.date[0] + jsonFixer.date[1] + jsonFixer.date[2] + jsonFixer.date[3];
const exchangeRateMonth = jsonFixer.date[5] + jsonFixer.date[6];
const exchangeRateDay = jsonFixer.date[8] + jsonFixer.date[9];
$('.results').html(formatNumberResult(value) + ' ' + jsonFixer.base + ' = ' + formatNumberResult((currencySymboleAPI * value).toFixed(2)) + ' ' + currency);
$('.rateDate').html(`Dernier rafraîchissement du taux d'échange : ${exchangeRateDay}/${exchangeRateMonth}/${exchangeRateYear}`);
$('.rateDate').html(`Dernier rafraîchissement du taux d'échange : ${jsonFixer.date[8] + jsonFixer.date[9]}/${jsonFixer.date[5] + jsonFixer.date[6]}/${jsonFixer.date[0] + jsonFixer.date[1] + jsonFixer.date[2] + jsonFixer.date[3]}`);
}
catch (error) {
$('.results').html(messageError);
@ -172,7 +238,13 @@ function convertCurrency(value, currency, url) {
}
// Convertis des nombres de différentes bases et convertis en UTF-8. (source : http://jsfiddle.net/47zwb41o)
// DecimalToBinary
/**
* @function decimalToBinary
* @description Convertis un nombre décimal en binaire.
* @param {string} value - Le nombre à convertir en string
* @returns {string} - Le nombre en binaire
* @example decimalToBinary('2') '10'
*/
function decimalToBinary(value) {
value = value.replace(" ", "");
value = Number(value);
@ -182,17 +254,31 @@ function decimalToBinary(value) {
return value.toString(2);
}
}
// BinaryToDecimal
/**
* @function binaryToDecimal
* @description Convertis un nombre binaire en décimal.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @param {string} value - Le nombre à convertir
* @returns {(number|string)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example binaryToDecimal('10') 2
*/
function binaryToDecimal(value) {
value = Number(value);
const result = formatNumberResult(parseInt(value, 2));
const result = parseInt(Number(value), 2);
if (isNaN(result)) {
return messageError;
} else {
return result
return formatNumberResult(result);
}
}
// DecimalToHexadecimal
/**
* @function decimalToHexadecimal
* @description Convertis un nombre décimal en hexadécimal.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en hexadécimal
* @example decimalToHexadecimal('15') 'F'
*/
function decimalToHexadecimal(value) {
value = value.replace(" ", "");
value = Number(value);
@ -202,16 +288,31 @@ function decimalToHexadecimal(value) {
return value.toString(16).toUpperCase();
}
}
// HexadecimalToDecimal
/**
* @function hexadecimalToDecimal
* @description Convertis un nombre hexadécimal en décimal.
* @requires {@link fonctions_annexes.js: formatNumberResult}
* @param {string} value - Le nombre à convertir
* @returns {(number|string)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000'
* @example hexadecimalToDecimal('F') 15
*/
function hexadecimalToDecimal(value) {
const result = formatNumberResult(parseInt(value, 16));
const result = parseInt(value, 16);
if (isNaN(result)) {
return messageError;
} else {
return result;
return formatNumberResult(result);
}
}
// BinaryToHexadecimal
/**
* @function binaryToHexadecimal
* @description Convertis un nombre binaire en hexadécimal.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en hexadécimal
* @example binaryToHexadecimal('1111') 'F'
*/
function binaryToHexadecimal(value) {
value = Number(value);
value = parseInt(value, 2);
@ -221,9 +322,15 @@ function binaryToHexadecimal(value) {
return parseInt(value).toString(16).toUpperCase();
}
}
// HexadecimalToBinary
/**
* @function hexadecimalToBinary
* @description Convertis un nombre hexadécimal en binaire.
* @param {string} value - Le nombre à convertir
* @returns {string} - Le nombre en binaire
* @example hexadecimalToBinary('F') '1111'
*/
function hexadecimalToBinary(value) {
value = Number(value);
value = parseInt(value, 16);
if (isNaN(value)) {
return messageError;
@ -231,7 +338,14 @@ function hexadecimalToBinary(value) {
return parseInt(value).toString(2);
}
}
// Each letters has its own codePoint (Unicode Code)
/**
* @function textToNumberUnicode
* @description Convertis chaque caractère d'une string en codePoint Unicode.
* @param {string} value - La chaîne de caractère à convertir
* @returns {string}
* @example textToNumberUnicode('abc') '97 98 99'
*/
function textToNumberUnicode(string) {
try {
let resultat = "";
@ -244,7 +358,14 @@ function textToNumberUnicode(string) {
return messageError;
}
}
// Each codePoint has its own letter
/**
* @function numberUnicodeToText
* @description Convertis chaque codePoint Unicode en caractère.
* @param {string} string - Nombre Unicode à convertir espacé par un espace à chaque fois
* @returns {string}
* @example numberUnicodeToText('97 98 99') 'abc'
*/
function numberUnicodeToText(string) {
try {
const array = string.split(" ");
@ -258,7 +379,14 @@ function numberUnicodeToText(string) {
return messageError;
}
}
// Texte en Binaire (UTF-8)
/**
* @function textToBinary
* @description Convertis un Texte en Binaire (UTF-8).
* @param {string} s - La chaîne de caractère à convertir
* @returns {string}
* @example textToBinary('abc') '01100001 01100010 01100011'
*/
function textToBinary(s) {
try {
s = unescape( encodeURIComponent(s));
@ -273,7 +401,14 @@ function textToBinary(s) {
return s;
}
}
// Binaire (UTF-8) en Texte
/**
* @function binaryToText
* @description Convertis du Binaire (UTF-8) en Texte.
* @param {string} s - La chaîne de caractère contenant tous les octets à convertir
* @returns {string}
* @example binaryToText('01100001 01100010 01100011') 'abc'
*/
function binaryToText(s){
try {
s = s.replace(/\s/g,'')
@ -287,7 +422,15 @@ function binaryToText(s){
return s;
}
}
// Texte en Hexadécimal (UTF-8)
/**
* @function textToHexadecimal
* @description Convertis un Texte en Hexadécimal (UTF-8).
* @param {string} s - La chaîne de caractère à convertir
* @returns {string}
* @example textToHexadecimal('abc') '61 62 63'
*/
function textToHexadecimal (s) {
try {
s = unescape( encodeURIComponent( s ) );
@ -303,7 +446,14 @@ function textToHexadecimal (s) {
return s;
}
}
// Hexadécimal (UTF-8) en Texte
/**
* @function hexadecimalToText
* @description Convertis de l'Hexadécimal (UTF-8) en Texte.
* @param {string} s - La chaîne de caractère contenant tous les nombres Hexadécimal à convertir
* @returns {string}
* @example hexadecimalToText('61 62 63') 'abc'
*/
function hexadecimalToText (s) {
try {
s = s.replace(/\s/g,'');
@ -314,7 +464,14 @@ function hexadecimalToText (s) {
}
}
// Convertis un nombre arabe en nombre romain
/**
* @function convertArabicToRoman
* @description Convertis un nombre arabe en nombre romain.
* @requires {@link variables.js: correspondancesRomainArabe}
* @param {number} nombre - Le nombre arabe à convertir
* @returns {string}
* @example convertArabicToRoman(24) 'XXIV'
*/
function convertArabicToRoman(nombre) {
// Initialisation de la variable qui va contenir le résultat de la conversion
let chiffresRomains = "";
@ -342,7 +499,7 @@ function convertArabicToRoman(nombre) {
correspondancesRomainArabe.forEach(correspondance => {
extraireChiffreRomain(correspondance[0], correspondance[1]);
})
});
if (chiffresRomains === '') {
return messageError;
@ -351,7 +508,14 @@ function convertArabicToRoman(nombre) {
}
}
// Convertis un nombre romain en nombre arabe
/**
* @function convertRomanToArabic
* @description Convertis un nombre romain en nombre arabe.
* @requires {@link variables.js: correspondancesRomainArabe}
* @param {string} str - Le nombre romain à convertir
* @returns {number}
* @example convertRomanToArabic('XXIV') 24
*/
function convertRomanToArabic(str) {
let result = 0;
for (let i = 0;i < correspondancesRomainArabe.length; i++) {
@ -368,7 +532,13 @@ function convertRomanToArabic(str) {
return result;
}
// Vérifie si un nombre fait partie des nombres d'Armstrong
/**
* @function armstrongNumber
* @description Vérifie si un nombre fait partie des nombres d'Armstrong.
* @param {number} number - Le nombre à tester
* @returns {string}
* @example armstrongNumber(153) 153 est un nombre d'Armstrong, car 1<sup>3</sup> + 5<sup>3</sup> + 3<sup>3</sup> = 153.
*/
function armstrongNumber(number) {
let numberString = number.toString();
let numberStringLength = numberString.length;
@ -388,7 +558,13 @@ function armstrongNumber(number) {
}
}
// Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot
/**
* @function stringPermutations
* @description Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot.
* @param {string} string - La chaîne de caractère à permuter
* @returns {array}
* @example stringPermutations('abc') ["abc", "acb", "bac", "bca", "cab", "cba"]
*/
function stringPermutations(string) {
let results = [];