/**
* fichier url.js
* @module url
*/
import document from 'global/document' ;
import window from 'global/window' ;
/**
* @typedef {Objet} url:URLObject
*
* @property {string} protocole
* Le protocole de l'url qui a été analysé.
*
* @property {string} nom d'hôte
* Le nom d'hôte de l'url qui a été analysé.
*
* @property {string} port
* Le port de l'url qui a été analysé.
*
* @property {string} pathname
* Le chemin de l'url qui a été analysé.
*
* @property {string} search
* La requête de recherche de l'URL qui a été analysée.
*
* @property {string} hash
* Le hash de l'url qui a été analysé.
*
* @property {string} host
* L'hôte de l'url qui a été analysée.
*/
/**
* Résoudre et analyser les éléments d'une URL.
*
* @fonction
* @param {String} url
* L'url à analyser
*
* @return {url:URLObject}
* Un objet contenant les détails de l'url
*/
export const parseUrl = function(url) {
// Toute cette méthode peut être remplacée par une URL une fois que nous serons en mesure d'abandonner IE11
const props = ['protocole', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'] ;
// ajouter l'URL à une ancre et laisser le navigateur analyser l'URL
const a = document.createElement('a') ;
a.href = url ;
// Copier les propriétés spécifiques de l'URL dans un nouvel objet
// Ceci est également nécessaire pour IE car l'ancre perd son caractère
// propriétés lorsqu'il est retiré de la dom
const details = {} ;
for (let i = 0 ; i < props.length ; i++) {
details[props[i]] = a[props[i]] ;
}
// IE ajoute le port à la propriété de l'hôte, contrairement à tous les autres. Si
// un identifiant de port est ajouté pour les ports standard, le supprimer.
if (details.protocol === 'http:') {
details.host = details.host.replace(/:80$/, '') ;
}
if (details.protocol === 'https:') {
details.host = details.host.replace(/:443$/, '') ;
}
if (!details.protocol) {
details.protocol = window.location.protocol ;
}
/* istanbul ignore si */
if (!details.host) {
details.host = window.location.host ;
}
les détails du retour ;
};
/**
* Obtenir la version absolue de l'URL relative. Utilisé pour indiquer à Flash l'URL correcte.
*
* @fonction
* @param {string} url
* URL à rendre absolue
*
* @return {string}
* URL absolu
*
* voir http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
*/
export const getAbsoluteURL = function(url) {
// Vérifier si l'URL est absolue
if (!url.match(/^https?:\N/\N/)) {
// Convertir en URL absolue. Le flash hébergé hors site nécessite une URL absolue.
// ajouter l'URL à une ancre et laisser le navigateur analyser l'URL
const a = document.createElement('a') ;
a.href = url ;
url = a.href ;
}
retourner l'url ;
};
/**
* Renvoie l'extension du nom de fichier transmis. Il renvoie une chaîne vide
* si un chemin d'accès non valide lui est transmis.
*
* @fonction
* @param {string} path
* Le chemin d'accès au nom de fichier comme '/path/to/file.mp4'
*
* @return {string}
* L'extension en minuscules ou une chaîne vide s'il n'y en a pas
* a pu être trouvée.
*/
export const getFileExtension = function(path) {
if (typeof path === 'string') {
const splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/;
const pathParts = splitPathRe.exec(path) ;
if (pathParts) {
return pathParts.pop().toLowerCase() ;
}
}
retourner '' ;
};
/**
* Retourne si l'url passée est une requête inter-domaine ou non.
*
* @fonction
* @param {string} url
* L'url à vérifier.
*
* @param {Object} [winLoc]
* le domaine pour lequel l'url doit être vérifiée, la valeur par défaut est window.location
*
* @param {string} [winLoc.protocol]
* Le protocole d'emplacement de la fenêtre est par défaut window.location.protocol
*
* @param {string} [winLoc.host]
* La valeur par défaut de l'emplacement de la fenêtre est window.location.host
*
* @return {boolean}
* Qu'il s'agisse d'une demande interdomaines ou non.
*/
export const isCrossOrigin = function(url, winLoc = window.location) {
const urlInfo = parseUrl(url) ;
// Les urls relatives au protocole IE8 renverront ':' pour le protocole
const srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol ;
// Vérifier si l'url est celle d'un autre domaine/origine
// IE8 ne connaît pas location.origin, nous ne nous y fierons donc pas ici
const crossOrigin = (srcProtocol + urlInfo.host) !== (winLoc.protocol + winLoc.host) ;
return crossOrigin ;
};