Initial Import.

This commit is contained in:
David Soulayrol 2019-05-23 15:46:57 +02:00
commit e0d3de652b
88 changed files with 11206 additions and 0 deletions

6
.eslintrc.js Normal file
View file

@ -0,0 +1,6 @@
module.exports = {
"extends": "standard",
"plugins": [
"standard"
]
};

57
apache.conf Normal file
View file

@ -0,0 +1,57 @@
<VirtualHost *:80>
DocumentRoot /var/www/scorfel.fr
ServerName scorfel.fr
ServerAlias www.scorfel.fr
RewriteEngine On
RewriteRule "^/(p/.*)" "http://scorfel.blogspot.fr/$1"
RewriteRule "^/(\d{4}/\d{2}/.*)" "http://scorfel.blogspot.fr/$1"
ErrorLog ${APACHE_LOG_DIR}/scorfel.fr_error.log
CustomLog ${APACHE_LOG_DIR}/scorfel.fr_access.log combined
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
<Directory /var/www/scorfel.fr>
Options -Indexes
AllowOverride All
Order allow,deny
allow from all
</Directory>
<IfModule alias_module>
Redirect permanent /index.html http://scorfel.blogspot.fr/index.html
</IfModule>
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
SSLCertificateFile /etc/letsencrypt/live/scorfel.fr/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/scorfel.fr/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
DocumentRoot /var/www/scorfel.fr
ServerName scorfel.fr
ServerAlias www.scorfel.fr
RewriteEngine On
RewriteRule "^/(p/.*)" "http://scorfel.blogspot.fr/$1"
RewriteRule "^/(\d{4}/\d{2}/.*)" "http://scorfel.blogspot.fr/$1"
ErrorLog ${APACHE_LOG_DIR}/scorfel.fr_error.log
CustomLog ${APACHE_LOG_DIR}/scorfel.fr_access.log combined
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
<Directory /var/www/scorfel.fr>
Options -Indexes
AllowOverride All
Order allow,deny
allow from all
</Directory>
<IfModule alias_module>
Redirect permanent /index.html http://scorfel.blogspot.fr/index.html
</IfModule>
</VirtualHost>
</IfModule>

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

399
content/2016/atelier.md Normal file
View file

@ -0,0 +1,399 @@
---
title: Une heure, un texte
image_file: /2016/images/vignette_2016.jpg
image_desc: L'affiche
---
## Un atelier ludique d'écriture
L'atelier ludique d'écriture, animé par Philippe Ethuin, a lieu
dimanche 23 octobre 2016 dans le cadre du festival Scorfel. Jouer avec
des dés, des cartes, des pions certes… mais avec des mots c'est
possible aussi !
Nous sommes dix, âgés de neuf à… le demi-siècle n'était pas loin mais
chut !... nous avons tous gardé notre âme d'enfant, à participer à
« Une heure un texte » dans le partage et la bonne humeur.
La proposition d'écriture repose sur des mots choisis par les
participants puis complétés par association d'idée(s).
<figure>
<img class="photo" src="/2016/images/atelier/20161023_111635.jpg" alt="Liste de mots">
<figcaption>Le début de l'histoire (Crédit : Philippe Ethuin)</figcaption>
</figure>
Chaque participant retient ensuite dix mots pour écrire son histoire
parmi tous ceux proposés par les participants… Nous allons pouvoir
commencer à écrire… Mais patatras, le sadique animateur nous retire
nos mots sélectionnés avec soin afin de les passer à notre voisin.
Nous nous retrouvons donc avec une liste imposée.
Comme déclencheur, le début d'un roman de Charles Le Goffic intitulé
*L'Erreur de Florence* (1904) réédité sous le titre de *Croc-d'argent*
(1922) nous plonge au cœur de la Bretagne :
> « Kernéguez et Pontus suivaient en silence la petite voie
> […] qui débouche […] sur l'ancienne toute de Carhaix à
> Landerneau… Kernéguez - Croc d'argent, comme on l'appelait en
> raison de l'étrange main artificielle qu'il s'était fait
> adapter au poignet droit […] observait depuis quelques
> minutes son compagnon : ... »
<figure>
<img class="photo" src="/2016/images/atelier/20161023_111652.jpg" alt="Introduction">
<figcaption>Les mots de l'atelier (Crédit : Philippe Ethuin)</figcaption>
</figure>
Nous avons tous, animateur compris, produit une petite histoire (même
si la règle des dix mots n'a pas été respectée par tout le monde… mais
les règles sont faites pour être transgressés !).
Nous espérons que vous prendrez autant de plaisir à nous lire que nous
en avons eu à les écrire !
## Catégorie enfants
### Le texte de Lila (9 ans)
Mots imposés : **tribu**, **cheval**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau… Kernéguez -
> Croc d'argent, comme on l'appelait en raison de l'étrange main
> artificielle qu'il s'était fait adapter au poignet droit […] observait
> depuis quelques minutes son compagnon :
>
> « On devrait se dépêcher de rejoindre la **tribu** avant qu'il fasse
> nuit » lui lança-t-il soudain.
>
> Mais Pontus freina son **cheval**.
>
> « Qu'est-ce que tu as ? lui demanda-t-il en le rejoignant.
>
> — Viens voir Kernéguez ! » dit-il à voix basse.
>
> Kernéguez écarquilla les yeux…
### Le texte d'Elena (11 ans)
Mots imposés : **marée**, **grand**, **chêne**, **oiseau**, **nuit**,
**galop**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
>
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : il commençait à
> disparaître comme quand la mer descend à **marée** basse ! Pontus, en
> voyant son compagnon le regarder se regarda aussi et poussa un
> **grand** cri :
>
> « Au secours ! On disparaît !
>
> — Moi aussi ? »
>
> Les deux compagnons, remplis de peur, se mirent à courir tout droit
> devant eux sans jamais s'arrêter. Au bout d'une demi-heure de course,
> Kernéguez se cogna dans un **chêne**. Boum ! « Aïe, ma main ! Hé !
> Pontus, on commence à reprendre des couleurs… »
>
> Une grande créature descendit d'un arbre et vint se poser juste à côté
> des pieds de Kernéguez.
>
> « Qui a dérangé mon arbre et mon sommeil ? demanda un **oiseau** coloré.
>
> — C'… c'est moi, Kernéguez. C'est moi qui a dérangé ton arbre. Je suis
> vraiment désolé.
>
> — Ce n'est rien…
>
> — Juste… où sommes-nous ? demanda Pontus.
>
> — Ah, ça c'est un secret… »
>
> La **nuit** commençait à tomber et Kernéguez et Pontus ne savaient
> toujours pas jusqu'où ils avaient couru. Tout d'un coup, ils
> entendirent des bruits de **galop** venus du fond de la forêt qu'il y
> avait en face. Une sorte de licorne accourait, essouflée, elle demanda
> à l'oiseau : « Que se passe-t-il chef ? Pourquoi l'alarme a
> retenti ? »
>
> Elle aperçut Pontus et Kergnéguez et comprit.
>
> « C'est la faute de ces deux coquins, Kernéguez et Pontus, qui sont
> entrés dans notre domaine.
>
> — Vous connaissez nos noms ? » demandèrent-ils en coeur.
>
> L'oiseau et la licorne se mirent à rire.
### Le texte d'Ana (12 ans)
Mots imposés : **cheval**, **crinière**, **forêt**, **arbre**,
**lumière**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : son **cheval**
> Pontus boîtait et cela l'inquiétait.
>
> Le noir commença à s'emparer du sous-bois où ils se trouvaient ainsi
> qu'un froid de loup qui fit frissonner les deux voyageurs. Pontus
> s'essoufflait mais il continuait à avancer malgré sa patte folle et la
> fatigue de cette longue journée de marche.
>
> « Arrêtons-nous pour nous reposer, déclara soudain Kernéguez, tu
> tombes de fatigue, Pontus.
>
> — Mais… pas question, hennit l'animal en secouant sa longue
> **crinière** argentée. Nous avons une mission, un but ! Nous ne
> pouvons prendre le moindre retard ! Et je n'ai pas vraiment envie de
> passer la nuit dans une **forêt** infestée de loups et de trolls !
>
> — Ah oui… les trolls, grommela Kernéguez. Bon, reste ici, je vais
> monter dans un **arbre** et voir s'il y a une maison à proximité pour y
> passer la nuit ! »
>
> Pontus acquiesça et son cavalier descendit de son dos. Kernéguez
> choisit un grand sapin et, prudemment, monta au sommet. Rien. Que du
> noir. Il guetta et aperçut enfin une **lumière** à l'horizon.
### Le texte de Gaëlan (14 ans)
Mots imposés : **noble**, **amour**, **forêt**, **automne**,
**biche**, **elfe**, **symbole**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : Pontus n'était autre
> qu'un chevalier. Kernéguez et Pontus entretenaient un lien d'amitié
> très fort.
>
> Kernéguez prit la parole : « Mon bon ami, je pense qu'il serait
> judicieux de poursuivre notre escapade dans les bois, nous n'aurions
> ainsi aucune chance d'être surpris par des bandits.
>
> — Si cela vous met en joie, je n'y vois pas d'inconvénient, rétorqua
> Pontus d'un air **noble**.
>
> — Mon cher Pontus, je ne voudrais pas retarder notre voyage. Ce soir,
> j'ai pour projet de déclarer mon **amour** à dame Lucrèce. Aujourd'hui
> est un grand jour.
>
> — Bien, bien ! Faites donc mon ami ! Dépêchons-nous alors ! »
> acquiesça Pontus.
>
> Ils empruntèrent donc le chemin de la **forêt**. C'était
> l'**automne**, la saison préférée de Monseigneur Kernéguez.
>
> Ils observaient tous deux ces splendides paysages automnaux quand,
> soudain, ils eurent la chance de croiser le chemin d'une **biche**.
>
> Kernéguez s'exclama : « Oh ! Quelle chance nous avons là ! »
>
> Mais notre bon vieux Pontus ne semblait pas être enthousiasmé par ce
> qui se révélait être une licorne sur laquelle trônait une créature aux
> oreilles pointues. C'était un **elfe** ! Le **symbole** des peuples
> celtiques.
## Catégorie adultes
### Le texte d'Allan
Mots imposés : **licorne**, **elfe**, **cabane**, **ivresse**,
**initiation**, **saule**, **galoper**, **étoile**, **verdoyant**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : « Ton **ivresse**
> va-t-elle donc finir par s'estomper ? demanda Kernéguez.
>
> — Oui, mais j'ai fait des rêves étranges, j'ai vu bien des
> **licornes**, répondit Pontus.
>
> — Des licornes ?
>
> — Oui elles semblaient irréelles, galopant sous les **étoiles**,
> chevauchées par des **elfes**.
>
> — Tu as fait un
> *rêve-de-licornes-galopant-sous-les-étoiles-chevauchées-par-des-elfes*
> (mot composé en breton) ? Le moment est venu pour toi d'être initié à
> nos rites. »
>
> Le soir venu alors dans les ruines sacrées de Lannion, Kernéguez coupa
> quelques **saules** et au creux d'un abribus bâtit une **cabane** au
> milieu d'un parking qui avait verdoyé.
>
> « Ce n'était pas censé être une tente de sudation ? demanda Pontus.
>
> — Hélas ! Cette technologie est à jamais perdue, répondit Kernéguez en
> allumant le feu avec son pistolet à plasma. »
### Le texte de Jack
Mots imposés : **irréel**, **maléfique**, **conte**, **sourire**,
**ami**.
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : « Tu as l'air bien
> soucieux ? dit-il.
>
> — Les oiseaux se sont tus. »
>
> Kernéguez eut l'air surpris. Il tourna la tête, et scruta le
> sous-bois. « C'est étrange mais je ne vois rien de **maléfique**. Et
> toi ? »
>
> Pontus lui intima le silence d'un geste sans équivoque. Kernéguez qui
> était d'un naturel plutôt bavard et joyeux commença à se sentir mal à
> l'aise. Pontus descendit souplement et sans bruit de son cheval, fit
> quelques signes à son **ami** en lui remettant la longe et s'avança
> discrètement dans les taillis.
>
> Quelques minutes s'écoulèrent puis, soudain,… il ne se passa rien.
> Kernéguez commença à triturer son croc de nervosité. Il entendit alors
> de vagues bruits de sabot puis Pontus réapparut accompagné d'une
> magnifique licorne. Kernéguez se détendit et dit avec un **sourire** :
> « Ma parole, c'est un vrai **conte** de fées ! Où as-tu déniché cette
> créature **irréelle** ? ».
### Le texte d'Elisabeth
Mots imposés : **symbole**, **licorne**, **forêt**, **nature**,
**amour**, **initié**, **astres**, **lune**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : on lui avait mis une
> sorte de **symbole** en forme de **licorne** car on lui avait tranché
> le poignet dans une bataille. C'était pour son bien-être.
>
> C'était du rêve à l'époque car cela ne s'y prêtait guère. En plus, il
> vivait loin et reclus danse une immense **forêt** dans de sombres
> nuits nocturnes et étranges.
>
> L'**amour** de la **nature** lui était venu par son père, plus jeune.
>
> Il s'y était **initié** et en même temps à tous les **astres** et
> appris les étoiles et la **lune**.
### Le texte de Gaëlle
Mots imposés : **joyeuse**, **automnale**, **lune**, **elfe**,
**tribu**, **rêves**, **astre**, **racines**, **arbres**,
**créatures**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
>
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : habituellement
> bavard et d'humeur **joyeuse**, le jeune homme était étrangement
> silencieux en cette fin de nuit **automnale**. La **lune** était
> encore haute dans le ciel et sa lumière froide dessinait, sur le
> visage de Kernéguez, des ombres singulières. L'initiation avait été
> rude pour le jeune **elfe**. Arkos, le devin de la **tribu**, lui
> avait prédit une quête fructueuse mais pleine d'embûches.
>
> Laissant son compagnon à ses **rêves** éveillés, Kernéguez observait
> le chemin qu'ils suivaient au milieu de la forêt. L'**astre** nocturne
> éclairait les **racines** des **arbres** centenaires qui ressemblaient
> aux membres distordus de **créatures** maléfiques.
### Le texte de Dominique
Mots imposés : **chêne**, **cheval**, **forêt**, **tribu**,
**banquet**, **conte**, **biche**, **elfe**, **lune**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
>
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : il n'avait pas lâché
> un mot depuis trois heures qu'ils cheminaient et, dans les rares
> instants où les **chênes** se faisaient silencieux, il pouvait
> distinctement l'entendre grincer des dents.
>
> Il faut dire qu'il y avait de quoi : voyager paisiblement ainsi aux
> côtés de celui à qui il avait fait la guerre depuis qu'il avait l'âge
> de tenir sur un **cheval**. Oui mais voila, la paix avait été conclue
> entre les peuples habitant la **forêt** de Brocéliande et Pontus
> allait représenter sa **tribu** au **banquet** célébrant l'harmonie
> retrouvée entre korrigans, **elfes**, humains et tous les autres. Un
> vrai **conte** de fées !
>
> Soudain, du bruit dans les fourrés couvrant le talus à droite du
> chemin. Les traîtres ! c'était un piège mais Kerneguez allait payer.
> Pontus dégaina en un éclair sa fidèle épée et leva le bras pour
> frapper lorsqu'une magnifique **biche** traversa le chemin dans le
> clarté lunaire. Elle s'enfuit aussitôt d'un bond, presque aussi
> effrayée que les deux voyageurs. Pontus haussa les épaules, laissa
> tomber son épée au sol et poursuivit sa route.
### Le texte de Philippe
Mots imposés : **tribu**, **secret**, **palefrenier**, **bosquet**,
**banquet**, **elfe**, **créature**, **maléfique**, **ivresse**
> Kernéguez et Pontus suivaient en silence la petite voie […] qui
> débouche […] sur l'ancienne toute de Carhaix à Landerneau…
>
> Kernéguez-Croc d'argent, comme on l'appelait en raison de l'étrange
> main artificielle qu'il s'était fait adapter au poignet droit […]
> observait depuis quelques minutes son compagnon : que faisait un fils
> de la louve sur le territoire antique de sa **tribu**. Depuis bien des
> siècles la fédération armoricaine avait non seulement contenu mais
> aussi repoussé les Romains vers le sud. Les Vénètes dominaient la
> grande mer du couchant. Les Parisii et ses Nautes s'étaient ralliés à
> la fédération plus par intérêt que par envie… normal pour des Parisii.
> En échange, ils pouvaient partager le **secret** des routes
> commerciales de l'ouest où se trouvaient de riches territoires.
>
> Mais ce Pontus, sénateur romain, ne pouvait s'être égaré si loin des
> routes habituellement empruntées par les diplomates. Qui plus est
> seul, sans même un **palefrenier**.
>
> Au détour d'un **bosquet**, Kernéguez tenta d'engager la conversation.
> En vain. Pontus n'était manifestement pas bavard. Vraiment quelque
> chose ne collait pas. Ils ne sont pas fous ces Romains. Leur
> rationalité les a même perdus. Ils auraient pu conquérir tout le monde
> connu. Ne pas croire aux **elfes**, aux dragons, aux sirènes,… les
> avait empêchés, il y a bien longtemps, d'apprivoiser et d'utiliser ces
> **créatures** qui composaient maintenant l'essentiel des forces armées
> armoricaines. Rome avait raté sa chance de s'imposer au monde.
>
> Pour Kernéguez, une seule raison pouvait pousser Pontus à s'aventurer
> si loin en territoire ennemi : découvrir Ker IS. A la pensée que de
> **maléfiques** Latins puissent l'atteindre, de sa main artificielle,
> il serra le pommeau de de épée. Les druides celtes, capables de toutes
> les prouesses technologiques, pouvait réparer les êtres humains comme
> les machines alors que les Romains végétaient depuis des siècles avec
> des techniques obsolètes. Depuis son initiation, Kernéguez connaissait
> une partie des pratiques druidiques et s'étonnait sans cesse de ce
> qu'ils continuaient à inventer.
>
> Il savourait l'**ivresse** du combat à venir, celui lui vaudrait sans
> doute un **banquet**. Supprimer Pontus serait facile mais ne valait-il
> pas mieux d'abord découvrir ses réelles motivations ?...
<figure>
<img class="photo" src="/2016/images/atelier/20161023_111623.jpg" alt="Les auteurs">
<figcaption>Photo souvenir (Crédit : Philippe Ethuin)</figcaption>
</figure>

View file

@ -0,0 +1,64 @@
---
title: Cadavre exquis
image_file: /2016/images/vignette_2016.jpg
image_desc: L'affiche
---
En 2014 et de nouveau en 2016, l'association Pérégrine a présenté
pendant le festival une machine à rédiger des
[cadavres exquis][wp_cadavres]. Le texte ci-après est le résultat de
la participation des invités et des visiteurs de la quatrième édition
du festival. Les alternances de casse marquent le changement d'auteur.
<figure>
<img class="photo" src="/2016/images/cadavrator.jpg" alt="La machine">
<figcaption>La machine productrice de cadavres</figcaption>
</figure>
> **Et les ombres couraient**, fuyant la lumière éblouissante,
> inquisitrice et porteuse de mort. **Les héros se cachèrent dans la
> grotte la plus proche. Il ne comprenaient pas vraiment ce qu'ils
> devraient véritablement chercher, mais ils le trouveraient sûrement.**
> Le doute s'insinuait dans leurs esprits de plus en plus, devraient-ils
> se séparer pour augmenter leurs chances ou rester soudés pour
> affronter les ombres qui approchaient et les bruits de plus en plus
> étranges… **Une soudaine et malfaisante clameur de l'ouest, sans doute
> possible. Les créatures de l'ouest dans leurs coquilles de bronze
> étaient telles des monstres venues d'un autre monde. C'est alors qu'un
> bruit assourdissant fit trembler le sol. C'était un dragon de bronze à
> tête de poule qui d'une démarche (non) assurée s'avançait vers nous.**
> Crachant des vers de terre, battant sauvagement des ailes, elle
> sapprêtait à nous picorer les pieds. Nombre d'entre nous manquèrent
> d'y laisser des orteils. **Prenant nos jambes à notre cou, un prête
> mesurant 3 mètres tenant un jouet nous barrait la route.** Armé de
> votre sublime épée Excaliburne, vous tranchez le prêtre en deux avant
> de reprendre votre route. Mais le prêtre n'était pas seul… **Il avait
> à ses cotés Monsieur Spock qui leva les yeux** vers les ennemis. Trois
> en tout. Un neurepunch et deux s'écroulèrent.
>
> **L'aube naissante laissa un paysage désolé sur le champ de
> bataille.** Au loin, une silhouette pâle avança et son rire sinistre
> retentit. **Elle semblait heureuse, à la limite de lhystérie. Son
> rire raisonnait chaud et glacé à la fois.** Il m'évoquait ce nougat
> glacé, dont la texture givrée soulageait avec délice ma gorge
> brûlante, les soirées aux palabres interminables. **Quelques secondes
> plus tard, je les aperçus qui descendaient du premier étage, en se
> murmurant de tendres secrets.**
>
> Il lui serra la main et ils entreprirent de passer en revue leurs
> différents. Ce ne fut pas chose facile. **A ça non, il fut très
> difficile de devoir avancer sans eux. Malgré la verdure du paysage
> dont on ne pouvait détourner lœil, les nuages verts, bruns et mauves
> répandaient leurs lianes vaporeuses au dessus du vallon.**
>
> C'est alors que surgit de nulle part un dragon aux écailles d'or. Beau
> et terrifiant à la fois, sa majesté ailée annonçait la mort… **La mort
> d'un petit escargot qui avait décidé darrêter de manger de l'ail
> parce qu'il avait l'intuition que c'était de mauvaise augure !** Il
> s'était rappelé la fois ou son amie, la salamandre tachetée, l'avait
> invité à un brunch festif en compagnie des copains de la forêt. Ce
> jour là, leur gourmandise leur avait porté préjudice au concours du
> plus glouton des mangeurs de condiments…
[wp_cadavres]: https://fr.wikipedia.org/wiki/Cadavre_exquis_%28jeu%29

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 964 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

33
content/2016/index.md Normal file
View file

@ -0,0 +1,33 @@
---
title: 2016
image_file: /2016/images/vignette_2016.jpg
image_desc: L'affiche
---
La quatrième édition du festival s'est tenue une nouvelle fois dans la
salle des Ursulines à Lannion. Cette année, des élèves des écoles de
Servel et du Rusquet ont illustré des extraits de romans de Syven et
Edwige Louvet, invitées du festival. Des élèves du lycée Le Dantec ont
créé un prototype de jeu et organisé l'accueil du public. Les
associations [Les Diseurs de Contes][diseurs] et
[Lire et Faire Lire][lire] sont venues apporter une dose d'imaginaire
de plus aux plus jeunes. [Philippe Ethuin][archeosf] nous a proposé un
[atelier ludique d'écriture][atelier], pour écrire sans se prendre
trop au sérieux. [Les Pérégrins][peregrine] ont invité le public à
raconter une histoire sous la forme d'un [cadavre exquis][cadavre]. Et
les membres de [Parties-Civiles][pc] ont encore une fois emporté tout
le monde au royaume des jeux...
<figure>
<img class="photo" src="/2016/images/2016_01.jpg" alt="La salle">
<figcaption>Dans les travées...</figcaption>
</figure>
[archeosf]: http://archeosf.publie.net
[atelier]: atelier.html
[cadavre]: cadavre_exquis.html
[diseurs]: http://les-diseurs-de-contes.levillage.org
[lire]: http://www.lireetfairelire.org/
[pc]: http://parties-civiles-asso.fr/blog/
[peregrine]: http://www.peregrine.asso.fr/

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

8
content/2017/index.md Normal file
View file

@ -0,0 +1,8 @@
---
title: 2017
image_file: /2017/images/vignette_2017.jpg
image_desc: L'affiche
---
La cinquième édition du festival s'est tenue dans la salle des
Ursulines à Lannion les 21 et 22 octobre 2017.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Binary file not shown.

6
content/403.md Normal file
View file

@ -0,0 +1,6 @@
---
title: Accès interdit
image_file: /images/scorfel_sur_vache.png
image_desc: Le dragon sur la vache
layout: error.njk
---

6
content/404.md Normal file
View file

@ -0,0 +1,6 @@
---
title: Page inexistante
image_file: /images/scorfel_sur_vache.png
image_desc: Le dragon sur la vache
layout: error.njk
---

View file

@ -0,0 +1,109 @@
---
title: Association Scorfel
image_file: /images/scorfel_pis_de_vache.png
image_desc: Le dragon qui tète
layout: with_colophon.njk
---
<div class="container">
<div class="row">
<div class="col-sm-12 col-md-6 col-lg-8">
Scorfel est une association type loi 1901 enregistrée à la sous
préfecture de Lannion le 14 avril 2014. L'annonce de sa création est
parue le samedi 26 avril 2014 au Journal Officiel (annonce n°353). Son
objet est la planification, l'organisation et la promotion d'un
événement récurrent consacré aux jeux et à la littérature de
l'imaginaire, dans le périmètre de l'agglomération Lannion-Trégor
Communauté.
Vous pouvez lire ici :
- la dernière révision des [statuts de l'association][statuts] ;
- [le règlement intérieur][règlement] auquel doivent se conformer tous
les adhérents.
</div>
<aside class="col-sm">
<h2>Pourquoi Scorfel ?</h2>
Sur la côte de Granit Rose, entre les deux vallées plus communément
appelées "Traouïero", le paysage chaotique et magique cache bien plus
d'une légende. Dans la vallée du Petit-Traouïero se cache une créature
facétieuse, le "Scorfel", un dragon se cachant dans les herbes hautes
des prairies pour venir téter par surprise le pis des vaches. Si ce
dernier trait a tendance à amuser, je serais vous, je ne
m'approcherais pas trop près du Karreg ar Ludu, le "Rocher des
cendres", où on dit qu'il habite...
</aside>
</div>
</div>
## Historique
Les membres fondateurs de Scorfel sont issus des associations
*[Parties-Civiles][]* et *Pérégrine* qui promeuvent respectivement
l'expression ludique et la science-fiction dans la région de Lannion.
Leur volonté était de faire connaître au plus large public possible
les activités ludiques et les genres littéraires fantastiques souvent
ignorés ou dénigrés par les courants d'opinion et les médias
dominants.
Le festival Scorfel est l'expression de cet objectif. Il permet au
public trégorrois de rencontrer des auteurs et des illustrateurs
confidentiels ou reconnus, de découvrir et de s'essayer à des
activités ludiques variées. Il permet aux joueurs plus aguerris de se
rencontrer et d'élargir l'horizon des univers qu'il aime fréquenter
dans le jeu.
<figure>
<div class="container">
<div class="row">
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2013/images/vignette_2013.jpg" alt="Affiche 2013">
</div>
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2014/images/vignette_2014.jpg" alt="Affiche 2014">
</div>
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2015/images/vignette_2015.jpg" alt="Affiche 2015">
</div>
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2016/images/vignette_2016.jpg" alt="Affiche 2016">
</div>
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2017/images/vignette_2017.jpg" alt="Affiche 2017">
</div>
<div class="col-sm-6 col-md-4">
<img class="poster" src="/2018/images/vignette_2018.jpg" alt="Affiche 2018">
</div>
</div>
</div>
<figcaption>Les éditions précédentes du festival</figcaption>
</figure>
## Vie de l'association
L'association est ouverte à tous. Vous pouvez participer :
- en adhérant librement à l'association pour vous tenir au courant et
apporter suggestions et aide ponctuelle ;
- en rejoignant l'équipe d'organisation du festival ;
- en parlant du festival et de l'association autour de vous, en nous
aidant à trouver du support pour pérenniser le festival ;
- envoyant un don à l'association.
Les membres de l'association communiquent par l'intermédiaire d'une
liste de diffusion. Ils se rencontrent selon le besoin et leurs
disponibilités lors de réunions afin de partager les informations
quant à la préparation du festival annuel.
Vous pouvez nous contacter en vous rendant aux assemblées des
associations *Scorfel*, *Parties Civiles* ou *Pérégrine*, ou bien par
courriel ou téléphone.
[statuts]: /association/pub/scorfel_statuts_revision_20181212.pdf
[règlement]: /association/pub/scorfel_règlement.pdf
[Parties-Civiles]: http://parties-civiles-asso.fr/

Binary file not shown.

1
content/css/mini-default.min.css vendored Symbolic link
View file

@ -0,0 +1 @@
../../node_modules/mini.css/dist/mini-default.min.css

186
content/css/scorfel.css Normal file
View file

@ -0,0 +1,186 @@
@media screen and (min-width: 480px) {
h1 {
}
}
@media screen and (min-width: 768px) {
h1 {
font-size: 3rem;
margin-top: 100px;
}
}
@media screen and (min-width: 1280px) {
h1 {
font-size: 4rem;
margin-top: 80px;
}
}
article {
margin-top: 2em;
}
aside > h2 {
font-family: Georgia, serif;
font-size: 1.2em;
margin-bottom: 10px;
margin-left: 0px;
margin-top: 0px;
}
aside {
border-radius: 4px;
border-style: solid;
border-width: 2px;
margin-bottom: 0.4em;
margin-left: 1em;
margin-top: 0.4em;
padding: 0.6em;
width: 40%;
}
aside > p {
margin: 0em;
}
a {
color: #333;
font-weight: bold;
}
li {
margin-bottom: 0em;
margin-left: 2em;
}
p {
margin-bottom: 1em;
}
blockquote {
border-left-width: 2px;
color: #333;
}
table {
border-style: none;
width: 100%
}
td {
padding-left: 0.4em;
}
.value {
font-family: Courier, monospace;
}
#validation {
margin-top: 0.2em;
text-align: left;
}
figcaption {
font-style: italic;
font-weight: lighter;
text-align: center;
}
footer {
border-top: 1px solid black;
background: #fff;
padding: 0 0 0.3em 0;
color: #000;
text-align: right;
}
footer * {
font-size: 0.8rem;
font-style: italic;
}
/* Larger than mobile */
@media (min-width: 400px) {
body {
background-color: #FFF;
font-family: Verdana, sans-serif;
}
}
/* Larger than phablet */
@media (min-width: 550px) {
body {
background-color: #FFF;
font-family: Verdana, sans-serif;
}
}
/* Larger than tablet */
@media (min-width: 750px) {
body {
background-color: #FFF;
font-family: Verdana, sans-serif;
with: 750px;
}
.photo {
display: block;
margin-left: auto;
margin-right: auto;
max-height: 400px;
max-width: 600px;
}
.poster {
width: 200px;
}
}
/* Larger than desktop */
@media (min-width: 1000px) {
body {
background-color: #FFF;
font-family: Verdana, sans-serif;
margin-left: auto;
margin-right: auto;
width: 900px;
}
.photo {
display: block;
margin-left: auto;
margin-right: auto;
max-height: 400px;
max-width: 800px;
}
.poster {
width: 200px;
}
}
/* Larger than Desktop HD */
@media (min-width: 1200px) {
body {
background-color: #FFF;
font-family: Verdana, sans-serif;
margin-left: auto;
margin-right: auto;
width: 1200px;
}
.photo {
display: block;
margin-left: auto;
margin-right: auto;
max-height: 600px;
max-width: 800px;
}
.poster {
width: 280px;
padding-left: 10px;
padding-right: 10px;
}
}

BIN
content/images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

29
layouts/_colophon.njk Normal file
View file

@ -0,0 +1,29 @@
<h2>Colophon</h2>
<div class="container">
<div class="row">
<div class="col-sm-12 col-lg-4">
<h3>Association Scorfel</h3>
<p class="value">Association SCORFEL<br/>
36 Lotissement de Kergaradec<br/>
22300 Ploulec'h</p>
<p>Numéro d'enregistrement&nbsp;
<span class="value">W223001627</span><br/>
Numéro SIRET&nbsp;:
<span class="value">803&nbsp;809&nbsp;912&nbsp;00014</span></p>
</div>
<div class="col-sm-12 col-lg-4">
<h3>Contacts :</h3>
<p class="value">convention.scorfel[at]gmail.com</p>
</div>
<div class="col-sm-12 col-lg-4">
<h3>Actualité et réseaux sociaux</h3>
<ul>
<li><a href="http://scorfel.fr">Le blog</a></li>
<li><a href="https://www.facebook.com/Scorfel">Facebook</a></li>
<li><a href="https://plus.google.com/101901564320372401720">Google+</a></li>
<li><a href="https://twitter.com/festivalScorfel">Twitter</a></li>
</ul>
</div>
</div>
</div>

43
layouts/base.njk Normal file
View file

@ -0,0 +1,43 @@
<!DOCTYPE HTML>
<html lang="fr">
<head>
<title>Scorfel - {{ title }}</title>
<meta charset="UTF-8">
<meta name="author" content="David Soulayrol">
<meta name="generator" content="Metalsmith">
<meta name="copyright" content="Association Scorfel">
<meta name="description" lang="fr" content="Le site de l'association Scorfel">
<meta name="keywords" lang="fr" content="scorfel, lannion, association, jeux, JDR, SF, fantasy, fantastique">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="index, follow">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<link rel="icon" type="image/png" href="/images/favicon.ico">
<link rel="stylesheet" href="/css/mini-default.min.css" />
<link rel="stylesheet" href="/css/scorfel.css" />
</head>
<body>
{% block main %}
{% endblock %}
<footer>
<div class="container">
<div class="row">
<!-- <div id="validation" class="col-sm">
<a href="http://validator.w3.org/check?uri=referer">
<img src="/images/valid_html50.png" alt="Code HTML 5 valide" /></a>
<a href="http://jigsaw.w3.org/css-validator/check/referer">
<img src="/images/valid_css3.png" alt="Code CSS 3 valide" /></a>
</div> -->
<div class="col-sm">
<p>Sauf mentions contraires, toutes les illustrations sont
&copy;2013-2018 <a href="http://animaupetitbonheur.fr/blog/">Gaboo</a>,<br/>
les textes et autres documents &copy;2017,2018 Association
Scorfel.</p>
</div>
</div>
</div>
</footer>
</body>
</html>

20
layouts/default.njk Normal file
View file

@ -0,0 +1,20 @@
{% extends "base.njk" %}
{% block main %}
<div class="container">
<div class="row">
<div class="col-sm-12 col-md">
<img src="{{image_file}}" alt="{{image_desc}}"/>
</div>
<div class="col-sm">
<h1>{{title}}</h1>
</div>
</div>
</div>
<section id="content">
<article>
{{contents | safe}}
</article>
</section>
{% endblock %}

16
layouts/error.njk Normal file
View file

@ -0,0 +1,16 @@
{% extends "base.njk" %}
{% block main %}
<div class="container">
<div class="row">
<div class="col-sm-12 col-md">
<img src="{{image_file}}" alt="{{image_desc}}"/>
</div>
<div class="col-sm">
<h1>{{title}}</h1>
</div>
</div>
</div>
{% include "_colophon.njk" %}
{% endblock %}

34
layouts/index.njk Normal file
View file

@ -0,0 +1,34 @@
{% extends "base.njk" %}
{% block main %}
<div class="container">
<div class="row">
<div class="col-sm-12 col-md">
<img src="/images/scorfel_bidon_de_lait.png" alt="Le dragon et le bidon"/>
</div>
<div class="col-sm">
<h1>{{title}}</h1>
</div>
</div>
</div>
<section id="content">
<table>
<thead>
<tr>
<th>Document</th>
<th>Date</th>
</tr>
</thead>
<tbody>
{% set options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' } %}
{% for file in files %}
<tr>
<td data-label="Document"><a href="/{{ file.path }}">{{ file.name }}</a></td>
<td data-label="Date">{{ file.date.toLocaleDateString('en-US', options) }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</section>
{% endblock %}

21
layouts/with_colophon.njk Normal file
View file

@ -0,0 +1,21 @@
{% extends "base.njk" %}
{% block main %}
<div class="container">
<div class="row">
<div class="col-sm-12 col-md">
<img src="{{image_file}}" alt="{{image_desc}}"/>
</div>
<div class="col-sm">
<h1>{{title}}</h1>
</div>
</div>
</div>
<section id="content">
<article>
{{contents | safe}}
{% include "_colophon.njk" %}
</article>
</section>
{% endblock %}

9821
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

53
package.json Normal file
View file

@ -0,0 +1,53 @@
{
"name": "site-scorfel",
"version": "2019.05.23",
"private": true,
"description": "The sources for <httpe://scorfel.fr>",
"main": "",
"scripts": {
"build": "DEBUG=metalsmith* npm run clean && npm run build:metalsmith",
"build:prod": "NODE_ENV=production npm run build",
"build:metalsmith": "nodejs src/scripts/build-metalsmith.js",
"clean": "rimraf dist",
"dev": "npm run build && DEBUG=metalsmith* nodemon --watch src/scripts --exec node src/scripts/run-dev-server.js",
"server": "npm run build && http-server dist",
"deploy": "npm run build && cd dist && rsync -v -rlptz --relative * david@soulayrol.net:/var/www/tests.soulayrol.net",
"deploy:prod": "npm run build:prod && cd dist && rsync -v -rlptz --relative * david@soulayrol.net:/var/www/scorfel.fr",
"lint": "npm run lint:js && npm run lint:css",
"lint:js": "eslint src test",
"lint:css": "stylelint src/assets/css/**/*.css",
"test": "npm run lint && npm run test:build-process",
"test:build-process": "npm run build"
},
"author": "David Soulayrol <david.soulayrol@gmail.com>",
"dependencies": {
"mini.css": "^3.0.1"
},
"devDependencies": {
"browser-sync": "^2.26.5",
"bs-fullscreen-message": "^1.1.0",
"clean-css": "^4.2.1",
"cli-table2": "^0.2.0",
"debug": "^3.2.6",
"eslint": "^4.19.1",
"eslint-config-standard": "^10.2.1",
"eslint-plugin-import": "^2.17.2",
"eslint-plugin-node": "^5.2.1",
"eslint-plugin-promise": "^3.8.0",
"eslint-plugin-standard": "3.0.1",
"filesize": "^3.6.1",
"http-server": "^0.10.0",
"jstransformer-nunjucks": "^0.5.0",
"metalsmith": "^2.2.0",
"metalsmith-assets": "^0.1.0",
"metalsmith-clean-css": "^6.0.0",
"metalsmith-index": "^1.1.0",
"metalsmith-layouts": "2.3.1",
"metalsmith-markdownit": "^0.5.0",
"metalsmith-rename": "^1.0.0",
"nodemon": "^1.19.0",
"rimraf": "^2.6.3",
"stylelint": "^8.2.0",
"stylelint-config-standard": "^17.0.0"
}
}

15
src/config/paths.js Normal file
View file

@ -0,0 +1,15 @@
const { resolve, join } = require('path')
const projectRoot = resolve(__dirname, '..', '..')
const distribution = join(projectRoot, 'dist')
module.exports = {
projectRoot,
/* Nodes */
miniCss: join(projectRoot, 'node_modules', 'mini.css'),
/* Metalsmith */
metalsmithSource: 'content',
metalsmithDestination: distribution,
/* Server */
serverRoot: distribution
}

View file

@ -0,0 +1,12 @@
const Debug = require('debug')
const metalsmith = require('./metalsmith')
const debug = Debug('Metalsmith-TES')
metalsmith.build(function (err) {
if (err) {
debug(err)
throw err
}
debug('Metalsmith build finished!')
})

View file

@ -0,0 +1,97 @@
const path = require('path')
const Table = require('cli-table2')
const filesize = require('filesize')
function generateFileMap (files) {
return Object.keys(files).reduce((map, filename) => {
const file = files[filename]
const parsedFilename = path.parse(filename)
const ext = parsedFilename.ext.substr(1)
const extFiles = map[ext] || []
return {
...map,
[ext]: [
...extFiles,
{
file,
filename
}
]
}
}, {})
}
export function StatisticsPlugin (options) {
return (files, metalsmith, done) => {
const fileMap = generateFileMap(files)
const fileTypes = Object.keys(fileMap)
// File overview table
fileTypes.forEach((filetype) => {
const fileTypeFiles = fileMap[filetype]
const count = fileTypeFiles.length
const size = fileTypeFiles.reduce((totalsize, entry) => {
return totalsize + entry.file.contents.byteLength
}, 0)
const filenamesTable = new Table({
head: [`${count} ${filetype}-${count > 1 ? 'files' : 'file'} with total ${filesize(size)}`, 'File size'],
wordWrap: true,
colWidths: [process.stdout.columns - 16, 12]
})
fileTypeFiles.forEach((entry) => {
const size = filesize(entry.file.contents.byteLength)
filenamesTable.push([entry.filename, size])
})
console.log(filenamesTable.toString())
})
done()
}
}
export function DebugPlugin (options) {
function sanitizeTableContent (content) {
const length = content.length
content = content.replace(/\s+/g, ' ').slice(0, config.maxContentLength)
if (length > config.maxContentLength) {
content = content.trim() + '...'
}
return content
}
const defaultOptions = {
maxContentLength: 1000
}
const config = {
...defaultOptions,
...options
}
return (files, metalsmith, done) => {
const fileMap = generateFileMap(files)
const fileTypes = Object.keys(fileMap)
fileTypes.forEach((filetype) => {
const fileTypeFiles = fileMap[filetype]
fileTypeFiles.forEach((entry) => {
const content = sanitizeTableContent(entry.file.contents.toString())
const size = filesize(entry.file.contents.byteLength)
const metadata = {
...entry.file
}
delete metadata.contents
const fileTable = new Table({
head: [`${entry.filename} @ ${size}`],
wordWrap: true,
colWidths: [process.stdout.columns - 2]
})
fileTable.push([JSON.stringify(metadata, null, 2)])
fileTable.push([content])
console.log(fileTable.toString())
})
})
done()
}
}

View file

@ -0,0 +1,63 @@
const path = require('path')
const Table = require('cli-table2')
const filesize = require('filesize')
module.exports = plugin
function generateFileMap (files) {
return Object.keys(files).reduce((map, filename) => {
const file = files[filename]
const parsedFilename = path.parse(filename)
const ext = parsedFilename.ext.substr(1)
const extFiles = map[ext] || []
return {
...map,
[ext]: [
...extFiles,
{
file,
filename
}
]
}
}, {})
}
function plugin () {
return (files, metalsmith, done) => {
const fileMap = generateFileMap(files)
const fileTypes = Object.keys(fileMap)
// File overview table
fileTypes.forEach((filetype) => {
const fileTypeFiles = fileMap[filetype]
const count = fileTypeFiles.length
const size = fileTypeFiles.reduce((totalsize, entry) => {
// Some plugins (eg. metalsmith-data-markdown) replace the Buffer by a string
if (typeof entry.file.contents === 'string') {
return totalsize + entry.file.contents.length
} else {
return totalsize + entry.file.contents.byteLength
}
}, 0)
const filenamesTable = new Table({
head: [`${count} ${filetype}-${count > 1 ? 'files' : 'file'} with total ${filesize(size)}`, 'File size'],
wordWrap: true,
colWidths: [process.stdout.columns - 16, 12]
})
fileTypeFiles.forEach((entry) => {
var size = 0
// Some plugins (eg. metalsmith-data-markdown) replace the Buffer by a string
if (typeof entry.file.contents === 'string') {
size = entry.file.contents.length
} else {
size = entry.file.contents.byteLength
}
filenamesTable.push([entry.filename, size])
})
console.log(filenamesTable.toString())
})
done()
}
}

51
src/scripts/metalsmith.js Normal file
View file

@ -0,0 +1,51 @@
// This is the actual metalsmith configuration script.
const Metalsmith = require('metalsmith')
const index = require('metalsmith-index')
const cleanCSS = require('metalsmith-clean-css')
const layouts = require('metalsmith-layouts')
const markdown = require('metalsmith-markdownit')
const rename = require('metalsmith-rename')
const statistics = require('./metalsmith-statistics-plugin')
const paths = require('../config/paths')
const __PROD__ = process.env.NODE_ENV === 'production'
module.exports = new Metalsmith(paths.projectRoot)
.clean(__PROD__)
.source(paths.metalsmithSource)
.destination(paths.metalsmithDestination)
.use(cleanCSS({
files: 'content/css/*.css',
cleanCSS: {
rebase: true
}
}))
.use(index({
'association/pub': { title: "Documents de l'association" },
'2017/CR': { title: "Comptes-rendus de réunion" },
'2018/CR': { title: "Comptes-rendus de réunion" }
}))
.use(markdown({
html: true,
typographer: true,
// quotes: ['«\xA0', '\xA0»', '\xA0', '\xA0']
}))
.use(layouts({
'default': 'default.njk',
pattern: '**/*.html',
engineOptions: {
globals: {
production: __PROD__
}
}
}))
.use(layouts({
'default': 'index.njk',
pattern: '**/index.list'
}))
.use(rename([
[/\.list$/, '.html']
]))
.use(statistics())
// .use(DebugPlugin())

View file

@ -0,0 +1,49 @@
const bs = require('browser-sync').create('Scorfel')
const path = require('path')
const Debug = require('debug')
const stripAnsi = require('strip-ansi')
const metalsmith = require('./metalsmith')
const paths = require('../config/paths')
const debug = Debug('Metalsmith-Scorfel')
function buildMetalsmith (rebuild) {
debug('Building Metalsmith')
metalsmith.build((err) => {
if (err) {
debug('Metalsmith build error:')
console.error(err)
return bs.sockets.emit('fullscreen:message', {
title: 'Metalsmith Error:',
body: stripAnsi(`${err.message}\n\n${err.stack}`),
timeout: 100000
})
}
debug('Metalsmith build successfully finished! Reloading browsers.')
bs.reload()
})
}
bs.init({
server: paths.serverRoot,
port: 8080,
ui: {
port: 9000
},
open: false,
logLevel: 'debug',
logPrefix: 'BrowserSync',
logConnections: true,
logFileChanges: true,
notify: true,
files: [{
match: [
path.resolve(paths.projectRoot, 'content', '**', '*'),
path.resolve(paths.projectRoot, 'layouts', '**', '*.njk')
],
fn: function (event, file) {
buildMetalsmith()
}
}]
})

7
stylelint.config.js Normal file
View file

@ -0,0 +1,7 @@
module.exports = {
extends: 'stylelint-config-standard',
rules: {
'selector-nested-pattern': /^&[^,\n\r]+(,\s*&[^,\n\r]+)*$/,
'selector-type-no-unknown': null
}
}