Initial readings data on gemini capsule.
This commit is contained in:
parent
05d39cc8b5
commit
f49202db85
12 changed files with 2004 additions and 138 deletions
|
|
@ -1,4 +1,4 @@
|
|||
# La clef laxienne
|
||||
# Mes pages
|
||||
|
||||
## Prologue
|
||||
|
||||
|
|
@ -12,18 +12,22 @@ Je peux facilement être contacté aux adresses suivantes.
|
|||
=> xmpp:david@ti-nuage.fr Mon identifiant sur XMPP
|
||||
=> https://pouet.chapril.org/@ds Mon compte sur Mastodon
|
||||
|
||||
Cette capsule est plus particulièrement consacrée à mes lectures et à mes écrits.
|
||||
|
||||
## Lectures
|
||||
|
||||
Je lis beaucoup. Et depuis le printemps 2010, je note les références de tout ce que je lis, hors journaux (Télérama, Charlie Hebdo) ou revues (Bifrost, Le visage vert, Le Novelliste). Pour voir, après coup, le volume que cela peut représenter. Pour me remémorer. Par jeu, et par habitude maintenant.
|
||||
|
||||
=> /lectures Toutes mes lectures
|
||||
|
||||
## Chroniques
|
||||
|
||||
Sur cette capsule se trouvent plus particulièrement les commentaires que j'ai pu écrire pour NooSFere ou le Club Présences d'Esprits deux associations dédiées aux littératures de l'Imaginaire, mais aux démarches et objectifs très différents.
|
||||
Outre mes lectures, je participe à des travaux de relecture ou j'écris des commentaires pour NooSFere ou le Club Présences d'Esprits, deux associations dédiées aux littératures de l'Imaginaire, mais aux démarches et objectifs très différents.
|
||||
|
||||
=> /chroniques Tous les documents
|
||||
|
||||
## Ours
|
||||
|
||||
> Ce générateur est indestructible, incassable et sans défauts. Il ne requiert aucune source d’énergie extérieure. Pour le mettre en marche, appuyer sur le bouton marqué 1. Pour l’arrêter, utiliser la clef laxienne.
|
||||
|
||||
— La clef Laxienne, Robert Sheckley
|
||||
|
||||
Cette capsule est soigneusement éditée sur Emacs et scrupuleusement générée avec Metalsmith. Elle est hébergée chez l'association Ti-Nuage.
|
||||
|
||||
=> https://ti-nuage.fr Ti Nuage
|
||||
|
|
|
|||
61
gemini/lectures/2010.json
Normal file
61
gemini/lectures/2010.json
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
[
|
||||
{
|
||||
"a": "Bayard, Pierre",
|
||||
"c": "paradoxe",
|
||||
"C": 10,
|
||||
"t": "Comment parler des livres que l'on n'a pas lu ?",
|
||||
"p": "minuit",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"C": 0,
|
||||
"t": "Masquarade",
|
||||
"p": "atalante",
|
||||
"y": 2001
|
||||
},
|
||||
{
|
||||
"a": "Figes, Orlando",
|
||||
"c": "folioh",
|
||||
"C": 10,
|
||||
"t": "La révolution russe",
|
||||
"p": "gallimard",
|
||||
"v" : 2,
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"C": 0,
|
||||
"t": "Pieds d'argile",
|
||||
"p": "atalante",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Bourdieu, Pierre",
|
||||
"C": 10,
|
||||
"t": "Sur la télévision",
|
||||
"p": "raisons_dagir",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Eco, Umberto",
|
||||
"C": 0,
|
||||
"t": "Comment voyager avec un saumon",
|
||||
"p": "ldp",
|
||||
"y": 1997
|
||||
},
|
||||
{
|
||||
"a": "Boulgakov, Mikhaïl",
|
||||
"C": 0,
|
||||
"t": "Cœurs de chien",
|
||||
"p": "ldp",
|
||||
"y": 1999
|
||||
},
|
||||
{
|
||||
"a": "Krakauer, Jon",
|
||||
"C": 0,
|
||||
"t": "Into the wild",
|
||||
"p": "presses_de_la_cite",
|
||||
"y": 2008
|
||||
}
|
||||
]
|
||||
92
gemini/lectures/2011.json
Normal file
92
gemini/lectures/2011.json
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
[
|
||||
{
|
||||
"a": "Joub et Nicoby",
|
||||
"C": 20,
|
||||
"p": "glenat",
|
||||
"t": "Daniel Fuchs : mes années bêtes et méchantes.",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "Le père porcher.",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Sue, Eugène",
|
||||
"c": "quarto",
|
||||
"p": "gallimard",
|
||||
"t": "Les mystères de Paris.",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Heurteau, Stéphane et Sébastien Corbet",
|
||||
"C": 20,
|
||||
"p": "vagabondages",
|
||||
"t": "Fanch Karadec : l'enquêteur breton.",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Goimard, Jacques",
|
||||
"C": 10,
|
||||
"p": "pocket",
|
||||
"s": "Stéphane Coadou",
|
||||
"t": "Critique de la science-fiction.",
|
||||
"y" : 2002
|
||||
},
|
||||
{
|
||||
"a": "Zamiatine, Eugène",
|
||||
"p": "gallimard",
|
||||
"t": "Nous autres.",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Moebius",
|
||||
"C": 20,
|
||||
"p": "glenat",
|
||||
"t": "Arzak l'arpenteur",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Lévi-Strauss, Claude",
|
||||
"C": 10,
|
||||
"c": "terre",
|
||||
"p": "plon",
|
||||
"t": "Tristes tropiques.",
|
||||
"y": 1993
|
||||
},
|
||||
{
|
||||
"a": "Dantec, Maurice G",
|
||||
"p": "ldp",
|
||||
"t": "Artefact",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Fred",
|
||||
"C": 20,
|
||||
"p": "dargaud",
|
||||
"t": "Philémon, l'intégrale",
|
||||
"v": 3,
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Asimov, Isaac",
|
||||
"p": "omnibus",
|
||||
"t": "Le grand livre des robots",
|
||||
"v": 2,
|
||||
"y": 1990
|
||||
},
|
||||
{
|
||||
"a": "Eco, Umberto",
|
||||
"p": "grasset",
|
||||
"t": "Le cimetière de Prague",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Bilal, Enki",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"t": "Julia & Roem",
|
||||
"y": 2011
|
||||
}
|
||||
]
|
||||
193
gemini/lectures/2012.json
Normal file
193
gemini/lectures/2012.json
Normal file
|
|
@ -0,0 +1,193 @@
|
|||
[
|
||||
{
|
||||
"a": "Colfer, Eoin",
|
||||
"p": "denoel",
|
||||
"t": "H2G2 Encore une chose...",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry et Neil Gaiman",
|
||||
"p": "jai_lu",
|
||||
"t": "De bons présages",
|
||||
"y": 1995
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Dieu en personne",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Mourier, Davy",
|
||||
"C": 20,
|
||||
"p": "ankama",
|
||||
"s": "Stéphane Coadou",
|
||||
"t": "41€ pour une poignée de psychotropes",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Fry, Stephen",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"t": "Le faiseur d'histoire",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Jul",
|
||||
"C": 20,
|
||||
"p": "dargaud",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Silex and the city, T1",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Le dessin",
|
||||
"y": 2001
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "Va-t-en-guerre",
|
||||
"y": 2003
|
||||
},
|
||||
{
|
||||
"a": "Schwartz et Yann",
|
||||
"C": 20,
|
||||
"p": "dupuis",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Le groom vert-de-gris",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Genefort, Laurent",
|
||||
"p": "jai_lu",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Une porte sur l'éther",
|
||||
"y": 2003
|
||||
},
|
||||
{
|
||||
"a": "Darwin, Charles",
|
||||
"C": 10,
|
||||
"p": "flammarion",
|
||||
"t": "L'origine des espèces",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Brown, Frédéric",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Martiens, go home !",
|
||||
"y": 2000
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. L'origine",
|
||||
"y": 1991
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"p": "vaunevargues",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "L'Épave",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Brown, Frédéric",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "L'univers en folie",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"p": "denoel",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Vue en coupe d'une ville malade",
|
||||
"y": 1985
|
||||
},
|
||||
{
|
||||
"a": "Borges, Jorge Luis",
|
||||
"c": "folio",
|
||||
"p": "gallimard",
|
||||
"t": "Fictions",
|
||||
"y": 1983
|
||||
},
|
||||
{
|
||||
"a": "Pouilloux, Jean-Yves",
|
||||
"C": 10,
|
||||
"c": "folio",
|
||||
"p": "gallimard",
|
||||
"t": "Fictions, de Jorge Luis Borges",
|
||||
"y": 1992
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "Le dernier continent",
|
||||
"y": 2003
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. La Qu...",
|
||||
"y": 1991
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. Le processus",
|
||||
"y": 1993
|
||||
},
|
||||
{
|
||||
"a": "Bova, Ben",
|
||||
"p": "fleuve_noir",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Mars",
|
||||
"y": 2001
|
||||
},
|
||||
{
|
||||
"a": "Bova, Ben",
|
||||
"p": "fleuve_noir",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Retour sur Mars",
|
||||
"y": 2003
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. Le début de la fin",
|
||||
"y": 1995
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. La 2,333e dimension",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Robinson, Kim Stanley",
|
||||
"p": "omnibus",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "La trilogie martienne",
|
||||
"y": 2006
|
||||
}
|
||||
]
|
||||
172
gemini/lectures/2013.json
Normal file
172
gemini/lectures/2013.json
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
[
|
||||
{
|
||||
"a": "Galopin, Arnould",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Le docteur Oméga (aventures fantastiques de trois français dans la planète Mars)",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Allais, Alphonse",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "À se tordre"
|
||||
},
|
||||
{
|
||||
"a": "Flammarion, Camille",
|
||||
"C": 10,
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "La fin du monde",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Ponge, Francis",
|
||||
"C": 30,
|
||||
"p": "gallimard",
|
||||
"t": "Le parti pris des choses, suivi de Proêmes",
|
||||
"y": 1967
|
||||
},
|
||||
{
|
||||
"a": "Le Rouge, Gustave",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Le prisonnier de la planète Mars",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Le Rouge, Gustave",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "La guerre des vampires",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Mourier, Davy",
|
||||
"C": 20,
|
||||
"p": "adalie",
|
||||
"s": "Stéphane Coadou",
|
||||
"t": "Mouarf",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Leinster, Murray",
|
||||
"p": "clandestin",
|
||||
"s": "Pérégrine",
|
||||
"t": "Un logique nommé Joe",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Tzu, Sun",
|
||||
"C": 10,
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "L'art de la guerre",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Machiavel, Nicolas",
|
||||
"C": 10,
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Le prince"
|
||||
},
|
||||
{
|
||||
"a": "Christin, Pierre et Jean-Claude Mézières",
|
||||
"C": 20,
|
||||
"p": "dargaud",
|
||||
"t": "Valérian",
|
||||
"v": 7,
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Julius Corentin Acquefacques, prisonnier des rêves. Le décalage.",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Bayard, Pierre",
|
||||
"c": "paradoxe",
|
||||
"C": 10,
|
||||
"p": "minuit",
|
||||
"t": "Comment parler des lieux où l'on n'a pas été ?",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Aldiss, Brian",
|
||||
"p": "clandestin",
|
||||
"s": "Pérégrine",
|
||||
"t": "La tour des damnés",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Alexeïev, Catherine",
|
||||
"C": 10,
|
||||
"p": "cosmopole",
|
||||
"t": "Dictionnaire insolite de la Russie",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Boulgakov, Mikhaïl",
|
||||
"p": "pocket",
|
||||
"t": "La garde blanche",
|
||||
"y": 1970
|
||||
},
|
||||
{
|
||||
"a": "Spinrad, Norman",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"t": "Rêve de fer",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Geha, Thomas",
|
||||
"p": "critic",
|
||||
"t": "Les créateurs",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Delmeulle, Frédéric",
|
||||
"p": "ldp",
|
||||
"t": "La parallèle Vertov",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Cox, Erle",
|
||||
"c": "1018",
|
||||
"p": "uge",
|
||||
"s": "Solène Chaplet",
|
||||
"t": "La sphère d'or",
|
||||
"y": 1974
|
||||
},
|
||||
{
|
||||
"a": "Renard, Maurice",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Le maître de la lumière",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Asimov, Isaac",
|
||||
"p": "omnibus",
|
||||
"t": "Vers Fondation",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Asimov, Isaac",
|
||||
"c": "lune",
|
||||
"p": "denoel",
|
||||
"t": "Fondation",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Asimov, Isaac",
|
||||
"c": "lune",
|
||||
"p": "denoel",
|
||||
"t": "Fondation foudroyée",
|
||||
"y": 2006
|
||||
}
|
||||
]
|
||||
174
gemini/lectures/2014.json
Normal file
174
gemini/lectures/2014.json
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
[
|
||||
{
|
||||
"a": "Dunyach, Jean-Claude",
|
||||
"p": "atalante",
|
||||
"t": "Déchiffrer les trame",
|
||||
"y": 2001
|
||||
},
|
||||
{
|
||||
"a": "Savage, Sam",
|
||||
"p": "actessud",
|
||||
"s": "Livre à pattes du Carré Magique",
|
||||
"t": "Firmin, biographie d'un grignoteur de livres",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Čapek, Karel",
|
||||
"C": 10,
|
||||
"c": "1018",
|
||||
"p": "uge",
|
||||
"t": "L'année du jardinier",
|
||||
"y": 2000
|
||||
},
|
||||
{
|
||||
"a": "Duval, Maëlig",
|
||||
"p": "griffes",
|
||||
"t": "L'après-dieux",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Larcenet, Manu",
|
||||
"C": 20,
|
||||
"p": "dargaud",
|
||||
"t": "L'armure du Jakolass",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Borges, Jorge Luis",
|
||||
"p": "gallimard",
|
||||
"c": "folio",
|
||||
"t": "Le livre de sable",
|
||||
"y": 1978
|
||||
},
|
||||
{
|
||||
"a": "Matheson, Richard",
|
||||
"s": "Médiathèque",
|
||||
"t": "Le jeune homme, la mort et le temps"
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry et Paul Kidby",
|
||||
"p": "atalante",
|
||||
"t": "Le dernier héros",
|
||||
"y": 2003
|
||||
},
|
||||
{
|
||||
"a": "Ecken, Claude",
|
||||
"p": "atalante",
|
||||
"t": "Au réveil il était midi",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Whale, Laurent",
|
||||
"p": "critic",
|
||||
"s": "David Bars",
|
||||
"t": "Les étoiles s'en balancent",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Andoryss et Tony Semedo",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"t": "Sept naufragés",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Geluck, Philippe",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"t": "La bible selon le chat",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Egan, Greg",
|
||||
"p": "ldp",
|
||||
"t": "Axiomatique",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Mathieu, Marc-Antoine",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"t": "3\"",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Barthes, Roland",
|
||||
"C": 10,
|
||||
"p": "points",
|
||||
"t": "Mythologies",
|
||||
"y": 1970
|
||||
},
|
||||
{
|
||||
"a": "Fazi, Mélanie",
|
||||
"p": "bragelonne",
|
||||
"t": "Serpentine",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Burroughs, William",
|
||||
"p": "tristram",
|
||||
"t": "Le porte-lame",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Genefort, Laurent",
|
||||
"p": "belial",
|
||||
"t": "Points chauds",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Čapek, Karel",
|
||||
"c": "minos",
|
||||
"p": "diff",
|
||||
"t": "R.U.R. Rossum's Universal Robots",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Puértolas, Romain",
|
||||
"p": "dilettante",
|
||||
"s": "Stéphane Coadou",
|
||||
"t": "L'extraordinaire voyage du fakir qui était resté coincé dans une armoire IKEA",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Davoust, Lionel",
|
||||
"p": "donquichotte",
|
||||
"t": "Léviathan. La chute",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Wilson, Robert Charles",
|
||||
"c": "folio",
|
||||
"p": "gallimard",
|
||||
"s": "Christophe Le Ven",
|
||||
"t": "À travers temps",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Ayroles, François",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"t": "Une affaire de caractères",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Millemann, Jean",
|
||||
"p": "adastra",
|
||||
"s": "David Bars",
|
||||
"t": "Sanshodo - La voie des trois vérités",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Davoust, Lionel",
|
||||
"p": "donquichotte",
|
||||
"t": "Léviathan. La nuit",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Le Rouge, Gustave",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Cinq nouvelles extraordinaires",
|
||||
"y": 2007
|
||||
}
|
||||
]
|
||||
259
gemini/lectures/2015.json
Normal file
259
gemini/lectures/2015.json
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
[
|
||||
{
|
||||
"a": "Allais, Alphonse",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "À se tordre"
|
||||
},
|
||||
{
|
||||
"a": "Grimm, Wilhelm",
|
||||
"n": "ePub",
|
||||
"p": "gutenberg",
|
||||
"t": "Contes choisis de la famille",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Davoust, Lionel",
|
||||
"p": "donquichotte",
|
||||
"t": "Léviathan. Le pouvoir",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Henry, Leo",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"t": "Le casse du continuum",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Strougatski, Arkadia et Boris",
|
||||
"c": "foliosf",
|
||||
"p": "gallimard",
|
||||
"t": "Stalker. Pique-nique au bord du chemin",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"p": "denoel",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les lutteurs immobiles",
|
||||
"y": 1997
|
||||
},
|
||||
{
|
||||
"a": "Matheson, Richard",
|
||||
"p": "flammarion",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Enfer sur mesure et autres nouvelles",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Zweig, Stefan",
|
||||
"p": "ldp",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "La confusion des sentiments",
|
||||
"y": 1991
|
||||
},
|
||||
{
|
||||
"a": "Conrad",
|
||||
"p": "flammarion",
|
||||
"t": "Au cœur des ténèbres",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"p": "vaunevargues",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "La nuit du venin",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Carrère, Emmanuel",
|
||||
"p": "pol",
|
||||
"s": "Livre à pattes du Carré Magique",
|
||||
"t": "Limonov",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Lermina, Jules",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Histoires incroyables",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Smolderen, Thierry et Alexandre Clérisse",
|
||||
"C": 20,
|
||||
"p": "dargaud",
|
||||
"t": "Souvenirs de l'empire de l'Atome",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Baranger, François",
|
||||
"p": "critic",
|
||||
"t": "Dominium Mundi",
|
||||
"v": 2,
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Gaarder, Jostein",
|
||||
"C": 10,
|
||||
"p": "points",
|
||||
"t": "Le monde de Sophie",
|
||||
"y": 1995
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "Carpe Jugulum",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Ligotti, Thomas",
|
||||
"p": "dystopia",
|
||||
"t": "Chants du cauchemar et de la nuit",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Fazi, Mélanie",
|
||||
"p": "bragelonne",
|
||||
"t": "Le jardin des silences",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Walton, Jo",
|
||||
"c": "lune",
|
||||
"p": "denoel",
|
||||
"t": "Le cercle de Farthing",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Borges, Jorge Luis",
|
||||
"c": "folio",
|
||||
"p": "gallimard",
|
||||
"t": "Le rapport de Brodie",
|
||||
"y": 1972
|
||||
},
|
||||
{
|
||||
"a": "Allais, Alphonse",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Deux et deux font cinq"
|
||||
},
|
||||
{
|
||||
"a": "Messac, Régis",
|
||||
"p": "arbrevengeur",
|
||||
"t": "Quinzinzinzili",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Morgan, Julien",
|
||||
"p": "critic",
|
||||
"t": "Breizh of the Dead",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Fakhouri, Anne et Xavier Dollo",
|
||||
"p": "critic",
|
||||
"t": "American Fays",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "vaunevargues",
|
||||
"t": "Les semeurs d'abîmes",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Wilde, Oscar",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "The Canterville Ghost"
|
||||
},
|
||||
{
|
||||
"a": "Lermina, Jules",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "L'effrayante aventure",
|
||||
"y": 2006
|
||||
},
|
||||
{
|
||||
"a": "Anderson, Poul",
|
||||
"p": "belial",
|
||||
"t": "Tau Zero",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Hanna, Herik et Eric Canete",
|
||||
"C": 20,
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "delcourt",
|
||||
"t": "Sept détectives",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Louis et Stéphane de Caneva",
|
||||
"C": 20,
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "delcourt",
|
||||
"t": "Sept clones",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Asimov, Isaac",
|
||||
"c": "lune",
|
||||
"p": "denoel",
|
||||
"t": "Quand les ténèbres viendront",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Padua, Sydney",
|
||||
"C": 20,
|
||||
"p": "pantheon",
|
||||
"t": "The thrilling adventures of Lovelace and Babbage",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Rosinski, Van Hamme",
|
||||
"C": 20,
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "casterman",
|
||||
"t": "Le grand pouvoir du Chninkel",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "casterman",
|
||||
"t": "Les cités obscures. Les murailles de Samaris",
|
||||
"y": 1988
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"s": "Médiathèque de Lannion",
|
||||
"p": "casterman",
|
||||
"t": "Les cités obscures. La fièvre d'Urbicande",
|
||||
"y": 1992
|
||||
},
|
||||
{
|
||||
"a": "Ponson du Terrail, Pierre",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "La femme immortelle"
|
||||
},
|
||||
{
|
||||
"a": "Allais, Alphonse",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "L'affaire Blaireau"
|
||||
},
|
||||
{
|
||||
"a": "Perrault, Charles",
|
||||
"n": "ePub",
|
||||
"p": "ilivri",
|
||||
"t": "Les contes de Perrault",
|
||||
"y": 2012
|
||||
}
|
||||
]
|
||||
388
gemini/lectures/2016.json
Normal file
388
gemini/lectures/2016.json
Normal file
|
|
@ -0,0 +1,388 @@
|
|||
[
|
||||
{
|
||||
"a": "Dumas, Alexandre",
|
||||
"n": "ePub",
|
||||
"p": "feedbooks",
|
||||
"t": "Le comte de Monte Cristo",
|
||||
"v": 4,
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Luz",
|
||||
"C": 20,
|
||||
"p": "hoebeke",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "J'aime pas la chanson française",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. La route d'Armilla",
|
||||
"y": 1988
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. Brüsel",
|
||||
"y": 1992
|
||||
},
|
||||
{
|
||||
"a": "Peeters, Benoît",
|
||||
"C": 10,
|
||||
"p": "franceloisirs",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Tintin et le monde d'Hergé",
|
||||
"y": 1988
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. La tour",
|
||||
"y": 1987
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. Le guide des cités",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. L'enfant penchée",
|
||||
"y": 1996
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. L'affaire Desombres",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Louvet-Barreau, Edwige",
|
||||
"p": "livrelibre",
|
||||
"t": "La légende de Scorfel",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. L'ombre d'un homme",
|
||||
"y": 1999
|
||||
},
|
||||
{
|
||||
"a": "Ayroles, Alain et Luigi Critone",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept missionaires",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Gabella, Mathieu et Patrick Tandiang",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept prisonniers",
|
||||
"y": 2009
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. La frontière invisible",
|
||||
"v": 2,
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les cités obscures. La théorie du grain de sable",
|
||||
"v": 2,
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Henry, Léo et Jacques Mucchielli",
|
||||
"p": "altiplano",
|
||||
"t": "Yama Loka Terminus. Dernières nouvelles de Yirminadingrad",
|
||||
"y": 2008
|
||||
},
|
||||
{
|
||||
"a": "Chauvel, David et Jérôme Lereculey",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept voleurs",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Nothomb, Amélie",
|
||||
"p": "ldp",
|
||||
"t": "Barbe rousse",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Lupano, Wilfrid et Roberto Ali",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept nains",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Brussolo, Serge",
|
||||
"p": "vaunevargues",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Danger, parking miné !",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Duval, Fred et Florent Calvez",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept personnages",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Convard, Didier et Jean-Christophe Camus et Hervé Boivin",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept frères",
|
||||
"y": 2016
|
||||
},
|
||||
{
|
||||
"a": "Tuttle, Lisa",
|
||||
"p": "dystopia",
|
||||
"t": "Ainsi naissent les fantômes",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Le Gouëfflec, Arnaud et Olivier Balez",
|
||||
"C": 20,
|
||||
"p": "glenat",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "J'aurai ta peau Dominique A",
|
||||
"y": 2016
|
||||
},
|
||||
{
|
||||
"a": "Kloetzer, L. L",
|
||||
"c": "lune",
|
||||
"p": "denoel",
|
||||
"t": "Anamnèse de Lady Star",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Viri-Babel Gérard",
|
||||
"C": 10,
|
||||
"p": "fluideglacial",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Gotlib et toutes ces sortes de choses",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Blengino, Luca et Denys",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept survivants",
|
||||
"y": 2011
|
||||
},
|
||||
{
|
||||
"a": "Ayala, Bastien et David Chauvel et Antonio Sarchione",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept pistoleros",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Guichen, Fred",
|
||||
"p": "clandestin",
|
||||
"t": "Pigeon, Canard et Patinette",
|
||||
"y": 2016
|
||||
},
|
||||
{
|
||||
"a": "Ayerdhal",
|
||||
"p": "vauvert",
|
||||
"t": "Transparences",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Lainé, Sylvie",
|
||||
"p": "actusf",
|
||||
"t": "Marouflages",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Camus, Albert",
|
||||
"p": "gallimard",
|
||||
"t": "La peste",
|
||||
"y": 1974
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "Le cinquième éléphant",
|
||||
"y": 2004
|
||||
},
|
||||
{
|
||||
"a": "Divers",
|
||||
"p": "luciferines",
|
||||
"t": "Nouvelles peaux",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Geluck, Philippe",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"t": "Le chat passe à table",
|
||||
"y": 2014
|
||||
},
|
||||
{
|
||||
"a": "Wintrebert, Joëlle",
|
||||
"p": "vauvert",
|
||||
"t": "Pollen",
|
||||
"y": 2002
|
||||
},
|
||||
{
|
||||
"a": "Kouprine, Alexandre",
|
||||
"p": "moutons",
|
||||
"t": "Le soleil liquide et autres récits fantastiques",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Dunyach, Jean-Claude",
|
||||
"p": "atalante",
|
||||
"t": "La station de l'Anelle",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Pratchett, Terry",
|
||||
"p": "atalante",
|
||||
"t": "La vérité",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Damasio, Alain",
|
||||
"p": "volte",
|
||||
"t": "Aucun souvenir assez solide",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Lehman, Serge et Emmanuel Roudier",
|
||||
"C": 20,
|
||||
"p": "delcourt",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept mages",
|
||||
"y": 2016
|
||||
},
|
||||
{
|
||||
"a": "Lob, Rochette et Legrand",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Tranceperceneige Intégrale",
|
||||
"y": 2013
|
||||
},
|
||||
{
|
||||
"a": "Rochette et Bocquet",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Tranceperceneige Terminus",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Vehlmann, Fabien et Sean Phillips",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Sept psychopathes",
|
||||
"y": 2007
|
||||
},
|
||||
{
|
||||
"a": "Cabu",
|
||||
"C": 20,
|
||||
"p": "echappes",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "La nouvelle France des beaufs",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Divers",
|
||||
"p": "griffes",
|
||||
"t": "Destination Univers",
|
||||
"y": 2012
|
||||
},
|
||||
{
|
||||
"a": "Schuiten, François et Benoît Peeters",
|
||||
"C": 20,
|
||||
"p": "casterman",
|
||||
"s": "Médiathèque de Lannion",
|
||||
"t": "Les portes du possible",
|
||||
"y": 2005
|
||||
},
|
||||
{
|
||||
"a": "Lehoucq, Roland",
|
||||
"C": 10,
|
||||
"n": "ePub",
|
||||
"p": "belial",
|
||||
"t": "Faire des sciences avec Star Wars",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Brisville, Jean-Claude",
|
||||
"C": 40,
|
||||
"n": "ePub",
|
||||
"p": "hatier",
|
||||
"s": "René Soulayrol",
|
||||
"t": "Le souper",
|
||||
"y": 2010
|
||||
},
|
||||
{
|
||||
"a": "Genefort, Laurent",
|
||||
"p": "belial",
|
||||
"t": "Lum'en",
|
||||
"y": 2015
|
||||
},
|
||||
{
|
||||
"a": "Bablet, Mathieu",
|
||||
"C": 20,
|
||||
"p": "ankama",
|
||||
"s": "Jérôme Soulayrol",
|
||||
"t": "Shangri-La",
|
||||
"y": 2016
|
||||
},
|
||||
{
|
||||
"a": "Gibson, William et Bruce Sterling",
|
||||
"p": "ldp",
|
||||
"t": "La machine à différences",
|
||||
"y": 1997
|
||||
},
|
||||
{
|
||||
"a": "Baxter, Stephen",
|
||||
"p": "ldp",
|
||||
"t": "Anti-Glace",
|
||||
"y": 2014
|
||||
}
|
||||
]
|
||||
247
gemini/lectures/publishers.json
Normal file
247
gemini/lectures/publishers.json
Normal file
|
|
@ -0,0 +1,247 @@
|
|||
{
|
||||
"actessud": {
|
||||
"c": "Arles",
|
||||
"n": "Actes Sud"
|
||||
},
|
||||
"actusf": {
|
||||
"c": "Chambéry",
|
||||
"n": "ActuSF"
|
||||
},
|
||||
"adalie": {
|
||||
"c": "Béziers",
|
||||
"n": "Éditions Adalie"
|
||||
},
|
||||
"adastra": {
|
||||
"c": "Laval",
|
||||
"n": "Ad Astra"
|
||||
},
|
||||
"altiplano": {
|
||||
"c": "Paris",
|
||||
"n": "L'Altiplano"
|
||||
},
|
||||
"ankama": {
|
||||
"c": "Roubaix",
|
||||
"n": "Ankama Éditions"
|
||||
},
|
||||
"arbrevengeur": {
|
||||
"c": "Talence",
|
||||
"n": "L'arbre Vengeur"
|
||||
},
|
||||
"atalante": {
|
||||
"c": "Nantes",
|
||||
"n": "L'Atalante"
|
||||
},
|
||||
"belial": {
|
||||
"c": "Saint-Mammès",
|
||||
"n": "Le Bélial'"
|
||||
},
|
||||
"bragelonne": {
|
||||
"c": "Paris",
|
||||
"n": "Bragelonne"
|
||||
},
|
||||
"casterman": {
|
||||
"c": "Bruxelles",
|
||||
"n": "Casterman"
|
||||
},
|
||||
"clandestin": {
|
||||
"c": "Congé-sur-Orne",
|
||||
"n": "Éditions le passager clandestin"
|
||||
},
|
||||
"cosmopole": {
|
||||
"c": "Paris",
|
||||
"n": "Cosmopole"
|
||||
},
|
||||
"critic": {
|
||||
"c": "Rennes",
|
||||
"n": "Critic"
|
||||
},
|
||||
"dargaud": {
|
||||
"c": "Paris",
|
||||
"n": "Dargaud"
|
||||
},
|
||||
"delcourt": {
|
||||
"c": "Paris",
|
||||
"n": "Delcourt"
|
||||
},
|
||||
"denoel": {
|
||||
"C": {
|
||||
"lune": "Lune d'Encre"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Éditions Denoël"
|
||||
},
|
||||
"diff": {
|
||||
"C": {
|
||||
"minos": "Minos"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Éditions de la différence"
|
||||
},
|
||||
"dilettante": {
|
||||
"c": "Paris",
|
||||
"n": "Le dilettante"
|
||||
},
|
||||
"donquichotte": {
|
||||
"c": "Paris",
|
||||
"n": "Don Quichotte"
|
||||
},
|
||||
"dupuis": {
|
||||
"c": "Charleroi",
|
||||
"n": "Dupuis"
|
||||
},
|
||||
"dystopia": {
|
||||
"c": "Évry",
|
||||
"n": "Dystopia Workshop"
|
||||
},
|
||||
"feedbooks": {
|
||||
"c": "s.l.",
|
||||
"n": "Feedbooks"
|
||||
},
|
||||
"echappes": {
|
||||
"c": "Paris",
|
||||
"n": "Éditions les Échappés"
|
||||
},
|
||||
"flammarion": {
|
||||
"c": "Paris",
|
||||
"n": "Flammarion"
|
||||
},
|
||||
"fleuve_noir": {
|
||||
"c": "Paris",
|
||||
"n": "Fleuve Noir"
|
||||
},
|
||||
"fluideglacial": {
|
||||
"c": "Paris",
|
||||
"n": "Fluide Glacial"
|
||||
},
|
||||
"franceloisirs": {
|
||||
"c": "Paris",
|
||||
"n": "France Loisirs"
|
||||
},
|
||||
"gallimard": {
|
||||
"C": {
|
||||
"folio": "Folio",
|
||||
"folioh": "Folio Histoire",
|
||||
"foliosf": "Folio SF",
|
||||
"quarto": "Quarto"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Gallimard"
|
||||
},
|
||||
"glenat": {
|
||||
"c": "Grenoble",
|
||||
"n": "Glénat"
|
||||
},
|
||||
"grasset": {
|
||||
"c": "Grenoble",
|
||||
"n": "Grasset"
|
||||
},
|
||||
"griffes": {
|
||||
"c": "Bréchamps",
|
||||
"n": "Griffe d'Encre"
|
||||
},
|
||||
"gutenberg": {
|
||||
"c": "s.l.",
|
||||
"n": "Projet Gutenberg"
|
||||
},
|
||||
"hatier": {
|
||||
"c": "Paris",
|
||||
"n": "Hatier"
|
||||
},
|
||||
"hoebeke": {
|
||||
"c": "Paris",
|
||||
"n": "Hoëbeke"
|
||||
},
|
||||
"ilivri": {
|
||||
"c": "s.l.",
|
||||
"n": "Ilivri"
|
||||
},
|
||||
"jai_lu": {
|
||||
"c": "Paris",
|
||||
"n": "J'ai lu"
|
||||
},
|
||||
"ldp": {
|
||||
"c": "Paris",
|
||||
"n": "Le Livre de Poche"
|
||||
},
|
||||
"livrelibre": {
|
||||
"c": "Bury",
|
||||
"n": "L'ivre Libre"
|
||||
},
|
||||
"luciferines": {
|
||||
"c": "Lyon",
|
||||
"n": "Éditions Luciférines"
|
||||
},
|
||||
"minuit": {
|
||||
"C": {
|
||||
"paradoxe": "Paradoxe"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Les Éditions de Minuit"
|
||||
},
|
||||
"moutons": {
|
||||
"c": "Montélimar",
|
||||
"n": "Les moutons électriques"
|
||||
},
|
||||
"omnibus": {
|
||||
"c": "Paris",
|
||||
"n": "Omnibus"
|
||||
},
|
||||
"pantheon": {
|
||||
"c": "New York",
|
||||
"n": "Pantheon Books"
|
||||
},
|
||||
"plon": {
|
||||
"C": {
|
||||
"terre": "Terre Humaine"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Plon"
|
||||
},
|
||||
"pocket": {
|
||||
"c": "Paris",
|
||||
"n": "Pocket"
|
||||
},
|
||||
"points": {
|
||||
"c": "Paris",
|
||||
"n": "Points"
|
||||
},
|
||||
"pol": {
|
||||
"c": "Paris",
|
||||
"n": "P.O.L."
|
||||
},
|
||||
"presses_de_la_cite": {
|
||||
"c": "Paris",
|
||||
"n": "Presses de la Cité"
|
||||
},
|
||||
"raisons_dagir": {
|
||||
"c": "Paris",
|
||||
"n": "Raisons d'agir"
|
||||
},
|
||||
"tristram": {
|
||||
"c": "Auch",
|
||||
"n": "Tristram"
|
||||
},
|
||||
"uge": {
|
||||
"C": {
|
||||
"1018": "10/18"
|
||||
},
|
||||
"c": "Paris",
|
||||
"n": "Union Générale d'Éditions"
|
||||
},
|
||||
"vagabondages": {
|
||||
"c": "Ryes",
|
||||
"n": "Éditions Vagabondages"
|
||||
},
|
||||
"vaunevargues": {
|
||||
"c": "Paris",
|
||||
"n": "Vaunevargues"
|
||||
},
|
||||
"vauvert": {
|
||||
"c": "Vauvert",
|
||||
"n": "Au diable vauvert"
|
||||
},
|
||||
"volte": {
|
||||
"c": "Clamart",
|
||||
"n": "La Volte"
|
||||
}
|
||||
}
|
||||
134
scripts/metalsmith-gemini-comments.js
Normal file
134
scripts/metalsmith-gemini-comments.js
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
const debug = require('debug')('metalsmith-gemini:comments')
|
||||
const moment = require('moment')
|
||||
|
||||
module.exports = plugins
|
||||
|
||||
/**
|
||||
* Metalsmith plugins collection to handle comments.
|
||||
*
|
||||
* @return {Function}
|
||||
*/
|
||||
function plugins (helpers) {
|
||||
function store (collection, key, value) {
|
||||
if (collection[key] === undefined) { collection[key] = [] }
|
||||
collection[key].push(value)
|
||||
}
|
||||
|
||||
function sortedComments (metalsmith, index) {
|
||||
const sortedComments = {}
|
||||
|
||||
metalsmith.metadata().comments.forEach(entry => {
|
||||
if (index instanceof Function) {
|
||||
store(sortedComments, index(entry.comment), entry)
|
||||
} else {
|
||||
store(sortedComments, entry.comment[index], entry)
|
||||
}
|
||||
})
|
||||
|
||||
return sortedComments
|
||||
}
|
||||
|
||||
function createCommentsIndex (index, entries) {
|
||||
let body = '# ' + index + '\n\n'
|
||||
|
||||
entries.forEach(entry => {
|
||||
body += '=> /' + entry.filename + ' ' + entry.book.title + ', ' + entry.book.author
|
||||
|
||||
if (index === entry.comment.medium) {
|
||||
body += ' (' + entry.comment.date.year() + ')\n'
|
||||
} else {
|
||||
body += ' (sur ' + entry.comment.medium + ')\n'
|
||||
body += entry.comment.excerpt
|
||||
}
|
||||
})
|
||||
|
||||
body += '\n=> /chroniques Retour à la liste complète\n'
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
return {
|
||||
buildMetadata: function (files, metalsmith, done) {
|
||||
const EXCERPT_MAX_LENGTH = 300
|
||||
|
||||
const comments = []
|
||||
|
||||
// TODO: The excerpt should take care of words boundaries
|
||||
const buildExcerpt = function (contents) {
|
||||
let length = contents.indexOf('\n')
|
||||
|
||||
if (length === -1) {
|
||||
length = contents.length
|
||||
}
|
||||
|
||||
let excerpt = contents.substr(0, Math.min(length, EXCERPT_MAX_LENGTH))
|
||||
if (length > EXCERPT_MAX_LENGTH) {
|
||||
excerpt += '…'
|
||||
}
|
||||
|
||||
return excerpt + '\n'
|
||||
}
|
||||
|
||||
Object.keys(files).forEach(filename => {
|
||||
if (helpers.isGemText(filename)) {
|
||||
const data = files[filename]
|
||||
|
||||
if (data.comment !== undefined) {
|
||||
data.comment.date = moment(data.comment.date)
|
||||
data.comment.excerpt = buildExcerpt(data.contents.toString())
|
||||
data.comment.size = data.contents.length
|
||||
data.layout = 'gemini-comment.njk'
|
||||
|
||||
comments.push({
|
||||
book: data.book,
|
||||
comment: data.comment,
|
||||
filename
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
debug('Identified %d comments', comments.length)
|
||||
|
||||
/* Comment are ordered by title by default. */
|
||||
comments.sort((a, b) => a.book.title.localeCompare(b.book.title))
|
||||
metalsmith.metadata().comments = comments
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
rootIndex: function (files, metalsmith, done) {
|
||||
let body = '# Chroniques\n'
|
||||
|
||||
body += '\n## Par support\n\n'
|
||||
Object.keys(sortedComments(metalsmith, 'medium')).forEach((medium) => {
|
||||
body += '=> ' + helpers.filepath(medium, ['/chroniques']) + ' ' + medium + '\n'
|
||||
})
|
||||
|
||||
body += '\n## Par année\n\n'
|
||||
Object.keys(sortedComments(metalsmith, (c) => c.date.year())).forEach((year) => {
|
||||
body += '=> /chroniques/' + year + ' ' + year + '\n'
|
||||
})
|
||||
|
||||
helpers.createFile(files, 'chroniques/index.gemini', body)
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
mediaIndexes: function (files, metalsmith, done) {
|
||||
Object.entries(sortedComments(metalsmith, 'medium')).forEach(([medium, comments]) => {
|
||||
helpers.createFile(files, helpers.filepath(medium, ['chroniques']), createCommentsIndex(medium, comments))
|
||||
})
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
yearIndexes: function (files, metalsmith, done) {
|
||||
Object.entries(sortedComments(metalsmith, (c) => c.date.year())).forEach(([year, comments]) => {
|
||||
helpers.createFile(files, helpers.filepath('index', ['chroniques', year]), createCommentsIndex(year, comments))
|
||||
})
|
||||
|
||||
done()
|
||||
}
|
||||
}
|
||||
}
|
||||
246
scripts/metalsmith-gemini-readings.js
Normal file
246
scripts/metalsmith-gemini-readings.js
Normal file
|
|
@ -0,0 +1,246 @@
|
|||
const debug = require('debug')('metalsmith-gemini:readings')
|
||||
const path = require('path')
|
||||
|
||||
module.exports = plugins
|
||||
|
||||
/**
|
||||
* Metalsmith plugins collection to handle readings.
|
||||
*
|
||||
* @return {Function}
|
||||
*/
|
||||
function plugins (helpers) {
|
||||
const Categories = Object.freeze({
|
||||
0: 'Fictions',
|
||||
10: 'Essais',
|
||||
20: 'BD',
|
||||
30: 'Poésie',
|
||||
40: 'Théâtre'
|
||||
})
|
||||
|
||||
function getBibAuthors (book) {
|
||||
// TODO: books should have list of authors
|
||||
const authors = book.a
|
||||
|
||||
return authors
|
||||
}
|
||||
|
||||
function getBibPublishing (book, publishers) {
|
||||
const p = publishers[book.p]
|
||||
let published
|
||||
|
||||
if (p != null) {
|
||||
published = p.c + ' : ' + p.n
|
||||
if (book.c != null) {
|
||||
published += ' (' + p.C[book.c] + ')'
|
||||
}
|
||||
published += ', ' + (book.y || '?')
|
||||
} else {
|
||||
published = '?'
|
||||
if (p !== undefined) {
|
||||
console.warn('Unknown publisher "' + book.p + '"')
|
||||
}
|
||||
}
|
||||
|
||||
return published
|
||||
}
|
||||
|
||||
function getBibTitle (book) {
|
||||
let title = book.t
|
||||
if (!'.!?'.includes(title.charAt(title.length - 1))) {
|
||||
title += '.'
|
||||
}
|
||||
if (book.v != null) {
|
||||
title += ' ' + book.v + ' vols.'
|
||||
}
|
||||
|
||||
return title
|
||||
}
|
||||
|
||||
function writeLine (book, publishers) {
|
||||
return '* ' + getBibAuthors(book) + '. ' + getBibTitle(book) + ' ' + getBibPublishing(book, publishers) + '\n'
|
||||
}
|
||||
|
||||
function createIndex (year, books, publishers) {
|
||||
const sections = {}
|
||||
let body = '# ' + year + '\n\n'
|
||||
|
||||
Object.keys(Categories).forEach((key) => { sections[key] = '' })
|
||||
|
||||
books.forEach(b => {
|
||||
const line = writeLine(b, publishers)
|
||||
if (line.length > 0) {
|
||||
sections[b.C || 0] += line
|
||||
}
|
||||
})
|
||||
|
||||
Object.entries(Categories).forEach(([key, title]) => {
|
||||
const section = sections[key]
|
||||
|
||||
if (section.length !== 0) {
|
||||
body += '## ' + title + '\n\n'
|
||||
body += section + '\n'
|
||||
}
|
||||
})
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
function getBy (books, key) {
|
||||
const map = {}
|
||||
|
||||
books.forEach(book => {
|
||||
if (map[book[key]] == null) {
|
||||
map[book[key]] = []
|
||||
}
|
||||
map[book[key]].push(book)
|
||||
})
|
||||
|
||||
return map
|
||||
}
|
||||
|
||||
function getByPublisher (books) {
|
||||
return getBy(books, 'p')
|
||||
}
|
||||
|
||||
function getByYear (books) {
|
||||
return getBy(books, 'Y')
|
||||
}
|
||||
|
||||
function isJson (filename) {
|
||||
return /\.json$/.test(path.extname(filename))
|
||||
}
|
||||
|
||||
return {
|
||||
buildMetadata: function (files, metalsmith, done) {
|
||||
const books = []
|
||||
let publishers = {}
|
||||
|
||||
Object.keys(files).forEach(filename => {
|
||||
if (isJson(filename)) {
|
||||
if (filename.endsWith('publishers.json')) {
|
||||
publishers = JSON.parse(files[filename].contents)
|
||||
debug('Identified %d publishers', Object.keys(publishers).length)
|
||||
} else {
|
||||
const year = path.basename(filename, '.json')
|
||||
JSON.parse(files[filename].contents).forEach(b => {
|
||||
b.Y = year
|
||||
books.push(b)
|
||||
})
|
||||
}
|
||||
delete files[filename]
|
||||
}
|
||||
})
|
||||
|
||||
debug('Identified %d books', books.length)
|
||||
|
||||
metalsmith.metadata().books = books
|
||||
metalsmith.metadata().publishers = publishers
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
authorsIndex: function (files, metalsmith, done) {
|
||||
const authors = {}
|
||||
const publishers = metalsmith.metadata().publishers
|
||||
let body = '# Auteurs\n'
|
||||
|
||||
metalsmith.metadata().books.forEach(book => {
|
||||
if (authors[book.a] == null) {
|
||||
authors[book.a] = []
|
||||
}
|
||||
authors[book.a].push(book)
|
||||
})
|
||||
|
||||
Object.keys(authors).sort().forEach(author => {
|
||||
const lines = []
|
||||
authors[author].sort().forEach(book => {
|
||||
lines.push('* ' + getBibTitle(book) + ' ' + getBibPublishing(book, publishers) + '\n')
|
||||
})
|
||||
body += '\n## ' + author + '\n' + lines.sort().join('')
|
||||
})
|
||||
|
||||
helpers.createFile(files, helpers.filepath('auteurs', ['lectures']), body)
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
publishersIndex: function (files, metalsmith, done) {
|
||||
const publishers = metalsmith.metadata().publishers
|
||||
let body = '# Éditions\n'
|
||||
|
||||
Object.entries(getByPublisher(metalsmith.metadata().books)).forEach(([pub, books]) => {
|
||||
const p = publishers[pub]
|
||||
|
||||
// TODO: Extract collections in a set
|
||||
if (p != null) {
|
||||
// let collections = {}
|
||||
const lines = []
|
||||
|
||||
books.forEach(book => {
|
||||
lines.push('* ' + getBibAuthors(book) + '. ' + getBibTitle(book) + '\n')
|
||||
})
|
||||
body += '\n## ' + p.n + '\n' + lines.sort().join('')
|
||||
}
|
||||
})
|
||||
|
||||
helpers.createFile(files, helpers.filepath('editeurs', ['lectures']), body)
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
rootIndex: function (files, metalsmith, done) {
|
||||
let body = '# Lectures\n\n'
|
||||
|
||||
body += '=> auteurs.gemini La liste alphabétique des auteurs lus\n'
|
||||
body += '=> editeurs.gemini La liste alphabétique des éditeurs rencontrés\n'
|
||||
body += '=> stats.gemini Quelques statistiques\n\n'
|
||||
|
||||
body += '## Par année\n\n'
|
||||
Object.keys(getByYear(metalsmith.metadata().books)).forEach(year => {
|
||||
body += '=> /lectures/' + year + '.gemini ' + year + '\n'
|
||||
})
|
||||
|
||||
helpers.createFile(files, helpers.filepath('index', ['lectures']), body)
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
statisticsIndex: function (files, metalsmith, done) {
|
||||
const stats = { a: new Set(), y: {} }
|
||||
const books = metalsmith.metadata().books
|
||||
let body = '# Quelques statistiques\n\n'
|
||||
|
||||
books.forEach(book => {
|
||||
stats.a.add(book.a)
|
||||
if (stats.y[book.Y] == null) {
|
||||
stats.y[book.Y] = []
|
||||
}
|
||||
stats.y[book.Y].push(book)
|
||||
})
|
||||
|
||||
body += 'Depuis le printemps 2010, ce sont ' + books.length + ' lectures recensées.\n'
|
||||
body += 'Ces lectures couvrent ' + stats.a.size + ' auteurs différents.\n'
|
||||
|
||||
body += '## Par année\n'
|
||||
Object.entries(stats.y).forEach(([year, books]) => {
|
||||
body += '* ' + year + ': ' + books.length + ' livres\n'
|
||||
})
|
||||
|
||||
helpers.createFile(files, helpers.filepath('stats', ['lectures']), body)
|
||||
|
||||
done()
|
||||
},
|
||||
|
||||
yearIndexes: function (files, metalsmith, done) {
|
||||
const publishers = metalsmith.metadata().publishers
|
||||
|
||||
Object.entries(getByYear(metalsmith.metadata().books)).forEach(([year, books]) => {
|
||||
// Sort by category and then by authors
|
||||
const content = createIndex(year, books, publishers)
|
||||
helpers.createFile(files, helpers.filepath(year, ['lectures']), content)
|
||||
})
|
||||
|
||||
done()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
const comments = require('./metalsmith-gemini-comments.js')
|
||||
const config = require('./config.js')
|
||||
const debug = require('debug')('gemini')
|
||||
const Metalsmith = require('metalsmith')
|
||||
const layouts = require('@metalsmith/layouts')
|
||||
const moment = require('moment')
|
||||
const path = require('path')
|
||||
const readings = require('./metalsmith-gemini-readings.js')
|
||||
const slug = require('slug')
|
||||
const statistics = require('./metalsmith-statistics-plugin')
|
||||
|
||||
|
|
@ -11,144 +12,33 @@ const __PROD__ = process.env.NODE_ENV === 'production'
|
|||
|
||||
moment.locale('fr')
|
||||
|
||||
function store (collection, key, value) {
|
||||
if (collection[key] === undefined) { collection[key] = [] }
|
||||
collection[key].push(value)
|
||||
}
|
||||
|
||||
function isGemText (filename) {
|
||||
return /\.gmi$|\.gemini$/.test(path.extname(filename))
|
||||
}
|
||||
|
||||
function filepath (filename, segments) {
|
||||
const name = slug(filename, { mode: 'rfc3986' }) + '.gemini'
|
||||
return path.join.apply(null, (segments || ['./']).concat([name]))
|
||||
}
|
||||
|
||||
function sortedComments (metalsmith, index) {
|
||||
const sortedComments = {}
|
||||
const helpers = {
|
||||
createFile: function (files, filename, body) {
|
||||
const entry = Object.assign({
|
||||
contents: Buffer.from(body)
|
||||
})
|
||||
|
||||
metalsmith.metadata().comments.forEach(entry => {
|
||||
if (index instanceof Function) {
|
||||
store(sortedComments, index(entry.comment), entry)
|
||||
} else {
|
||||
store(sortedComments, entry.comment[index], entry)
|
||||
}
|
||||
})
|
||||
files[filename] = entry
|
||||
},
|
||||
|
||||
return sortedComments
|
||||
}
|
||||
filepath: function (filename, segments) {
|
||||
const name = slug(filename, { mode: 'rfc3986' }) + '.gemini'
|
||||
return path.join.apply(null, (segments || ['./']).concat([name]))
|
||||
},
|
||||
|
||||
function createIndex (files, filename, body) {
|
||||
const entry = Object.assign({
|
||||
contents: Buffer.from(body)
|
||||
})
|
||||
|
||||
files[filename] = entry
|
||||
}
|
||||
|
||||
function createCommentsIndex (index, entries) {
|
||||
let body = '# ' + index + '\n\n'
|
||||
|
||||
entries.forEach(entry => {
|
||||
body += '=> /' + entry.filename + ' ' + entry.book.title + ', ' + entry.book.author
|
||||
|
||||
if (index === entry.comment.medium) {
|
||||
body += ' (' + entry.comment.date.year() + ')\n'
|
||||
} else {
|
||||
body += ' (sur ' + entry.comment.medium + ')\n'
|
||||
body += entry.comment.excerpt
|
||||
}
|
||||
})
|
||||
|
||||
body += '\n=> /chroniques Retour à la liste complète\n'
|
||||
|
||||
return body
|
||||
}
|
||||
|
||||
function rootIndexPlugin (files, metalsmith, done) {
|
||||
let body = '# Chroniques\n'
|
||||
|
||||
body += '\n## Par support\n\n'
|
||||
Object.keys(sortedComments(metalsmith, 'medium')).forEach((medium) => {
|
||||
body += '=> ' + filepath(medium, ['/chroniques']) + ' ' + medium + '\n'
|
||||
})
|
||||
|
||||
body += '\n## Par année\n\n'
|
||||
Object.keys(sortedComments(metalsmith, (c) => c.date.year())).forEach((year) => {
|
||||
body += '=> /chroniques/' + year + ' ' + year + '\n'
|
||||
})
|
||||
|
||||
createIndex(files, 'chroniques/index.gemini', body)
|
||||
|
||||
done()
|
||||
}
|
||||
|
||||
function mediaIndexPlugin (files, metalsmith, done) {
|
||||
Object.entries(sortedComments(metalsmith, 'medium')).forEach(([medium, comments]) => {
|
||||
createIndex(files, filepath(medium, ['chroniques']), createCommentsIndex(medium, comments))
|
||||
})
|
||||
|
||||
done()
|
||||
}
|
||||
|
||||
function yearsIndexPlugin (files, metalsmith, done) {
|
||||
Object.entries(sortedComments(metalsmith, (c) => c.date.year())).forEach(([year, comments]) => {
|
||||
createIndex(files, filepath('index', ['chroniques', year]), createCommentsIndex(year, comments))
|
||||
})
|
||||
|
||||
done()
|
||||
}
|
||||
|
||||
function buildCommentsMetadata (files, metalsmith, done) {
|
||||
const EXCERPT_MAX_LENGTH = 300
|
||||
|
||||
const comments = []
|
||||
|
||||
// TODO: The excerpt should take care of words boundaries
|
||||
const buildExcerpt = function (contents) {
|
||||
let length = contents.indexOf('\n')
|
||||
|
||||
if (length === -1) {
|
||||
length = contents.length
|
||||
}
|
||||
|
||||
let excerpt = contents.substr(0, Math.min(length, EXCERPT_MAX_LENGTH))
|
||||
if (length > EXCERPT_MAX_LENGTH) {
|
||||
excerpt += '…'
|
||||
}
|
||||
|
||||
return excerpt + '\n'
|
||||
isGemText: function (filename) {
|
||||
return /\.gmi$|\.gemini$/.test(path.extname(filename))
|
||||
}
|
||||
|
||||
Object.keys(files).forEach(filename => {
|
||||
if (isGemText(filename)) {
|
||||
const data = files[filename]
|
||||
|
||||
if (data.comment !== undefined) {
|
||||
data.comment.date = moment(data.comment.date)
|
||||
data.comment.excerpt = buildExcerpt(data.contents.toString())
|
||||
data.comment.size = data.contents.length
|
||||
data.layout = 'gemini-comment.njk'
|
||||
|
||||
comments.push({
|
||||
book: data.book,
|
||||
comment: data.comment,
|
||||
filename
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
debug('Identified %d comments: %s', comments.length)
|
||||
|
||||
/* Comment are ordered by title by default. */
|
||||
comments.sort((a, b) => a.book.title.localeCompare(b.book.title))
|
||||
metalsmith.metadata().comments = comments
|
||||
|
||||
done()
|
||||
}
|
||||
|
||||
const commentsGenerator = comments(helpers)
|
||||
const readingsGenerator = readings(helpers)
|
||||
|
||||
module.exports = new Metalsmith(config.paths.projectRoot)
|
||||
.clean(__PROD__)
|
||||
.metadata({
|
||||
|
|
@ -156,11 +46,17 @@ module.exports = new Metalsmith(config.paths.projectRoot)
|
|||
})
|
||||
.source(config.paths.geminiSource)
|
||||
.destination(config.paths.geminiDestination)
|
||||
.use(buildCommentsMetadata)
|
||||
.use(rootIndexPlugin)
|
||||
.use(mediaIndexPlugin)
|
||||
.use(yearsIndexPlugin)
|
||||
.use(commentsGenerator.buildMetadata)
|
||||
.use(commentsGenerator.rootIndex)
|
||||
.use(commentsGenerator.mediaIndexes)
|
||||
.use(commentsGenerator.yearIndexes)
|
||||
// TODO: atom.xml (et lien depuis l'index)
|
||||
.use(readingsGenerator.buildMetadata)
|
||||
.use(readingsGenerator.authorsIndex)
|
||||
.use(readingsGenerator.publishersIndex)
|
||||
.use(readingsGenerator.rootIndex)
|
||||
.use(readingsGenerator.statisticsIndex)
|
||||
.use(readingsGenerator.yearIndexes)
|
||||
.use(layouts({
|
||||
default: 'gemini.njk',
|
||||
pattern: '**/*.gemini',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue