Commit 6bcddd86 authored by yPhil's avatar yPhil
Browse files

SYS: Repo cleanup

parent e4d14cdd
# Petrolette
## Bienvenue sur Internet
*RSS/Atom morning news reader ; Works at night too.*
![Petrolette](http://pix.toile-libre.org/upload/original/1515112723.png)
---
[Pétrolette](https://yphil.bitbucket.io/petrolette) est une web-application de lecture de sources récurrentes (Flux RSS, mais pas seulement, comme on va le voir) écrite en NodeJS/[Express](https://expressjs.com/) pour la partie serveur, et en JQuery/[UI](https://jqueryui.com/) pour la partie client.
[![License GPLv3](https://img.shields.io/badge/license-GPL_v3-green.svg)](http://www.gnu.org/licenses/gpl-3.0.html) [![Gratipay](http://img.shields.io/gratipay/yassinphilip.svg)](https://www.gratipay.com/yassinphilip/)
Ce projet existe depuis une demi douzaine d'années [déjà](https://linuxfr.org/nodes/89475/comments/1321606) ; la première version était en PHP/XML, et proposait pour organiser les flux (maintenant appelés "sources") et les onglets (maintenant appelés "groupes") un méchant "back office" qui marchait si mal que personne – et surtout pas moi – ne l'utilisait, préférant éditer à la main le fichier XML de configuration.
Read about it in French [ici](http://linuxfr.org/users/philippemc/journaux/avec-quoi-tu-lis-tes-rss-le-matin).
Aujourd'hui, plus rien n'est sur le serveur, et toutes les préférences sont lues et écrites dans [le cache du navigateur](https://developer.mozilla.org/fr/docs/Web/API/Window/localStorage), et restent sur la machine de l'utilisateur. De plus, en fait de back office, tout se fait directement dans l'interface frontale.
## Petrolette is a personal track-free online RSS news reader
Et du coup, une instance "publique" de Pétrolette ne nécessite pas d'identification, ce qui est tout de même assez pratique, et concrètement assez nouveau, après des décennies de paradigme "même URI = même contenu".
Petrolette is a simple but powerful web app to view and manage various XML (RSS, aTom, etc) news feeds and present them in a nice, ergonomic fashion. I made it to replace the online news services (NetVibes, Google news, etc.) that I use up until around 2007, when they became bloated and **crippled with spyware**. It's a fast, simple and light system, and I've been using it for ~~weeks~~ years now ; It does what I want from a no-nonsense, every-morning-every-day news reader.
## Fonctionnalités
### Practical Features
- Découverte du flux RSS d'un site ;
- Construction d'un flux RSS de recherche (http://trouvons.org) à partir de la chaîne de caractères ;
- Lecture / Écriture locale de la liste des flux (et de l'ensemble des options) dans le cache du navigateur ;
- Galerie d'images avec diaporama pour les sources de type "image" ;
- Interface en 4 langues ;
- Aide en ligne ;
- Pas d'interface d'administration, toutes les fonctions d'organisation des groupes et des sources sont disponibles dans l'appli:
- Déplacement des groupes et des sources (individuellement ou par lots) ;
- Renommage des groupes et déplacement ;
- Suppression d'un groupe ou d'une source.
Make the page your home page, and read it every morning. You know instantly what article you've read ; We're already on the web, right? Just click and read the article. This is *so much better than TV*.
### Mobile
### Technical Features
Oui je sais, c'est un Graal que certains pensent hors de portée, mais Pétrolette relève le défi, c'est la même interface pour toutes les plateformes, avec des ajustements spécifiques (pas de drag & drop dans les pages web sous Android, par exemple) pour adapter l'interface au mieux.
- Automatic discovery of a website's RSS feed (called "source" in Petrolette)
- Creation of a source from a natural search query ("latest bitcoin crash")
![Pétrolette mobile](https://framapic.org/wnLYda2BM9RJ/B1fjYy6JZsLT)
### LICENSE
### Feedrat / Solexine
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Au départ, le champ de saisie de l'URL de la source n'était que ça, un champ de saisie. Puis un ami m'a dit "m'enfin, j'ai entré "http://lemonde.fr" et *ça a pas marché*". J'ai donc écrit une petite bibliothèque, [Feedrat](https://www.npmjs.com/package/feedrat) (que je vais probablement renommer "[Solexine](https://fr.wiktionary.org/wiki/Solexine)" pour coller au sujet) qui cherche le flux RSS d'un domaine donné, en utilisant diverses stratégies, spécifiquement :
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
1. Recherche des "suspects usuels" `example.com/rss`, `example.com/feed`, etc ;
2. Lecture du DOM de la page à la recherche d'un `<link rel="alternate" type="application/rss+xml" href="http://example.com/feed" />`
3. Pour certaines pages spécifiques (comme les chaînes YouTube) construction de l'URL de la source en concaténant les divers éléments prédictibles du chemin.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Mais à ce moment-là une copine m'a dit "m'enfin, j'ai entré "bug intel" et *ça a pas marché*" ; J'ai donc ajouté une fonction de construction à la volée d'une source à partir de la requête, à l'aide de http://trouvons.org qui est une instance publique de https://searx.me.
*Icon by [Buuf](https://mattahan.deviantart.com/art/Buuf-37966044)*
La lib valide ensuite que le feed existe bien à l'URI indiquée, et renvoie cette dernière.
---
## Et maintenant ?
- J'ai toujours rêvé d'une "bibliothèque RSS", un site qui listerait tous les flux RSS existants, en mode wiki public avec un système de catégories/étiquettes. Je vais donc le faire, juste je continue d'y réfléchir, et d'écraser les bugs de Petrolette ;
- Je vais également ré-écrire Solexine pour pouvoir proposer tous les feeds trouvés dans une page, pas juste le premier ;
- Je souhaite également améliorer le système d'affichage en grille pour pouvoir proposer d'autres modèles, et pourquoi pas le re-dimensionnage (ouch) des sources ;
- Et bien sur, maintenir Pétrolette au jour le jour. En fait, il reste beaucoup à faire, et ce projet s'est avéré m'occuper un peu plus longtemps que prévu.
## Modèle économique
J'ai monté une instance de test sur le dédié d'un ami, que vous pouvez [essayer tout de suite](http://petrolette.space/) ; C'est la beauté d'un système de cache, que tous les utilisateurs puissent s'y connecter sans s’identifier, et voir un contenu différent de celui de son voisin, qui ne peut virtuellement **pas voir la liste de nos sources**.
Bien sur, en échange, le contenu sera différent selon la machine avec laquelle on le consulte (moi-même j'ai encore du mal à m'y faire) donc Pétrolette permet l'import/export de la configuration (un simple fichier json: des sources dans des groupes, avec 3 paramètres par source: `URL`, `type` ("texte seul", "image", ou "mixte") et `limit` (le nombre d'articles de cette source)) pour synchroniser au mieux la chose.
Chez/pour moi ça marche™, mais certains préféreraient peut-être éviter de jongler avec un fichier `petrolette.conf` entre son bureau, sa maison et son phone, et pour ceux-là, pourquoi ne pas vendre de l'hébergement? C'est aussi pour avoir des pistes dans ce sens que je poste ce journal. Dans ce cas, il faudrait que je développe une option pour écrire sur le serveur, ce qui est assez simple. Par ailleurs, je verrai assez bien Pétrolette en interface RSS d'un système d'auto-hébergement léger.
Enfin, pour le moment, [RERO](https://fr.wikipedia.org/wiki/Release_early,_release_often), faites bon usage de Pétrolette, c'est du code ~~de goret~~ chantourné avec amour, et partagé avec plaisir.
- [La page officielle](https://yphil.bitbucket.io/petrolette/)
- [L'instance de test](http://petrolette.space/)
- [Le code](https://bitbucket.org/yphil/petrolette)
- [La page Liberapay](https://liberapay.com/yPhil/donate)
/* ===================================================================
* Dazzle - Main JS
*
* ------------------------------------------------------------------- */
(function($) {
"use strict";
var cfg = {
scrollDuration : 800, // smoothscroll duration
mailChimpURL : 'http://facebook.us8.list-manage.com/subscribe/post?u=cdb7b577e41181934ed6a6a44&amp;id=e65110b38d' // mailchimp url
},
$WIN = $(window);
// Add the User Agent to the <html>
// will be used for IE10 detection (Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0))
var doc = document.documentElement;
doc.setAttribute('data-useragent', navigator.userAgent);
/* Preloader
* -------------------------------------------------- */
var ssPreloader = function() {
$WIN.on('load', function() {
// force page scroll position to top at page refresh
$('html, body').animate({ scrollTop: 0 }, 'normal');
// will fade out the whole preloader DIV that covers the website.
$("#preloader").delay(500).fadeOut('slow');
});
};
/* Mobile Menu
* ---------------------------------------------------- */
var ssMobileMenu = function() {
var toggleButton = $('.header-menu-toggle'),
nav = $('#header-nav-wrap');
toggleButton.on('click', function(event){
event.preventDefault();
toggleButton.toggleClass('is-clicked');
nav.slideToggle();
});
if (toggleButton.is(':visible')) nav.addClass('mobile');
$(window).resize(function() {
if (toggleButton.is(':visible')) nav.addClass('mobile');
else nav.removeClass('mobile');
});
$('#header-nav-wrap').find('a').on("click", function() {
if (nav.hasClass('mobile')) {
toggleButton.toggleClass('is-clicked');
nav.slideToggle();
}
});
};
/* FitVids
* ---------------------------------------------------- */
var ssFitVids = function() {
$(".fluid-video-wrapper").fitVids();
};
/* Owl Carousel
* ------------------------------------------------------ */
var ssOwlCarousel = function() {
$(".owl-carousel").owlCarousel({
loop: true,
nav: false,
autoHeight: true,
items: 1
});
};
/* Highlight the current section in the navigation bar
* ------------------------------------------------------ */
var ssWaypoints = function() {
var sections = $("section"),
navigation_links = $(".header-main-nav li a");
sections.waypoint( {
handler: function(direction) {
var active_section;
active_section = $('section#' + this.element.id);
if (direction === "up") active_section = active_section.prev();
var active_link = $('.header-main-nav li a[href="#' + active_section.attr("id") + '"]');
navigation_links.parent().removeClass("current");
active_link.parent().addClass("current");
},
offset: '25%'
});
};
/* Smooth Scrolling
* ------------------------------------------------------ */
var ssSmoothScroll = function() {
$('.smoothscroll').on('click', function (e) {
var target = this.hash,
$target = $(target);
e.preventDefault();
e.stopPropagation();
$('html, body').stop().animate({
'scrollTop': $target.offset().top
}, cfg.scrollDuration, 'swing', function () {
window.location.hash = target;
});
});
};
/* Placeholder Plugin Settings
* ------------------------------------------------------ */
var ssPlaceholder = function() {
$('input, textarea, select').placeholder();
};
/* Alert Boxes
------------------------------------------------------- */
var ssAlertBoxes = function() {
$('.alert-box').on('click', '.close', function() {
$(this).parent().fadeOut(500);
});
};
/* Animate On Scroll
* ------------------------------------------------------ */
var ssAOS = function() {
AOS.init( {
offset: 200,
duration: 600,
easing: 'ease-in-sine',
delay: 300,
once: true,
disable: 'mobile'
});
};
/* AjaxChimp
* ------------------------------------------------------ */
var ssAjaxChimp = function() {
$('#mc-form').ajaxChimp({
language: 'es',
url: cfg.mailChimpURL
});
// Mailchimp translation
//
// Defaults:
// 'submit': 'Submitting...',
// 0: 'We have sent you a confirmation email',
// 1: 'Please enter a value',
// 2: 'An email address must contain a single @',
// 3: 'The domain portion of the email address is invalid (the portion after the @: )',
// 4: 'The username portion of the email address is invalid (the portion before the @: )',
// 5: 'This email address looks fake or invalid. Please enter a real email address'
$.ajaxChimp.translations.es = {
'submit': 'Submitting...',
0: '<i class="fa fa-check"></i> We have sent you a confirmation email',
1: '<i class="fa fa-warning"></i> You must enter a valid e-mail address.',
2: '<i class="fa fa-warning"></i> E-mail address is not valid.',
3: '<i class="fa fa-warning"></i> E-mail address is not valid.',
4: '<i class="fa fa-warning"></i> E-mail address is not valid.',
5: '<i class="fa fa-warning"></i> E-mail address is not valid.'
}
};
/* Back to Top
* ------------------------------------------------------ */
var ssBackToTop = function() {
var pxShow = 500, // height on which the button will show
fadeInTime = 400, // how slow/fast you want the button to show
fadeOutTime = 400, // how slow/fast you want the button to hide
scrollSpeed = 300, // how slow/fast you want the button to scroll to top. can be a value, 'slow', 'normal' or 'fast'
goTopButton = $("#go-top")
// Show or hide the sticky footer button
$(window).on('scroll', function() {
if ($(window).scrollTop() >= pxShow) {
goTopButton.fadeIn(fadeInTime);
} else {
goTopButton.fadeOut(fadeOutTime);
}
});
};
/* Initialize
* ------------------------------------------------------ */
(function ssInit() {
ssPreloader();
ssMobileMenu();
ssFitVids();
ssOwlCarousel();
ssWaypoints();
ssSmoothScroll();
ssPlaceholder();
ssAlertBoxes();
ssAOS();
ssAjaxChimp();
ssBackToTop();
})();
})(jQuery);
This diff is collapsed.
/*! modernizr 3.3.1 (Custom Build) | MIT *
* https://modernizr.com/download/?-audio-backgroundblendmode-canvas-cssanimations-csscalc-cssfilters-cssgradients-cssremunit-csstransforms-csstransforms3d-csstransitions-flexbox-flexboxlegacy-flexboxtweener-flexwrap-svg-touchevents-video-setclasses !*/
!function(e,n,t){function r(e,n){return typeof e===n}function o(){var e,n,t,o,a,s,i;for(var c in x)if(x.hasOwnProperty(c)){if(e=[],n=x[c],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(o=r(n.fn,"function")?n.fn():n.fn,a=0;a<e.length;a++)s=e[a],i=s.split("."),1===i.length?Modernizr[i[0]]=o:(!Modernizr[i[0]]||Modernizr[i[0]]instanceof Boolean||(Modernizr[i[0]]=new Boolean(Modernizr[i[0]])),Modernizr[i[0]][i[1]]=o),h.push((o?"":"no-")+i.join("-"))}}function a(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(b&&(n=n.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(r,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(n+=" "+t+e.join(" "+t),b?w.className.baseVal=n:w.className=n)}function s(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):b?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function i(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function c(){var e=n.body;return e||(e=s(b?"svg":"body"),e.fake=!0),e}function l(e,t,r,o){var a,i,l,d,f="modernizr",u=s("div"),p=c();if(parseInt(r,10))for(;r--;)l=s("div"),l.id=o?o[r]:f+(r+1),u.appendChild(l);return a=s("style"),a.type="text/css",a.id="s"+f,(p.fake?p:u).appendChild(a),p.appendChild(u),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(n.createTextNode(e)),u.id=f,p.fake&&(p.style.background="",p.style.overflow="hidden",d=w.style.overflow,w.style.overflow="hidden",w.appendChild(p)),i=t(u,e),p.fake?(p.parentNode.removeChild(p),w.style.overflow=d,w.offsetHeight):u.parentNode.removeChild(u),!!i}function d(e,n){return!!~(""+e).indexOf(n)}function f(e,n){return function(){return e.apply(n,arguments)}}function u(e,n,t){var o;for(var a in e)if(e[a]in n)return t===!1?e[a]:(o=n[e[a]],r(o,"function")?f(o,t||n):o);return!1}function p(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function m(n,r){var o=n.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(p(n[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var a=[];o--;)a.push("("+p(n[o])+":"+r+")");return a=a.join(" or "),l("@supports ("+a+") { #modernizr { position: absolute; } }",function(e){return"absolute"==getComputedStyle(e,null).position})}return t}function v(e,n,o,a){function c(){f&&(delete j.style,delete j.modElem)}if(a=r(a,"undefined")?!1:a,!r(o,"undefined")){var l=m(e,o);if(!r(l,"undefined"))return l}for(var f,u,p,v,g,y=["modernizr","tspan","samp"];!j.style&&y.length;)f=!0,j.modElem=s(y.shift()),j.style=j.modElem.style;for(p=e.length,u=0;p>u;u++)if(v=e[u],g=j.style[v],d(v,"-")&&(v=i(v)),j.style[v]!==t){if(a||r(o,"undefined"))return c(),"pfx"==n?v:!0;try{j.style[v]=o}catch(h){}if(j.style[v]!=g)return c(),"pfx"==n?v:!0}return c(),!1}function g(e,n,t,o,a){var s=e.charAt(0).toUpperCase()+e.slice(1),i=(e+" "+z.join(s+" ")+s).split(" ");return r(n,"string")||r(n,"undefined")?v(i,n,o,a):(i=(e+" "+$.join(s+" ")+s).split(" "),u(i,n,t))}function y(e,n,r){return g(e,t,t,n,r)}var h=[],x=[],T={_version:"3.3.1",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){x.push({name:e,fn:n,options:t})},addAsyncTest:function(e){x.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=T,Modernizr=new Modernizr,Modernizr.addTest("svg",!!n.createElementNS&&!!n.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect);var w=n.documentElement,b="svg"===w.nodeName.toLowerCase();Modernizr.addTest("audio",function(){var e=s("audio"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),n.mp3=e.canPlayType('audio/mpeg; codecs="mp3"').replace(/^no$/,""),n.opus=e.canPlayType('audio/ogg; codecs="opus"')||e.canPlayType('audio/webm; codecs="opus"').replace(/^no$/,""),n.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),n.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(t){}return n}),Modernizr.addTest("canvas",function(){var e=s("canvas");return!(!e.getContext||!e.getContext("2d"))}),Modernizr.addTest("cssremunit",function(){var e=s("a").style;try{e.fontSize="3rem"}catch(n){}return/rem/.test(e.fontSize)});var C=T._config.usePrefixes?" -webkit- -moz- -o- -ms- ".split(" "):["",""];T._prefixes=C,Modernizr.addTest("csscalc",function(){var e="width:",n="calc(10px);",t=s("a");return t.style.cssText=e+C.join(n+e),!!t.style.length}),Modernizr.addTest("cssgradients",function(){for(var e,n="background-image:",t="gradient(linear,left top,right bottom,from(#9f9),to(white));",r="",o=0,a=C.length-1;a>o;o++)e=0===o?"to ":"",r+=n+C[o]+"linear-gradient("+e+"left top, #9f9, white);";Modernizr._config.usePrefixes&&(r+=n+"-webkit-"+t);var i=s("a"),c=i.style;return c.cssText=r,(""+c.backgroundImage).indexOf("gradient")>-1});var S="CSS"in e&&"supports"in e.CSS,P="supportsCSS"in e;Modernizr.addTest("supports",S||P);var _=T.testStyles=l;Modernizr.addTest("touchevents",function(){var t;if("ontouchstart"in e||e.DocumentTouch&&n instanceof DocumentTouch)t=!0;else{var r=["@media (",C.join("touch-enabled),("),"heartz",")","{#modernizr{top:9px;position:absolute}}"].join("");_(r,function(e){t=9===e.offsetTop})}return t});var E="Moz O ms Webkit",z=T._config.usePrefixes?E.split(" "):[];T._cssomPrefixes=z;var k=function(n){var r,o=C.length,a=e.CSSRule;if("undefined"==typeof a)return t;if(!n)return!1;if(n=n.replace(/^@/,""),r=n.replace(/-/g,"_").toUpperCase()+"_RULE",r in a)return"@"+n;for(var s=0;o>s;s++){var i=C[s],c=i.toUpperCase()+"_"+r;if(c in a)return"@-"+i.toLowerCase()+"-"+n}return!1};T.atRule=k;var $=T._config.usePrefixes?E.toLowerCase().split(" "):[];T._domPrefixes=$;var N={elem:s("modernizr")};Modernizr._q.push(function(){delete N.elem});var j={style:N.elem.style};Modernizr._q.unshift(function(){delete j.style}),Modernizr.addTest("video",function(){var e=s("video"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),n.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),n.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""),n.vp9=e.canPlayType('video/webm; codecs="vp9"').replace(/^no$/,""),n.hls=e.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/,""))}catch(t){}return n}),T.testAllProps=g,T.testAllProps=y,Modernizr.addTest("cssanimations",y("animationName","a",!0)),Modernizr.addTest("cssfilters",function(){if(Modernizr.supports)return y("filter","blur(2px)");var e=s("a");return e.style.cssText=C.join("filter:blur(2px); "),!!e.style.length&&(n.documentMode===t||n.documentMode>9)}),Modernizr.addTest("flexbox",y("flexBasis","1px",!0)),Modernizr.addTest("flexboxlegacy",y("boxDirection","reverse",!0)),Modernizr.addTest("flexboxtweener",y("flexAlign","end",!0)),Modernizr.addTest("flexwrap",y("flexWrap","wrap",!0)),Modernizr.addTest("csstransforms",function(){return-1===navigator.userAgent.indexOf("Android 2.")&&y("transform","scale(1)",!0)}),Modernizr.addTest("csstransforms3d",function(){var e=!!y("perspective","1px",!0),n=Modernizr._config.usePrefixes;if(e&&(!n||"webkitPerspective"in w.style)){var t,r="#modernizr{width:0;height:0}";Modernizr.supports?t="@supports (perspective: 1px)":(t="@media (transform-3d)",n&&(t+=",(-webkit-transform-3d)")),t+="{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}",_(r+t,function(n){e=7===n.offsetWidth&&18===n.offsetHeight})}return e}),Modernizr.addTest("csstransitions",y("transition","all",!0));var A=T.prefixed=function(e,n,t){return 0===e.indexOf("@")?k(e):(-1!=e.indexOf("-")&&(e=i(e)),n?g(e,n,t):g(e,"pfx"))};Modernizr.addTest("backgroundblendmode",A("backgroundBlendMode","text")),o(),a(h),delete T.addTest,delete T.addAsyncTest;for(var L=0;L<Modernizr._q.length;L++)Modernizr._q[L]();e.Modernizr=Modernizr}(window,document);
\ No newline at end of file
/*! pace 1.0.0 */
(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)e.push(this.bindings[a][c].handler===b?this.bindings[a].splice(c,1):c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),i.push(f?this.bindings[c].splice(e,1):e++);return i}},a}(),j=window.Pace||{},window.Pace=j,v(j,g.prototype),D=j.options=v({},u,window.paceOptions,x()),U=["ajax","document","eventLag","elements"],Q=0,S=U.length;S>Q;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a<D.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),m=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=D.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=F(this.source,"progress"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=F(this.source,"progress")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this);
\ No newline at end of file
This diff is collapsed.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment