Proper initial setup, with basic quiz

This commit is contained in:
echarp 2022-10-26 23:12:29 +02:00
parent 8db61f8e8c
commit 246782fb82
94 changed files with 2387 additions and 538 deletions

3
.gitignore vendored
View File

@ -1 +1,4 @@
.hugo_build.lock
public
resources
.vscode

2
.gitmodules vendored
View File

@ -1,3 +1,3 @@
[submodule "themes/gohugo-theme-ananke"]
path = themes/gohugo-theme-ananke
path = themes/ananke
url = https://github.com/budparr/gohugo-theme-ananke.git

View File

@ -1,6 +0,0 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

11
bin/_commands/_extract.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
IFS='
'
extract() {
dir=$1 file=$2 key=$3
grep -A 100 "^$key:$" "$dir/$file" | grep -B 100 -m 2 "^\([^\-]\|\-\-\-\)" | grep "^\- " | sed 's/^- *//g'
}

50
bin/_commands/choice.sh Executable file
View File

@ -0,0 +1,50 @@
#!/bin/sh
. ./_commands/_extract.sh
dir=$1 file=$2
page=${file%.choice}
values=$(extract "$dir" "$page.md" ac_choices)
choose() {
dir=$1 file=$2 target=$3
user=${dir#*/users/}
user=${user%%/*}
target=${target#*(}
target=${target%)*}
echo "Choice => $target.md for user $user"
echo cp "../content$target.md" "../content/users/$user${target%/*}/"
cp "../content$target.md" "../content/users/$user${target%/*}/"
# Delete former result files
rm "$dir/*.result"
# Generate a result file
echo "$target" > "$dir/$page.result"
}
index=0
target=$(cat "$dir/$file")
for value in $values
do
if [ $index = "${target#ac_choice=}" ]
then
choose "$dir" "$file" "$value"
break
fi
index=$((index+1))
done
if [ -z "${dir##*/content/users/*}" ]
then
# Remove the originating file
rm "$dir/$page.md"
# And destination directory
rm -rf "${dir%/content/*}/public/${dir#*/content/}/$page/"
fi

38
bin/_commands/choice_test.bats Executable file
View File

@ -0,0 +1,38 @@
#!/usr/bin/env bats
setup() {
mkdir -p content/users/test
}
@test "Basic choice" {
echo "---
title: Basic test
---
" > content/test.md
echo "---
title: Basic choice test
ac_choices:
- \"[abc](/home)\"
- \"[def](/test)\"
- \"[ghi](/home)\"
---
" > content/users/test/choice_test.md
echo "ac_choice=1" > content/users/test/choice_test.choice
[ -e content/users/test/choice_test.md ]
[ -e content/users/test/choice_test.choice ]
bin/ac_route.sh "$(pwd)/content/users/test" choice_test.choice
[ ! -e content/users/test/choice_test.md ]
[ ! -e content/users/test/choice_test.choice ]
[ -e content/users/test/choice_test.result ]
[ -e content/users/test/test.md ]
}
teardown() {
rm -f content/test.md
rm -rf content/users
}

19
bin/_commands/content.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
. ./_commands/_extract.sh
dir=$1 file=$2
page=${file%.content}
echo
echo "= $dir/$page.md"
echo "Changing content"
line_number=$(sed -n "/---/=" "$dir/$page.md" | tail -1)
headers=$(sed -n "1,$line_number p" "$dir/$page.md")
content=$(cat "$dir/$file")
printf "%s\n%s" "$headers" "$content" > "$dir/$page.md"

30
bin/_commands/content_test.bats Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env bats
setup() {
mkdir -p content/users/test
}
@test "Changing content" {
echo "---
title: Simple ac_choice edition test
---
hello world
" > content/users/test/content_test.md
# Necessary for the test setup, but not required in prod
echo "new content
On multiple lines" > content/users/test/content_test.content
bin/ac_route.sh "$(pwd)/content/users/test" content_test.content
[ -e content/users/test/content_test.md ]
cat content/users/test/content_test.md
grep -o "new content" content/users/test/content_test.md
grep -o "On multiple lines" content/users/test/content_test.md
grep -v "^hello world" content/users/test/content_test.md
}
teardown() {
rm -rf content/users
}

14
bin/_commands/create.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
dir=$1 file=$2
page=${file%.create}
kind=$(cat "$dir/$file")
echo "Creating content/$kind/$page"
hugo --source=.. new "content/$kind/$page"
# Important to automated tests
chmod g+w "../content/$kind/$page"

View File

@ -0,0 +1,40 @@
#!/usr/bin/env bats
setup() {
mkdir -p content/users/create_test
}
@test "Create user" {
echo "users" > content/users/create_test.create
[ -e content/users/create_test.create ]
bin/ac_route.sh "$(pwd)/content/users" create_test.create
[ ! -e content/users/create_test.create ]
[ -e content/users/create_test/_index.md ]
}
@test "Update property" {
echo "title: Simple edit" > content/users/create_test/_index.prop
bin/ac_route.sh "$(pwd)/content/users/create_test" _index.prop
grep -o "^title: Simple edit" content/users/create_test/_index.md
}
@test "Delete user" {
echo "hop" > content/users/create_test.delete
[ -e content/users/create_test.delete ]
bin/ac_route.sh "$(pwd)/content/users" create_test.delete
[ ! -e content/users/create_test.delete ]
[ ! -e content/users/create_test/_index.md ]
[ ! -e content/users/create_test ]
}
teardown() {
rm -rf content/users
}

View File

@ -0,0 +1,34 @@
#!/bin/sh
# shellcheck source=./bin/_commands/_extract.sh
. ./_commands/_extract.sh
dir=$1 file=$2
echo "Default actions for $dir/$file"
create() {
values=$(extract "$dir" "$file" ac_create)
for value in $values
do
echo "Creating $value"
cp "../content/$value.md" "$dir/$value.md"
done
}
delete() {
values=$(extract "$dir" "$file" ac_delete)
for value in $values
do
echo "Deleting $value"
rm -f "$dir/$value.md"
done
}
if [ -z "${dir##*/content/users/*}" ]
then
create
delete
fi

View File

@ -0,0 +1,75 @@
#!/usr/bin/env bats
setup() {
mkdir -p content/pages/test
mkdir -p content/users/test
}
@test "Simple publication" {
echo "---
title: Simple link test
---
" > content/simple_link_test.md
cp content/simple_link_test.md content/users/test/
bin/ac_route.sh "$(pwd)/content" simple_link_test.md
[ -e content/users/test/simple_link_test.md ]
}
@test "Create file" {
echo "---
title: Test file to be create
---
" > content/to_create.md
echo "---
title: Create test
ac_create:
- to_create
---
" > content/to_create_test.md
cp content/to_create_test.md content/users/test/
bin/ac_route.sh "$(pwd)/content/users/test" to_create_test.md
[ -e content/users/test/to_create.md ]
}
@test "Delete file" {
echo "---
title: Delete test
---
" > content/test.md
cp content/test.md content/users/test/test.md
echo "---
title: Delete test
ac_delete:
- to_delete
---
" > content/to_delete_test.md
cp content/to_delete_test.md content/users/test/
[ -e content/users/test/to_delete_test.md ]
bin/ac_route.sh "$(pwd)/content/users/test" to_delete_test.md
[ -e content/users/test/to_delete_test.md ]
[ ! -e content/users/test/to_delete.md ]
}
teardown() {
rm -f content/test.md
rm -rf content/pages/test
rm -rf content/users
rm -f content/simple_link_test.md
rm -f content/to_create_test.md
rm -f content/to_delete_test.md
rm -f content/to_create.md
rm -f content/to_delete.md
}

9
bin/_commands/delete.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
dir=$1 file=$2
page=${file%.delete}
echo "Deleting $page"
rm -rf "${dir:?}/${page:?}"

95
bin/_commands/prop.sh Executable file
View File

@ -0,0 +1,95 @@
#!/bin/sh
. ./_commands/_extract.sh
dir=$1 file=$2
content=$(cat "$dir/$file")
page=${file%.prop}
echo
echo "= $dir/$page.md"
if [ ! -e "$dir/$page.md" ]
then
echo "Create file"
echo "---
---
" > "$dir/$page.md"
fi
property="${content%: *}"
line_number=$(grep -n "$property:" "$dir/$page.md")
line_number="${line_number%%:*}"
case $property in
*\[*\]*)
line_offset=${property##*[}
line_offset=${line_offset%%]*}
property=${property%%[*}
content="- ${content##*: }"
line_number=$(grep -n "$property:" "$dir/$page.md")
line_number="${line_number%%:*}"
line_number=$((line_number+line_offset+1))
# echo "line_offset: $line_offset"
esac
# echo "line_number: $line_number"
case $line_number in
*[0-9]*)
line=$(sed "$line_number!d" "$dir/$page.md")
# echo "<= $line"
esac
# echo "=> $content"
if [ "$content" = "$property: " ] || [ "$content" = "- " ]
then
echo "Delete property '$property'"
operation=d
content=
elif [ "$line" != "" ] && [ "${line%- *}" = "" ]
then
echo "Updating nth element of property '$property'"
operation=c
elif [ "$line_number" != "" ] && [ "${content%- *}" = "" ]
then
if grep -q "^$property:" "$dir/$page.md"
then
echo "Insert nth element of property '$property'"
else
echo "Creating property $property"
line_number=$(sed -n "/---/=" "$dir/$page.md" | tail -1)
content="$property:\n$content"
fi
echo "=> $content"
operation=i
elif grep -q "^$property: " "$dir/$page.md"
then
echo "Updating property '$property'"
operation=c
else
echo "Create property '$property'"
line_number=$(sed -n "/---/=" "$dir/$page.md" | tail -1)
operation=i
fi
# See https://www.thegeekstuff.com/2009/11/unix-sed-tutorial-append-insert-replace-and-count-file-lines/
sed -i "$line_number $operation $content" "$dir/$page.md"
if [ "$property" = "title" ]
then
echo "Reindexing pages"
grep --include=*.md -or "title: .*" ../content/ | grep -v "pages.txt" | grep -v "users/" |
grep -v "_index.md" | grep -o "content/.*" | grep -o "/.*" > ../content/pages.txt
fi

131
bin/_commands/prop_test.bats Executable file
View File

@ -0,0 +1,131 @@
#!/usr/bin/env bats
setup() {
mkdir -p content/users/test
}
@test "Create property" {
echo "title: Simple create test" > content/users/test/create_prop_test.prop
! grep -o "^title: Simple create test" content/users/test/create_prop_test.md
bin/ac_route.sh "$(pwd)/content/users/test" create_prop_test.prop
[ -e content/users/test/create_prop_test.md ]
grep -o "^title: Simple create test" content/users/test/create_prop_test.md
}
@test "Update property" {
echo "---
title: Simple update test
---
" > content/users/test/update_prop_test.md
echo "title: Simple edit" > content/users/test/update_prop_test.prop
! grep -o "^title: Simple edit" content/users/test/update_prop_test.md
bin/ac_route.sh "$(pwd)/content/users/test" update_prop_test.prop
[ -e content/users/test/update_prop_test.md ]
grep -o "^title: Simple edit" content/users/test/update_prop_test.md
}
@test "Delete property" {
echo "---
title: Simple delete test
---
" > content/users/test/delete_prop_test.md
echo "title: " > content/users/test/delete_prop_test.prop
grep -o "^title:" content/users/test/delete_prop_test.md
bin/ac_route.sh "$(pwd)/content/users/test" delete_prop_test.prop
[ -e content/users/test/delete_prop_test.md ]
! grep -o "^title:" content/users/test/delete_prop_test.md
}
@test "Insert new ac_choice" {
echo "---
title: Simple ac_choice new insert test
---
" > content/users/test/choice_new_insert_test.md
echo "ac_choices[0]: new choice" > content/users/test/choice_new_insert_test.prop
bin/ac_route.sh "$(pwd)/content/users/test" choice_new_insert_test.prop
[ -e content/users/test/choice_new_insert_test.md ]
cat content/users/test/choice_new_insert_test.md
grep -o "^- new choice" content/users/test/choice_new_insert_test.md
}
@test "Insert ac_choice" {
echo "---
title: Simple ac_choice insert test
ac_choices:
- choice number 1
- choice number 2
- choice number 3
world: hello
hello: world
---
" > content/users/test/choice_insert_test.md
echo "ac_choices[3]: new choice" > content/users/test/choice_insert_test.prop
bin/ac_route.sh "$(pwd)/content/users/test" choice_insert_test.prop
[ -e content/users/test/choice_insert_test.md ]
cat content/users/test/choice_insert_test.md
grep -o "^- new choice" content/users/test/choice_insert_test.md
grep -o "^- choice number 3" content/users/test/choice_insert_test.md
grep -o "^hello: world" content/users/test/choice_insert_test.md
}
@test "Update ac_choice" {
echo "---
title: Simple ac_choice update test
ac_choices:
- choice number 1
- choice number 2
- choice number 3
---
" > content/users/test/choice_update_test.md
echo "ac_choices[2]: updated choice" > content/users/test/choice_update_test.prop
bin/ac_route.sh "$(pwd)/content/users/test" choice_update_test.prop
[ -e content/users/test/choice_update_test.md ]
cat content/users/test/choice_update_test.md
grep -o "^- updated choice" content/users/test/choice_update_test.md
grep -v "^- choice number 3" content/users/test/choice_update_test.md
}
@test "Delete ac_choice" {
echo "---
title: Simple ac_choice delete test
ac_choices:
- choice number 1
- choice number 2
- choice number 3
---
" > content/users/test/choice_delete_test.md
echo "ac_choices[2]: " > content/users/test/choice_delete_test.prop
grep -o "^- choice number 3" content/users/test/choice_delete_test.md
bin/ac_route.sh "$(pwd)/content/users/test" choice_delete_test.prop
[ -e content/users/test/choice_delete_test.md ]
! grep -o "^- choice number 3" content/users/test/choice_delete_test.md
}
teardown() {
rm -rf content/users
}

21
bin/ac_route.sh Executable file
View File

@ -0,0 +1,21 @@
#!/bin/sh
# Routing acoeur commands to corresponding shell command
echo "Triggering command for $1 $2"
cd "$(dirname "$0")" || exit
case $2 in
*.create) ./_commands/create.sh "$1" "$2";;
*.delete) ./_commands/delete.sh "$1" "$2";;
*.choice) ./_commands/choice.sh "$1" "$2";;
*.content) ./_commands/content.sh "$1" "$2";;
*.prop) ./_commands/prop.sh "$1" "$2";;
*.md) ./_commands/default_actions.sh "$1" "$2";;
esac
case $2 in
*.md|*.result|*.jpg|*.png|*.gif) ;;
*.*) echo "Deleting $1/$2" && rm "$1/$2";;
esac

26
bin/acoeur.conf Normal file
View File

@ -0,0 +1,26 @@
<VirtualHost *:80>
ServerName acoeur.localhost
ServerAlias acoeur acoeur.acoeuro.com
DocumentRoot /var/simpleWeb/apps/acoeur/public
</VirtualHost>
<VirtualHost *:80>
ServerName edit.acoeur.localhost
ServerAlias edit.acoeur edit.acoeur.acoeuro.com
ServerSignature Off
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods "HEAD, GET, POST, PUT, OPTIONS, DELETE"
Header add Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, API-Key, Authorization, X-Test"
DocumentRoot /var/simpleWeb/apps/acoeur/content
<Directory /var/simpleWeb/apps/acoeur/content>
# This is special, anybody can see and edit it!
Require all granted
</Directory>
CustomLog /var/simpleWeb/log/apache/acoeur.log combined
# So that simple web editor can display eventual errors
Alias /app.log /var/simpleWeb/apps/acoeur/public/app.log
</VirtualHost>

14
bin/apache_on_change.sh Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/sh
cd "$(dirname "$0")/.." || exit
line="$1"
url=$(echo "$line" | cut -d ' ' -f7)
full="$(pwd)/content$url"
dir=${full%/*}
page=${url##*/}
"bin/ac_route.sh" "$dir" "$page"

View File

@ -1,34 +0,0 @@
title = "Notre-Dame de Paris"
languageCode = "en-us"
theme = "gohugo-theme-ananke"
DefaultContentLanguage = "en"
SectionPagesMenu = "main"
Paginate = 3 # this is set low for demonstrating with dummy content. Set to a higher number
googleAnalytics = ""
enableRobotsTXT = true
[sitemap]
changefreq = "monthly"
priority = 0.5
filename = "sitemap.xml"
[params]
favicon = ""
site_logo = ""
description = "The last theme you'll ever need. Maybe."
facebook = ""
twitter = "https://twitter.com/GoHugoIO"
instagram = ""
youtube = ""
github = ""
gitlab = ""
linkedin = ""
mastodon = ""
slack = ""
stackoverflow = ""
rss = ""
# choose a background color from any on this page: http://tachyons.io/docs/themes/skins/ and preface it with "bg-"
background_color_class = "bg-black"
featured_image = "/images/gohugo-default-sample-hero-image.jpg"
recent_posts_number = 2

16
config.yaml Normal file
View File

@ -0,0 +1,16 @@
title: moteur acoeur
languageCode: fr
theme: [acoeur, ananke]
DefaultContentLanguage: fr
enableRobotsTXT: true
Paginate: 50
# SectionPagesMenu: main
params:
custom_css: [custom.css]
description: Votre outil d'écriture
recent_posts_number: 50
site_logo:
markup.goldmark.renderer.unsafe: true

View File

@ -1,6 +1,8 @@
---
title: "Ananke: a Hugo Theme"
title: Le moteur acoeur
featured_image: '/images/gohugo-default-sample-hero-image.jpg'
description: "The last theme you'll ever need. Maybe."
description: "Pour des livres et des histoires dynamiques!"
---
Welcome to my blog with some of my work in progress. I've been working on this book idea. You can read some of the chapters below.
Bienvenue sur le moteur «acoeur».
Pour écrire et gérer des livres navigables, des histoires ou des manuels qui se construisent au fur et à mesure où ils sont lus!

View File

@ -1,5 +1,5 @@
---
title: "About"
title: "À propos"
description: "A few years ago, while visiting or, rather, rummaging about Notre-Dame, the author of this book found, in an obscure nook of one of the towers, the following word, engraved by hand upon the wall: —ANANKE."
featured_image: ''
---

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

5
content/assets/_index.md Normal file
View File

@ -0,0 +1,5 @@
---
title: Ressources
description: Images et autres éléments pour agrémenter vos pages
featured_image: /penguins.jpg
---

BIN
content/assets/adl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
content/assets/halfOgre.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
content/assets/penguins.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@ -1,14 +0,0 @@
---
title: Contact
featured_image: "images/notebook.jpg"
omit_header_text: true
description: We'd love to hear from you
type: page
menu: main
---
This is an example of a custom shortcode that you can put right into your content. You will need to add a form action to the the shortcode to make it work. Check out [Formspree](https://formspree.io/) for a simple, free form service.
{{< form-contact action="https://example.com" >}}

26
content/pages.txt Normal file
View File

@ -0,0 +1,26 @@
/pages/1er-quizz/cff71434-fdaf-468f-838c-067059979299.md:title: Chapitre 3 - Les lettres de nulle part
/pages/1er-quizz/b80fcc08-170e-4422-8498-ae1f97b47eda.md:title: Chapitre 5 - Le chemin de traverse
/pages/1er-quizz/7c038015-c989-4024-a3cf-14b8557fdb0c.md:title: Chapitre 6 - Rendez-vous sur la voie 9 3/4
/pages/1er-quizz/e0391bfd-e794-49d8-a2f9-76802fed3b52.md:title: Chapitre 8 - Le maître des potions
/pages/1er-quizz/91b5935e-6a59-447f-afeb-cb7cc2e5bf1c.md:title: Chapitre 9 - Duel à minuit
/pages/1er-quizz/e9745d63-1c31-42b4-a30a-dff7aae19059.md:title: Chapitre 10 - Halloween
/pages/1er-quizz/0ee87528-a6e2-4c12-9d37-3046a9855685.md:title: Chapitre 11 - Le match de Quidditch
/pages/1er-quizz/fff60373-d04a-4923-8b0d-2836668cdf62.md:title: Chapitre 12 - Le miroir du Riséd
/pages/1er-quizz/2149a943-5525-42d2-970a-820107d8aaf7.md:title: Chapitre 14 - Norbert le dragon
/pages/1er-quizz/235ce274-b98f-4f39-b363-ed8951d85699.md:title: Chapitre 15 - La forêt interdite
/pages/1er-quizz/65c8096f-c940-4002-90af-52ac3c3c6cd4.md:title: Chapitre 13 - Nicolas Flamel
/pages/1er-quizz/9c978c3a-801e-4c09-b4ce-8b2d6cb233b0.md:title: Chapitre 16 - Sous la trappe
/pages/1er-quizz/f8dfe972-1995-4f4e-9866-97306228768c.md:title: Chapitre 17 - L'homme aux deux visages
/pages/1er-quizz/283b1ec8-bfa7-48f3-8ce2-9d8f7487fd36.md:title: Chapitre 7 - Le Choixpeau Magique
/pages/1er-quizz/c4611613-92e4-4b4b-b9af-a246b86a5a22.md:title: Chapitre 4 - Le gardien des clefs
/pages/1er-quizz/0a24b36c-32b0-40b3-aa8c-d13000e8e4cb.md:title: Félicitations
/pages/1er-quizz/9ade4891-d0f3-4644-8d4d-4e787aeaf22c.md:title: Chapitre 2 - Une vitre disparait
/pages/1er-quizz/erreur.md:title: Ne te décourage pas
/pages/1er-quizz/1fafe4b4-2519-438f-b69a-e14b8616eaff.md:title: Ne te décourage pas
/pages/1er-quizz/start.md:title: Chapitre 1 - Le survivant
/pages/doc/devoir.md:title: Devoir
/pages/doc/intro.md:title: Introduction
/pages/doc/savoir.md:title: Savoir
/pages/doc/vouloir.md:title: Vouloir
/pages/doc/pouvoir.md:title: Pouvoir
/about.md:title: "À propos"

View File

@ -0,0 +1,5 @@
---
title: Félicitations
---
Tu es arrivé au bout, tu es très connaisseur... ou très perspicace! :-)

View File

@ -0,0 +1,10 @@
---
title: Chapitre 11 - Le match de Quidditch
ac_choices:
- "[Avec la main gauche](/pages/1er-quizz/erreur)"
- "[Avec la bouche](/pages/1er-quizz/fff60373-d04a-4923-8b0d-2836668cdf62)"
- "[Il ne l'attrape pas](/pages/1er-quizz/erreur)"
- "[Il lui demande gentiment de venir se poser dans sa main](/pages/1er-quizz/erreur)"
---
Comment Harry attrape-t-il le Vif d'Or qui lui fait gagner son premier match?

View File

@ -0,0 +1,4 @@
---
title: Ne te décourage pas
---

View File

@ -0,0 +1,10 @@
---
title: Chapitre 14 - Norbert le dragon
ac_choices:
- "[Gilbert](/pages/1er-quizz/erreur)"
- "[Il n'est jamais rebaptisé](/pages/1er-quizz/erreur)"
- "[Framboise](/pages/1er-quizz/erreur)"
- "[Norberta](/pages/1er-quizz/235ce274-b98f-4f39-b363-ed8951d85699)"
---
Norbert est le nom qui a été donné par Hagrid au dragon qu'il a vu naître, mais plus tard, il sera rebaptisé. Comment?

View File

@ -0,0 +1,9 @@
---
title: Chapitre 14 - Norbert le dragon
ac_choices:
- "[Gilbert](/pages/1er-quizz/erreur)"
---
- "[Framboise](/pages/1er-quizz/erreur)"
- "[Norberta](235ce274-b98f-4f39-b363-ed8951d85699)"
Norbert est le nom qui a été donné par Hagrid au dragon qu'il a vu naître, mais plus tard, il sera rebaptisé. Comment?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 15 - La forêt interdite
ac_choices:
- "[Firenze](/pages/1er-quizz/9c978c3a-801e-4c09-b4ce-8b2d6cb233b0)"
- "[Bane](/pages/1er-quizz/erreur)"
- "[Ronan](/pages/1er-quizz/erreur)"
- "[Patrick](/pages/1er-quizz/erreur)"
---
Quel est le nom du centaure qui sauve Harry de la silhouette buveuse de sang de licorne (Voldemort)?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 7 - Le Choixpeau Magique
ac_choices:
- "[Ils ont une si mauvaise vue qu'ils n'ont jamais vraiment vu les fentes dans le Choixpeau qui forme son visage](/pages/1er-quizz/erreur)"
- "[Ils nont pas été répartis dans la bonne maison](/pages/1er-quizz/erreur)"
- "[Ils n'ont pas aimé le choix du Choixpeau et auraient voulu être dans une autre maison](/pages/1er-quizz/erreur)"
- "[Ils ont été particulièrement difficiles à répartir, le Choixpeau hésitant entre deux maisons](/pages/1er-quizz/e0391bfd-e794-49d8-a2f9-76802fed3b52)"
---
Minerva McGonagall, Filius Flitwick, et Harry Potter ont un point commun, ce sont des “Chapeauflou”. Quest-ce que cela signifie?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 13 - Nicolas Flamel
ac_choices:
- "[Sur la carte chocogrenouille de Dumbledore](/pages/1er-quizz/2149a943-5525-42d2-970a-820107d8aaf7)"
- "[Dans un des livres qu'Hermione aime lire avant de dormir et qu'il lui avait emprunté](/pages/1er-quizz/erreur)"
- "[Dans un devoir de métamorphose](/pages/1er-quizz/erreur)"
- "[Sur la porte d'un bureau](/pages/1er-quizz/erreur)"
---
Harry connaît ce nom... Mais où l'a-t-il vu?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 6 - Rendez-vous sur la voie 9 3/4
ac_choices:
- "[Sirius Black](/pages/1er-quizz/erreur)"
- "[Cornelius Fudge](/pages/1er-quizz/erreur)"
- "[Nicolas Flamel](/pages/1er-quizz/283b1ec8-bfa7-48f3-8ce2-9d8f7487fd36)"
- "[Gregorovitch](/pages/1er-quizz/erreur)"
---
De quel ami de Dumbledore Harry entend-il parler pour la première fois dans le train, sans y faire plus attention que cela?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 9 - Duel à minuit
ac_choices:
- "[La grande salle](/pages/1er-quizz/erreur)"
- "[La bibliothèque](/pages/1er-quizz/erreur)"
- "[La salle de métamorphose](/pages/1er-quizz/erreur)"
- "[La salle des trophées](/pages/1er-quizz/e9745d63-1c31-42b4-a30a-dff7aae19059)"
---
Suite à une confrontation, Drago et Harry se donnent rendez-vous à minuit dans…

View File

@ -0,0 +1,4 @@
Dans ce chapitre, Harry se souvient avoir été plusieurs fois arrêté dans la rue par des gens à lallure étrange qui le remerciaient…
Lun deux était un homme au chapeau haut de forme violet, qui sétait incliné devant Harry; de qui sagit-il?

View File

@ -0,0 +1,12 @@
---
title: Chapitre 2 - Une vitre disparait
ac_choices:
- "[Kingsley Shacklebolt](/pages/1er-quizz/erreur)"
- "[Quirinus Quirrell](/pages/1er-quizz/erreur)"
- "[Dedalus Diggle](/pages/1er-quizz/cff71434-fdaf-468f-838c-067059979299)"
- "[Doris Crockford](/pages/1er-quizz/erreur)"
---
Dans ce chapitre, Harry se souvient avoir été plusieurs fois arrêté dans la rue par des gens à lallure étrange qui le remerciaient…
Lun deux était un homme au chapeau haut de forme violet, qui sétait incliné devant Harry; de qui sagit-il?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 16 - Sous la trappe
ac_choices:
- "[Touffu, Filet du diable, Clefs volantes, Echiquiers, Miroir du Riséd](/pages/1er-quizz/erreur)"
- "[Touffu, Filet du diable, Echiquiers, Clefs volantes, Potion, Miroir du Riséd](/pages/1er-quizz/erreur)"
- "[Touffu, Filet du diable, Clefs volantes, Echiquiers, Troll, Potions, Miroir du Riséd](/pages/1er-quizz/f8dfe972-1995-4f4e-9866-97306228768c)"
- "[Touffu, Filet du diable, Clefs volantes, Echiquiers, Potions, Troll, Miroir du Riséd](/pages/1er-quizz/erreur)"
---
Dans l'ordre chronologique, quelles sont les épreuves qui permettent d'atteindre la pierre philosophale à Poudlard?

View File

@ -0,0 +1,4 @@
---
title: 1er quizz
ac_create: start
---

View File

@ -0,0 +1,10 @@
---
title: Chapitre 5 - Le chemin de traverse
ac_choices:
- "[Une plume de Fumseck, le phénix de Dumbledore](/pages/1er-quizz/7c038015-c989-4024-a3cf-14b8557fdb0c)"
- "[Un crin de la licorne retrouvée morte dans la forêt interdite plus loin dans l'histoire](/pages/1er-quizz/erreur)"
- "[Une plume d'un phénix dont on ne connait pas le nom ni l'histoire](/pages/1er-quizz/erreur)"
- "[Une écaille de Nagini, le serpent de Voldemort](/pages/1er-quizz/erreur)"
---
Qu'y a-t-il à l'intérieur de la baguette d'Harry?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 4 - Le gardien des clefs
ac_choices:
- "[Pardon, la porte est tombée toute seule.](/pages/1er-quizz/erreur)"
- "[Quelle tempête, j'ai besoin d'un remontant.](/pages/1er-quizz/erreur)"
- "[Si vous aviez une tasse de thé, ce ne serait pas de refus.](/pages/1er-quizz/b80fcc08-170e-4422-8498-ae1f97b47eda)"
- "[J'ai oublié mon parapluie.](/pages/1er-quizz/erreur)"
---
Quelle est la première phrase prononcée par Hagrid après son entrée tonitruante dans la vie dHarry?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 3 - Les lettres de nulle part
ac_choices:
- "[Dans un Hôtel à Carbone-les-Mines](/pages/1er-quizz/erreur)"
- "[Dans une cabane au sommet d'un rocher au large de Carbone-les-Mines](/pages/1er-quizz/c4611613-92e4-4b4b-b9af-a246b86a5a22)"
- "[Dans le placard sous l'escalier du 4, Privet Drive](/pages/1er-quizz/erreur)"
- "[Dans la plus petite chambre du 4, Privet Drive](/pages/1er-quizz/erreur)"
---
Où se trouve Harry lorsquil apprend quil est un sorcier?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 8 - Le maître des potions
ac_choices:
- "[Une pierre que l'on trouve dans l'estomac des biches et qui constitue un antidote à quelques poisons](/pages/1er-quizz/erreur)"
- "[Une pierre que l'on trouve dans l'estomac des chèvres et qui constitue un antidote à la plupart des poisons](/pages/1er-quizz/91b5935e-6a59-447f-afeb-cb7cc2e5bf1c)"
- "[Une pierre que l'on trouve dans le foie des chèvres et qui constitue un antidote à la plupart des poisons](/pages/1er-quizz/erreur)"
- "[Une pierre que l'on trouve dans l'estomac des chèvres et qui constitue un puissant poison](/pages/1er-quizz/erreur)"
---
Travaillez un peu! Quest-ce quun Bézoard?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 10 - Halloween
ac_choices:
- "[Drago Malefoy](/pages/1er-quizz/erreur)"
- "[Severus Rogue](/pages/1er-quizz/erreur)"
- "[Quirinus Quirrell](/pages/1er-quizz/0ee87528-a6e2-4c12-9d37-3046a9855685)"
- "[Rubeus Hagrid](/pages/1er-quizz/erreur)"
---
Qui entra dans la grande salle en courant et seffondra sur la table des professeurs en disant “un Troll… dans les cachots”?

View File

@ -0,0 +1,6 @@
---
title: Ne te décourage pas
ac_choices:
- "[Encore une fois!](/pages/1er-quizz/start)"
---
Cest en essayant encore et toujours que tu arriveras au bout!

View File

@ -0,0 +1,10 @@
---
title: Chapitre 17 - L'homme aux deux visages
ac_choices:
- "[Il suffisait de demander](/pages/1er-quizz/erreur)"
- "[Il fallait vouloir se servir de la pierre](/pages/1er-quizz/erreur)"
- "[Il fallait être honnête avec le miroir](/pages/1er-quizz/erreur)"
- "[Il fallait vouloir trouver la pierre et non s'en servir](/pages/1er-quizz/0a24b36c-32b0-40b3-aa8c-d13000e8e4cb)"
---
Que fallait-il faire pour obtenir la pierre philosophale du miroir du Riséd?

View File

@ -0,0 +1,10 @@
---
title: Chapitre 12 - Le miroir du Riséd
ac_choices:
- "[Qu'il est temps que je me couche parce que mes questions ne veulent plus rien dire](/pages/1er-quizz/erreur)"
- "[Que le miroir montre à la fois le visage de celui qui le regarde mais également toutes ses envies](/pages/1er-quizz/erreur)"
- "[Qu'il ne montre pas forcément le visage de celui qui le regarde mais son désir le plus profond](/pages/1er-quizz/65c8096f-c940-4002-90af-52ac3c3c6cd4)"
- "[Quavec un tel miroir, le professeur Dumbledore ne voit que son reflet](/pages/1er-quizz/erreur)"
---
Que signifie "Riséd elrue ocnot edsi amega siv notsap ert nomen ej"?

View File

@ -0,0 +1,11 @@
---
title: Chapitre 1 - Le survivant
featured_image: /../../../../../assets/Swallow_flying_drinking.jpg
ac_choices:
- "[Des centaines de hiboux se sont mis à voler, de jour, partout dans le pays](/pages/1er-quizz/erreur)"
- "[Des averses détoiles filantes ont été aperçues du côté de lÉcosse](1fafe4b4-2519-438f-b69a-e14b8616eaff)"
- "[Un chat a passé la journée à observer leur maison tout en ayant un comportement d'humain](/pages/1er-quizz/erreur)"
- "[Tout à la fois](/pages/1er-quizz/9ade4891-d0f3-4644-8d4d-4e787aeaf22c)"
---
Quels évènements surprenants amènent les Dursley à se demander que deviennent les Potter et leur fils Harry?

View File

@ -0,0 +1,3 @@
---
title: Documentation
---

View File

@ -0,0 +1,5 @@
---
title: Devoir
---

View File

@ -0,0 +1,15 @@
---
title: Introduction
description: Et hop vous êtes là bas
featured_image: https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/L-door.png/640px-L-door.png
ac_choices:
- "[Démarrez avec des exemples](/pages/doc/devoir)"
- "[Expérimentez dans un monde vide](/pages/doc/pouvoir)"
- "[Lisez puis testez](/pages/doc/savoir)"
- "[Imaginez tout](/pages/doc/vouloir)"
- "[Chi](/pages/doc/vouloir)"
---
Vous arrivez sur une première page web, qui doit vous permettre de choisir parmi quatre chemins possibles.
Que préférerez vous, limagination dun monde vierge, la transmission de connaissances, des exemples à compléter, ou vous lancer tout de suite!

View File

@ -0,0 +1,11 @@
---
title: Pouvoir
description: Performance et compétition
weight: 2
ac_require:
- intro
ac_delete:
- intro
---
Vous voulez tester ou encourager

View File

@ -0,0 +1,5 @@
---
title: Savoir
---
Transmission de savoirs

View File

@ -0,0 +1,7 @@
---
title: Vouloir
description: Aller toujours plus loin
weight: 2
---
<p>Hello world</p>

View File

@ -1,5 +0,0 @@
---
title: "Articles"
date: 2017-03-02T12:00:00-05:00
---
Articles are paginated with only three posts here for example. You can set the number of entries to show on this page with the "pagination" setting in the config file.

View File

@ -1,81 +0,0 @@
---
date: 2017-04-09T10:58:08-04:00
description: "The Grand Hall"
featured_image: "/images/Pope-Edouard-de-Beaumont-1844.jpg"
tags: ["scene"]
title: "Chapter I: The Grand Hall"
---
Three hundred and forty-eight years, six months, and nineteen days ago
to-day, the Parisians awoke to the sound of all the bells in the triple
circuit of the city, the university, and the town ringing a full peal.
The sixth of January, 1482, is not, however, a day of which history has
preserved the memory. There was nothing notable in the event which thus
set the bells and the bourgeois of Paris in a ferment from early morning.
It was neither an assault by the Picards nor the Burgundians, nor a hunt
led along in procession, nor a revolt of scholars in the town of Laas, nor
an entry of “our much dread lord, monsieur the king,” nor even a pretty
hanging of male and female thieves by the courts of Paris. Neither was it
the arrival, so frequent in the fifteenth century, of some plumed and
bedizened embassy. It was barely two days since the last cavalcade of that
nature, that of the Flemish ambassadors charged with concluding the
marriage between the dauphin and Marguerite of Flanders, had made its
entry into Paris, to the great annoyance of M. le Cardinal de Bourbon,
who, for the sake of pleasing the king, had been obliged to assume an
amiable mien towards this whole rustic rabble of Flemish burgomasters, and
to regale them at his Hôtel de Bourbon, with a very “pretty morality,
allegorical satire, and farce,” while a driving rain drenched the
magnificent tapestries at his door.
What put the “whole population of Paris in commotion,” as Jehan de Troyes
expresses it, on the sixth of January, was the double solemnity, united
from time immemorial, of the Epiphany and the Feast of Fools.
On that day, there was to be a bonfire on the Place de Grève, a maypole at
the Chapelle de Braque, and a mystery at the Palais de Justice. It had
been cried, to the sound of the trumpet, the preceding evening at all the
cross roads, by the provosts men, clad in handsome, short, sleeveless
coats of violet camelot, with large white crosses upon their breasts.
So the crowd of citizens, male and female, having closed their houses and
shops, thronged from every direction, at early morn, towards some one of
the three spots designated.
Each had made his choice; one, the bonfire; another, the maypole; another,
the mystery play. It must be stated, in honor of the good sense of the
loungers of Paris, that the greater part of this crowd directed their
steps towards the bonfire, which was quite in season, or towards the
mystery play, which was to be presented in the grand hall of the Palais de
Justice (the courts of law), which was well roofed and walled; and that
the curious left the poor, scantily flowered maypole to shiver all alone
beneath the sky of January, in the cemetery of the Chapel of Braque.
The populace thronged the avenues of the law courts in particular, because
they knew that the Flemish ambassadors, who had arrived two days
previously, intended to be present at the representation of the mystery,
and at the election of the Pope of the Fools, which was also to take place
in the grand hall.
It was no easy matter on that day, to force ones way into that grand
hall, although it was then reputed to be the largest covered enclosure in
the world (it is true that Sauval had not yet measured the grand hall of
the Château of Montargis). The palace place, encumbered with people,
offered to the curious gazers at the windows the aspect of a sea; into
which five or six streets, like so many mouths of rivers, discharged every
moment fresh floods of heads. The waves of this crowd, augmented
incessantly, dashed against the angles of the houses which projected here
and there, like so many promontories, into the irregular basin of the
place. In the centre of the lofty Gothic* façade of the palace, the grand
staircase, incessantly ascended and descended by a double current, which,
after parting on the intermediate landing-place, flowed in broad waves
along its lateral slopes,—the grand staircase, I say, trickled
incessantly into the place, like a cascade into a lake. The cries, the
laughter, the trampling of those thousands of feet, produced a great noise
and a great clamor. From time to time, this noise and clamor redoubled;
the current which drove the crowd towards the grand staircase flowed
backwards, became troubled, formed whirlpools. This was produced by the
buffet of an archer, or the horse of one of the provosts sergeants, which
kicked to restore order; an admirable tradition which the provostship has
bequeathed to the constablery, the constablery to the _maréchaussée_,
the _maréchaussée_ to our _gendarmeri_ of Paris.

View File

@ -1,90 +0,0 @@
---
date: 2017-04-10T11:00:59-04:00
description: "Pierre Gringoire"
featured_image: ""
tags: []
title: "Chapter II: Pierre Gringoire"
---
Nevertheless, as be harangued them, the satisfaction and admiration
unanimously excited by his costume were dissipated by his words; and when
he reached that untoward conclusion: “As soon as his illustrious eminence,
the cardinal, arrives, we will begin,” his voice was drowned in a thunder
of hooting.
“Begin instantly! The mystery! the mystery immediately!” shrieked the
people. And above all the voices, that of Johannes de Molendino was
audible, piercing the uproar like the fifes derisive serenade: “Commence
instantly!” yelped the scholar.
“Down with Jupiter and the Cardinal de Bourbon!” vociferated Robin
Poussepain and the other clerks perched in the window.
“The morality this very instant!” repeated the crowd; “this very instant!
the sack and the rope for the comedians, and the cardinal!”
Poor Jupiter, haggard, frightened, pale beneath his rouge, dropped his
thunderbolt, took his cap in his hand; then he bowed and trembled and
stammered: “His eminence—the ambassadors—Madame Marguerite of
Flanders—.” He did not know what to say. In truth, he was afraid of
being hung.
Hung by the populace for waiting, hung by the cardinal for not having
waited, he saw between the two dilemmas only an abyss; that is to say, a
gallows.
Luckily, some one came to rescue him from his embarrassment, and assume
the responsibility.
An individual who was standing beyond the railing, in the free space
around the marble table, and whom no one had yet caught sight of, since
his long, thin body was completely sheltered from every visual ray by the
diameter of the pillar against which he was leaning; this individual, we
say, tall, gaunt, pallid, blond, still young, although already wrinkled
about the brow and cheeks, with brilliant eyes and a smiling mouth, clad
in garments of black serge, worn and shining with age, approached the
marble table, and made a sign to the poor sufferer. But the other was so
confused that he did not see him. The new comer advanced another step.
“Jupiter,” said he, “my dear Jupiter!”
The other did not hear.
At last, the tall blond, driven out of patience, shrieked almost in his
face,—
“Michel Giborne!”
“Who calls me?” said Jupiter, as though awakened with a start.
“I,” replied the person clad in black.
“Ah!” said Jupiter.
“Begin at once,” went on the other. “Satisfy the populace; I undertake to
appease the bailiff, who will appease monsieur the cardinal.”
Jupiter breathed once more.
“Messeigneurs the bourgeois,” he cried, at the top of his lungs to the
crowd, which continued to hoot him, “we are going to begin at once.”
“_Evoe Jupiter! Plaudite cives_! All hail, Jupiter! Applaud,
citizens!” shouted the scholars.
“Noel! Noel! good, good,” shouted the people.
The hand clapping was deafening, and Jupiter had already withdrawn under
his tapestry, while the hall still trembled with acclamations.
In the meanwhile, the personage who had so magically turned the tempest
into dead calm, as our old and dear Corneille puts it, had modestly
retreated to the half-shadow of his pillar, and would, no doubt, have
remained invisible there, motionless, and mute as before, had he not been
plucked by the sleeve by two young women, who, standing in the front row
of the spectators, had noticed his colloquy with Michel Giborne-Jupiter.
“Master,” said one of them, making him a sign to approach. “Hold your
tongue, my dear Liénarde,” said her neighbor, pretty, fresh, and very
brave, in consequence of being dressed up in her best attire. “He is not a
clerk, he is a layman; you must not say master to him, but messire.”

View File

@ -1,100 +0,0 @@
---
date: 2017-04-11T11:13:32-04:00
description: "Monsieur the Cardinal"
featured_image: ""
tags: []
title: "Chapter III: Monsieur the Cardinal"
---
Poor Gringoire! the din of all the great double petards of the Saint-Jean,
the discharge of twenty arquebuses on supports, the detonation of that
famous serpentine of the Tower of Billy, which, during the siege of Paris,
on Sunday, the twenty-sixth of September, 1465, killed seven Burgundians
at one blow, the explosion of all the powder stored at the gate of the
Temple, would have rent his ears less rudely at that solemn and dramatic
moment, than these few words, which fell from the lips of the usher, “His
eminence, Monseigneur the Cardinal de Bourbon.”
It is not that Pierre Gringoire either feared or disdained monsieur the
cardinal. He had neither the weakness nor the audacity for that. A true
eclectic, as it would be expressed nowadays, Gringoire was one of those
firm and lofty, moderate and calm spirits, which always know how to bear
themselves amid all circumstances (_stare in dimidio rerum_), and who
are full of reason and of liberal philosophy, while still setting store by
cardinals. A rare, precious, and never interrupted race of philosophers to
whom wisdom, like another Ariadne, seems to have given a clew of thread
which they have been walking along unwinding since the beginning of the
world, through the labyrinth of human affairs. One finds them in all ages,
ever the same; that is to say, always according to all times. And, without
reckoning our Pierre Gringoire, who may represent them in the fifteenth
century if we succeed in bestowing upon him the distinction which he
deserves, it certainly was their spirit which animated Father du Breul,
when he wrote, in the sixteenth, these naively sublime words, worthy of
all centuries: “I am a Parisian by nation, and a Parrhisian in language,
for _parrhisia_ in Greek signifies liberty of speech; of which I have
made use even towards messeigneurs the cardinals, uncle and brother to
Monsieur the Prince de Conty, always with respect to their greatness, and
without offending any one of their suite, which is much to say.”
There was then neither hatred for the cardinal, nor disdain for his
presence, in the disagreeable impression produced upon Pierre Gringoire.
Quite the contrary; our poet had too much good sense and too threadbare a
coat, not to attach particular importance to having the numerous allusions
in his prologue, and, in particular, the glorification of the dauphin, son
of the Lion of France, fall upon the most eminent ear. But it is not
interest which predominates in the noble nature of poets. I suppose that
the entity of the poet may be represented by the number ten; it is certain
that a chemist on analyzing and pharmacopolizing it, as Rabelais says,
would find it composed of one part interest to nine parts of self-esteem.
Now, at the moment when the door had opened to admit the cardinal, the
nine parts of self-esteem in Gringoire, swollen and expanded by the breath
of popular admiration, were in a state of prodigious augmentation, beneath
which disappeared, as though stifled, that imperceptible molecule of which
we have just remarked upon in the constitution of poets; a precious
ingredient, by the way, a ballast of reality and humanity, without which
they would not touch the earth. Gringoire enjoyed seeing, feeling,
fingering, so to speak an entire assembly (of knaves, it is true, but what
matters that?) stupefied, petrified, and as though asphyxiated in the
presence of the incommensurable tirades which welled up every instant from
all parts of his bridal song. I affirm that he shared the general
beatitude, and that, quite the reverse of La Fontaine, who, at the
presentation of his comedy of the “Florentine,” asked, “Who is the
ill-bred lout who made that rhapsody?” Gringoire would gladly have
inquired of his neighbor, “Whose masterpiece is this?”
The reader can now judge of the effect produced upon him by the abrupt and
unseasonable arrival of the cardinal.
That which he had to fear was only too fully realized. The entrance of his
eminence upset the audience. All heads turned towards the gallery. It was
no longer possible to hear ones self. “The cardinal! The cardinal!”
repeated all mouths. The unhappy prologue stopped short for the second
time.
The cardinal halted for a moment on the threshold of the estrade. While he
was sending a rather indifferent glance around the audience, the tumult
redoubled. Each person wished to get a better view of him. Each man vied
with the other in thrusting his head over his neighbors shoulder.
He was, in fact, an exalted personage, the sight of whom was well worth
any other comedy. Charles, Cardinal de Bourbon, Archbishop and Comte of
Lyon, Primate of the Gauls, was allied both to Louis XI., through his
brother, Pierre, Seigneur de Beaujeu, who had married the kings eldest
daughter, and to Charles the Bold through his mother, Agnes of Burgundy.
Now, the dominating trait, the peculiar and distinctive trait of the
character of the Primate of the Gauls, was the spirit of the courtier, and
devotion to the powers that be. The reader can form an idea of the
numberless embarrassments which this double relationship had caused him,
and of all the temporal reefs among which his spiritual bark had been
forced to tack, in order not to suffer shipwreck on either Louis or
Charles, that Scylla and that Charybdis which had devoured the Duc de
Nemours and the Constable de Saint-Pol. Thanks to Heavens mercy, he had
made the voyage successfully, and had reached home without hindrance. But
although he was in port, and precisely because he was in port, he never
recalled without disquiet the varied haps of his political career, so long
uneasy and laborious. Thus, he was in the habit of saying that the year
1476 had been “white and black” for him—meaning thereby, that in the
course of that year he had lost his mother, the Duchesse de la
Bourbonnais, and his cousin, the Duke of Burgundy, and that one grief had
consoled him for the other.

View File

@ -1,86 +0,0 @@
---
date: 2017-04-12T11:14:48-04:00
description: "Master Jacques Coppenole"
featured_image: ""
tags: ["scene"]
title: "Chapter IV: Master Jacques Coppenole"
---
While the pensioner of Ghent and his eminence were exchanging very low
bows and a few words in voices still lower, a man of lofty stature, with a
large face and broad shoulders, presented himself, in order to enter
abreast with Guillaume Rym; one would have pronounced him a bull-dog by
the side of a fox. His felt doublet and leather jerkin made a spot on the
velvet and silk which surrounded him. Presuming that he was some groom who
had stolen in, the usher stopped him.
“Hold, my friend, you cannot pass!”
The man in the leather jerkin shouldered him aside.
“What does this knave want with me?” said he, in stentorian tones, which
rendered the entire hall attentive to this strange colloquy. “Dont you
see that I am one of them?”
“Your name?” demanded the usher.
“Jacques Coppenole.”
“Your titles?”
“Hosier at the sign of the Three Little Chains, of Ghent.”
The usher recoiled. One might bring ones self to announce aldermen and
burgomasters, but a hosier was too much. The cardinal was on thorns. All
the people were staring and listening. For two days his eminence had been
exerting his utmost efforts to lick these Flemish bears into shape, and to
render them a little more presentable to the public, and this freak was
startling. But Guillaume Rym, with his polished smile, approached the
usher.
“Announce Master Jacques Coppenole, clerk of the aldermen of the city of
Ghent,” he whispered, very low.
“Usher,” interposed the cardinal, aloud, “announce Master Jacques
Coppenole, clerk of the aldermen of the illustrious city of Ghent.”
This was a mistake. Guillaume Rym alone might have conjured away the
difficulty, but Coppenole had heard the cardinal.
“No, cross of God?” he exclaimed, in his voice of thunder, “Jacques
Coppenole, hosier. Do you hear, usher? Nothing more, nothing less. Cross
of God! hosier; thats fine enough. Monsieur the Archduke has more than
once sought his _gant_\* in my hose.”
_* Got the first idea of a timing._
Laughter and applause burst forth. A jest is always understood in Paris,
and, consequently, always applauded.
Let us add that Coppenole was of the people, and that the auditors which
surrounded him were also of the people. Thus the communication between him
and them had been prompt, electric, and, so to speak, on a level. The
haughty air of the Flemish hosier, by humiliating the courtiers, had
touched in all these plebeian souls that latent sentiment of dignity still
vague and indistinct in the fifteenth century.
This hosier was an equal, who had just held his own before monsieur the
cardinal. A very sweet reflection to poor fellows habituated to respect
and obedience towards the underlings of the sergeants of the bailiff of
Sainte-Geneviève, the cardinals train-bearer.
Coppenole proudly saluted his eminence, who returned the salute of the
all-powerful bourgeois feared by Louis XI. Then, while Guillaume Rym, a
“sage and malicious man,” as Philippe de Comines puts it, watched them
both with a smile of raillery and superiority, each sought his place, the
cardinal quite abashed and troubled, Coppenole tranquil and haughty, and
thinking, no doubt, that his title of hosier was as good as any other,
after all, and that Marie of Burgundy, mother to that Marguerite whom
Coppenole was to-day bestowing in marriage, would have been less afraid of
the cardinal than of the hosier; for it is not a cardinal who would have
stirred up a revolt among the men of Ghent against the favorites of the
daughter of Charles the Bold; it is not a cardinal who could have
fortified the populace with a word against her tears and prayers, when the
Maid of Flanders came to supplicate her people in their behalf, even at
the very foot of the scaffold; while the hosier had only to raise his
leather elbow, in order to cause to fall your two heads, most illustrious
seigneurs, Guy dHymbercourt and Chancellor Guillaume Hugonet.

View File

@ -1,17 +0,0 @@
---
date: 2017-04-13T11:15:58-04:00
description: "Quasimodo"
featured_image: ""
tags: []
title: "Chapter V: Quasimodo"
---
In the twinkling of an eye, all was ready to execute Coppenoles idea. Bourgeois, scholars and law clerks all set to work. The little chapel situated opposite the marble table was selected for the scene of the grinning match. A pane broken in the pretty rose window above the door, left free a circle of stone through which it was agreed that the competitors should thrust their heads. In order to reach it, it was only necessary to mount upon a couple of hogsheads, which had been produced from I know not where, and perched one upon the other, after a fashion. It was settled that each candidate, man or woman (for it was possible to choose a female pope), should, for the sake of leaving the impression of his grimace fresh and complete, cover his face and remain concealed in the chapel until the moment of his appearance. In less than an instant, the chapel was crowded with competitors, upon whom the door was then closed.
Coppenole, from his post, ordered all, directed all, arranged all. During the uproar, the cardinal, no less abashed than Gringoire, had retired with all his suite, under the pretext of business and vespers, without the crowd which his arrival had so deeply stirred being in the least moved by his departure. Guillaume Rym was the only one who noticed his eminences discomfiture. The attention of the populace, like the sun, pursued its revolution; having set out from one end of the hall, and halted for a space in the middle, it had now reached the other end. The marble table, the brocaded gallery had each had their day; it was now the turn of the chapel of Louis XI. Henceforth, the field was open to all folly. There was no one there now, but the Flemings and the rabble.
The grimaces began. The first face which appeared at the aperture, with eyelids turned up to the reds, a mouth open like a maw, and a brow wrinkled like our hussar boots of the Empire, evoked such an inextinguishable peal of laughter that Homer would have taken all these louts for gods. Nevertheless, the grand hall was anything but Olympus, and Gringoires poor Jupiter knew it better than any one else. A second and third grimace followed, then another and another; and the laughter and transports of delight went on increasing. There was in this spectacle, a peculiar power of intoxication and fascination, of which it would be difficult to convey to the reader of our day and our salons any idea.
Let the reader picture to himself a series of visages presenting successively all geometrical forms, from the triangle to the trapezium, from the cone to the polyhedron; all human expressions, from wrath to lewdness; all ages, from the wrinkles of the new-born babe to the wrinkles of the aged and dying; all religious phantasmagories, from Faun to Beelzebub; all animal profiles, from the maw to the beak, from the jowl to the muzzle. Let the reader imagine all these grotesque figures of the Pont Neuf, those nightmares petrified beneath the hand of Germain Pilon, assuming life and breath, and coming in turn to stare you in the face with burning eyes; all the masks of the Carnival of Venice passing in succession before your glass,—in a word, a human kaleidoscope.
The orgy grew more and more Flemish. Teniers could have given but a very imperfect idea of it. Let the reader picture to himself in bacchanal form, Salvator Rosas battle. There were no longer either scholars or ambassadors or bourgeois or men or women; there was no longer any Clopin Trouillefou, nor Gilles Lecornu, nor Marie Quatrelivres, nor Robin Poussepain. All was universal license. The grand hall was no longer anything but a vast furnace of effrontry and joviality, where every mouth was a cry, every individual a posture; everything shouted and howled. The strange visages which came, in turn, to gnash their teeth in the rose window, were like so many brands cast into the brazier; and from the whole of this effervescing crowd, there escaped, as from a furnace, a sharp, piercing, stinging noise, hissing like the wings of a gnat.

View File

@ -1,99 +0,0 @@
---
date: 2017-04-14T11:25:05-04:00
description: "Esmeralda"
featured_image: "/images/esmeralda.jpg"
tags: []
title: "Chapter VI: Esmeralda"
disable_share: false
---
We are delighted to be able to inform the reader, that during the whole of
this scene, Gringoire and his piece had stood firm. His actors, spurred on
by him, had not ceased to spout his comedy, and he had not ceased to
listen to it. He had made up his mind about the tumult, and was determined
to proceed to the end, not giving up the hope of a return of attention on
the part of the public. This gleam of hope acquired fresh life, when he
saw Quasimodo, Coppenole, and the deafening escort of the pope of the
procession of fools quit the hall amid great uproar. The throng rushed
eagerly after them. “Good,” he said to himself, “there go all the
mischief-makers.” Unfortunately, all the mischief-makers constituted the
entire audience. In the twinkling of an eye, the grand hall was empty.
To tell the truth, a few spectators still remained, some scattered, others
in groups around the pillars, women, old men, or children, who had had
enough of the uproar and tumult. Some scholars were still perched astride
of the window-sills, engaged in gazing into the Place.
“Well,” thought Gringoire, “here are still as many as are required to hear
the end of my mystery. They are few in number, but it is a choice
audience, a lettered audience.”
An instant later, a symphony which had been intended to produce the
greatest effect on the arrival of the Virgin, was lacking. Gringoire
perceived that his music had been carried off by the procession of the
Pope of the Fools. “Skip it,” said he, stoically.
He approached a group of bourgeois, who seemed to him to be discussing his
piece. This is the fragment of conversation which he caught,—
“You know, Master Cheneteau, the Hôtel de Navarre, which belonged to
Monsieur de Nemours?”
“Yes, opposite the Chapelle de Braque.”
“Well, the treasury has just let it to Guillaume Alixandre, historian, for
six hivres, eight sols, parisian, a year.”
“How rents are going up!”
“Come,” said Gringoire to himself, with a sigh, “the others are
listening.”
“Comrades,” suddenly shouted one of the young scamps from the window, “La
Esmeralda! La Esmeralda in the Place!”
This word produced a magical effect. Every one who was left in the hall
flew to the windows, climbing the walls in order to see, and repeating,
“La Esmeralda! La Esmeralda?” At the same time, a great sound of applause
was heard from without.
“Whats the meaning of this, of the Esmeralda?” said Gringoire, wringing
his hands in despair. “Ah, good heavens! it seems to be the turn of the
windows now.”
He returned towards the marble table, and saw that the representation had
been interrupted. It was precisely at the instant when Jupiter should have
appeared with his thunder. But Jupiter was standing motionless at the foot
of the stage.
“Michel Giborne!” cried the irritated poet, “what are you doing there? Is
that your part? Come up!”
“Alas!” said Jupiter, “a scholar has just seized the ladder.”
Gringoire looked. It was but too true. All communication between his plot
and its solution was intercepted.
“The rascal,” he murmured. “And why did he take that ladder?”
“In order to go and see the Esmeralda,” replied Jupiter piteously. “He
said, Come, heres a ladder thats of no use! and he took it.”
This was the last blow. Gringoire received it with resignation.
“May the devil fly away with you!” he said to the comedian, “and if I get
my pay, you shall receive yours.”
Then he beat a retreat, with drooping head, but the last in the field,
like a general who has fought well.
And as he descended the winding stairs of the courts: “A fine rabble of
asses and dolts these Parisians!” he muttered between his teeth; “they
come to hear a mystery and dont listen to it at all! They are engrossed
by every one, by Chopin Trouillefou, by the cardinal, by Coppenole, by
Quasimodo, by the devil! but by Madame the Virgin Mary, not at all. If I
had known, Id have given you Virgin Mary; you ninnies! And I! to come to
see faces and behold only backs! to be a poet, and to reap the success of
an apothecary! It is true that Homerus begged through the Greek towns, and
that Naso died in exile among the Muscovites. But may the devil flay me if
I understand what they mean with their Esmeralda! What is that word, in
the first place?—tis Egyptian!”

View File

@ -0,0 +1,6 @@
---
title: Nouveau chapitre
description: Sous-titre
---
Texte

View File

@ -0,0 +1,9 @@
---
title: Nouvel utilisateur
description: Court texte
date: {{ .Date }}
ac_create:
- /pages/1er-quizz/_index
---
Texte

View File

@ -0,0 +1,123 @@
* {
transition: box-shadow 1s;
}
.breadcrumb {
padding: 0;
margin-top: 0;
list-style: none;
}
.breadcrumb li {
display: inline;
}
.breadcrumb li + li:before {
content: ">";
padding-left: 0.3rem;
}
dl {
margin: 1em auto;
display: flex;
font-size: larger;
flex-flow: column wrap;
max-width: 60em;
max-height: 6em;
text-align: center;
}
dt a {
display: inline-block;
border-radius: 1em;
}
dd {
margin: 1em 0;
font-size: larger;
font-weight: bold;
}
body [contenteditable]:hover,
body [contenteditable]:focus,
body #content:hover,
body #content:focus {
outline-width: thin;
outline-style: solid;
outline-color: lightgray;
background-color: rgba(255, 255, 255, 0.5);
}
body.invitations .ac_choices {
display: none;
}
body.author .ac_choices .destination {
display: none;
position: relative;
padding-left: 10%;
}
body.author .ac_choices:hover .destination, body.author .ac_choices:focus-within .destination {
display: block;
}
body.author .ac_choice label.text {
cursor: text;
}
body.users .ac_choice label.text:hover {
cursor: pointer;
}
#content {
padding: 0 0.2em;
}
.ac_choice input[type=radio] {
display: none;
}
.ac_choice label.text {
cursor: pointer;
border: solid 3px white;
margin: 0.2em 0;
display: block;
padding: 1em;
border-radius: 1em;
}
.ac_choice label.text:empty:after {
color: inherit;
content: attr(placeholder);
}
body.users .ac_choice label.text:hover {
box-shadow: 0 0 5px blue inset, 0 0 5px blue;
}
body.users .ac_choice input[type="radio"]:checked + label.text {
box-shadow: 0 0 5px red inset, 0 0 5px red !important;
}
.ac_choice a.gotoChoice {
float: left;
font-size: x-large;
line-height: 1.2em;
margin-right: 1em;
text-decoration: none;
}
.ac_choice input[type=text] {
color: inherit;
width: calc(100% - 4em);
border: none;
background-color: transparent;
}
.ac_choice button.delete {
right: 0;
cursor: pointer;
padding: 0.2em 0.4em 0;
position: absolute;
border-radius: 0.2em;
}
aside#actions input#file {
display: none;
}
@media (prefers-color-scheme: dark) {
header aside, h1 {
color: black;
}
}

View File

@ -0,0 +1,31 @@
document.querySelectorAll('aside#actions #create')
.forEach(elt => elt.onclick = () => {
const url = `${topSection}/${uuid()}`
fetch(`${document.body.dataset.editHost}${url}.create`, { method: 'PUT', body: topSection })
.then(() => sleep(1))
.then(() => window.location.assign('/' + url))
.catch(error => console.error(`Error creating #{topSection}`, error))
})
document.querySelectorAll('aside#actions #delete')
.forEach(elt => elt.onclick = () =>
fetch(document.body.dataset.editUrl.replace('/_index', '.delete'), { method: 'PUT' })
.then(() => sleep(1))
.then(() => window.location.assign('/' + topSection))
.catch(error => console.error(`Error deleting #{topSection}`, error)))
document.querySelectorAll('body.assets aside#actions input#file')
.forEach(elt => elt.onchange = () =>
[...elt.files].forEach(file =>
fetch(document.body.dataset.editUrl.replace('_index', file.name), { method: 'PUT', body: file })
.then(() => sleep(1))
.then(() => window.location.reload())
.catch(error => console.error(`Error uploading #{elt.files[0].name}`, error))))
document.querySelectorAll('.delete_image')
.forEach(elt => elt.onclick = () =>
fetch(document.body.dataset.editHost + elt.dataset.target, { method: 'DELETE' })
.finally(() => elt.parentNode.remove())
.catch(error => console.error(`Error deleting file`, error)))

View File

@ -0,0 +1,13 @@
const resultUrl = '/users/' + window.location.pathname.split('/')[2]
document.querySelectorAll('body.users .ac_choice input[type=radio]')
.forEach(elt =>
elt.onchange = () => fetch(document.body.dataset.editUrl + '.choice', {
method: 'PUT',
body: new URLSearchParams(new FormData(elt.form))
})
.then(() => sleep(1))
.then(() => fetch(document.body.dataset.editUrl + '.result'))
.then(response => response.text())
.then(result => window.location.assign(resultUrl + result))
.catch(error => console.error('Error sending answer', error)))

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@
const sleep = (seconds) => new Promise(resolve => setTimeout(() => resolve(), seconds * 1000))

View File

@ -0,0 +1,118 @@
const propUrl = document.body.dataset.editUrl + '.prop'
preparePropertyEdition = (node) => node.dataset.old = node.innerText
updateProperty = (node) => {
if (node.dataset.old == node.innerText) return
const body = `${node.dataset.property}: ${node.innerText.trim()}`
if (!node.innerText && !node.value) node.parentNode.remove()
fetch(propUrl, { method: 'PUT', body: body })
.catch(error => console.error('Error editing property', error))
}
const pages = document.getElementById('pages')
prepareChoiceEdition = (node) => {
// Load list of pages from which authors can select results' page
if (node.list && !node.dataset.old && !pages.children.length)
fetch(`${editHost}pages.txt`, { cache: 'no-store' })
.then(pages => pages.text())
.then(pages => pages.split('\n')
.filter(line => line)
.map(line => `
<option data-title="${line.replace(/.*.md:title: /g, '')}"
data-url="${line.replace(/.md:title: .*/g, '')}">
${line.replace(/.*.md:title: /g, '')}
</option>`))
.then(options => pages.innerHTML += options.join(''))
.catch(error => console.error('Error getting pages list', error))
if (node.innerText || node.value)
node.dataset.old = (node.innerText || node.value).trim()
let newChoice = node.closest('.new_choice')
if (newChoice
&& (newChoice.querySelector('label.text').innerText
|| newChoice.querySelector('input[type=text]').value)) {
// Setup another new choice
newChoice = node.closest('form.ac_choices').appendChild(newChoice.cloneNode(true))
newChoice.querySelector('label.text').innerText = ''
newChoice.querySelector('input[type=text]').value = ''
setupChoiceEdition()
}
}
createChoice = (node) => {
if (node.nextSibling
&& (!node.querySelector('label.text').innerText
|| !node.querySelector('input[type=text]').value)) {
// Remove previously added new choice, which seems not required anymore
node.nextSibling.remove()
}
// Only creates the new choice if both "answer" and "destination" are filled
if (!node.querySelector('label.text').innerText || !node.querySelector('input[type=text]').value) return
updateChoice(node.querySelector('label.text'))
node.classList.remove('new_choice')
setupChoiceEdition()
}
createPage = (title) => {
// Page automatic creation, later there should be a mechanism to remove eventual orphans :)
option = pages.appendChild(document.createElement('option'))
option.dataset.title = title
option.dataset.url = uuid()
option.innerText = title
fetch(`${propUrl}/../${option.dataset.url}.prop`, { method: 'PUT', body: `title: ${title}` })
.catch(error => console.error('Error editing property', error))
return option
}
readPage = (node) => {
const title = node.querySelector('input[type=text]').value.trim()
let option = pages.querySelector(`option[data-title='${title}']`)
if (!option) {
option = createPage(title)
}
node.querySelector('a.gotoChoice').href = option.dataset.url
return `"[${node.querySelector('label.text').innerText.trim()}](${option.dataset.url})"`
}
updateChoice = (node) => {
if (node.dataset.old == (node.innerText || node.value)) return
const choice = node.closest('.ac_choice')
const index = Array.from(node.closest('form').children).indexOf(choice)
const body = `${node.dataset.property}[${index}]: ${readPage(choice)}`
fetch(propUrl, { method: 'PUT', body: body })
.catch(error => console.error('Error editing property', error))
}
deleteChoice = (node) => {
const choice = node.closest('.ac_choice')
const property = choice.querySelector('label').dataset.property
const index = Array.from(node.closest('form').children).indexOf(choice)
fetch(propUrl, { method: 'PUT', body: `${property}[${index}]: ` })
.catch(error => console.error('Error editing property', error))
choice.remove()
}
// Utility method
uuid = () => {
const temp_url = URL.createObjectURL(new Blob())
const uuid = temp_url.toString()
URL.revokeObjectURL(temp_url)
return uuid.substr(uuid.lastIndexOf('/') + 1) // remove prefix (e.g. blob:null/, blob:www.test.com/, ...)
}

View File

@ -0,0 +1,80 @@
document.body.dataset.editHost = window.location.protocol
+ '//edit.'
+ window.location.host
+ '/'
document.body.dataset.editUrl = document.body.dataset.editHost
+ file.replace('.md', '')
const topSection = window.location.pathname.split('/')[1]
if (topSection) document.body.classList.add(topSection)
// Differentiate users and authors
if ('pages' === topSection)
document.body.classList.add('author')
// Setup a "property" attribute, to send to the backend for insertion/update/deletion
document.querySelectorAll('body > header h1, main article header h1')
.forEach(node => node.dataset.property = 'title')
document.querySelectorAll('body > header > div > div > h2')
.forEach(node => node.dataset.property = 'description')
document.querySelectorAll('body [data-property]')
.forEach(node => {
node.contentEditable = true
node.onfocus = () => preparePropertyEdition(node)
node.onblur = () => updateProperty(node)
})
setupChoiceEdition = () => {
document.querySelectorAll('body.author .ac_choice label.text, body.author .ac_choice input[type=text]')
.forEach(node => {
node.contentEditable = true
node.dataset.property = `ac_choices`
node.onfocus = () => prepareChoiceEdition(node)
node.onblur = () => updateChoice(node)
node.removeAttribute('for')
})
document.querySelectorAll('body.author .new_choice label.text, body.author .new_choice input')
.forEach(node => node.onblur = () => createChoice(node.closest('div.ac_choice')))
document.querySelectorAll('body.author .ac_choice button.delete')
.forEach(node => node.onclick = () => deleteChoice(node))
window.getSelection().removeAllRanges()
const range = document.createRange()
}
document.addEventListener('paste', (e) => {
if (!e.isContentEditable) return
e.preventDefault()
const text = (e.originalEvent || e).clipboardData.getData('text/plain')
window.document.execCommand('insertText', false, text)
})
setupChoiceEdition()
tinymce.init({
browser_spellcheck: true,
entity_encoding: 'raw',
inline: true,
language: navigator.language,
language_url: '/js/langs/' + navigator.language + '.js',
menubar: false,
plugins: [ 'lists', 'advlist', 'autolink', 'link', 'image', 'media',
'charmap', 'insertdatetime', 'preview', 'table', 'fullscreen',
'searchreplace', 'insertdatetime', 'visualblocks', 'visualchars',
'wordcount', 'code', 'importcss' ],
init_instance_callback: (editor) => editor.on('blur', (e) => {
fetch(document.body.dataset.editUrl + '.content', {
method: 'PUT',
body: tinymce.activeEditor.getContent().replaceAll('<p>', '\n').replaceAll('</p>', '')
})
.catch(error => console.error('Error editing property', error))
}),
selector: '#content',
toolbar1: 'save cut copy paste | undo redo | image media charmap insertdatetime | searchreplace code visualblocks fullscreen',
toolbar2: 'removeformat bold italic strikethrough forecolor backcolor | bullist numlist outdent indent | alignleft aligncenter alignright alignjustify',
toolbar_mode: 'wrap'
})

View File

@ -0,0 +1,13 @@
create: Créer
update: Modifier
delete: Supprimer
pages:
create: Créer un nouveau chapitre
delete: Supprimer chapitre
users:
create: Créer un nouvel utilisateur
delete: Supprimer utilisateur
assets:
create: Transmettre une image
delete: 🗑

View File

@ -0,0 +1,47 @@
{{ define "main" }}
<article class="pa3 pa4-ns nested-copy-line-height">
<aside id="actions" class="w-30-l mt4-l fr tc">
{{ if eq .Section "assets" }}
<button class="br-pill pa3 pointer"><label for="file">{{ T (print .Section ".create") }}</label></button>
<input id="file" multiple name="file" type="file"/>
{{ else if .Parent.IsHome }}
<button id="create" class="br-pill pa3 pointer">{{ T (print .Section ".create") }}</button>
{{ else }}
<button id="delete" class="br-pill pa3 pointer">{{ T (print .Section ".delete") }}</button>
{{ end }}
</aside>
{{ with .Content }}
<section class="cf ph3 ph5-l pv3 pv4-l f4 tc-l center measure-wide lh-copy {{ $.Param "text_color" | default "mid-gray" }}">
{{- . -}}
</section>
{{ end }}
<section class="flex-ns flex-wrap justify-around">
{{ if .Params.sections }}
{{ range .Sections }}
<div class="relative w-100 w-30-l mb4 bg-white">
{{ .Render "summary-with-image" }}
</div>
{{ end }}
{{ else }}
{{ range (.Paginate .RegularPagesRecursive).Pages }}
<div class="relative w-100 mb4 bg-white">
{{ .Render "summary-with-image" }}
</div>
{{ end }}
{{- template "_internal/pagination.html" . -}}
{{ range .Resources }}
<div class="relative w-100 w-30-l mb4 bg-white">
<img src="{{ .RelPermalink }}" title="{{.}}" alt="{{.}}" />
{{ . }}
<button class="delete_image br-pill pa3 pointer" data-target="{{.RelPermalink}}">{{ T (print $.Section ".delete") }}</button>
</div>
</section>
{{ end }}
{{ end }}
</article>
{{ end }}

View File

@ -0,0 +1,16 @@
{{ define "main" }}
{{ $section := .Site.GetPage "section" .Section }}
<article class="flex-l flex-wrap justify-between mw8 center ph3">
<div class="nested-copy-line-height lh-copy {{ $.Param "post_content_classes" | default "serif"}} f4 nested-links {{ $.Param "text_color" | default "mid-gray" }} {{ cond (eq $.Site.Language.LanguageDirection "rtl") "pl4-l" "pr4-l" }} w-two-thirds-l">
<div id="content">{{- .Content -}}</div>
{{- partial "ac_choices.html" . -}}
{{- partial "tags.html" . -}}
</div>
<aside class="w-30-l mt6-l">
{{- partial "menu-contextual.html" . -}}
</aside>
</article>
{{ end }}

View File

@ -0,0 +1,41 @@
{{ $featured_image := partial "func/GetFeaturedImage.html" . }}
<article class="bb b--black-10">
<div class="db pa3-ns no-underline dark-gray">
<div class="flex flex-column flex-row-ns">
{{$.Site.Language.LanguageDirection}}
{{ if $featured_image }}
{{/* Trimming the slash and adding absURL make sure the image works no matter where our site lives */}}
<div class="mb4 mb0-ns w-100 w-40-ns {{ cond (eq $.Site.Language.LanguageDirection "rtl") "pl3-ns" "pr3-ns" }}">
<a href="{{.RelPermalink}}" class="db grow">
<img src="{{ $featured_image }}" class="img" alt="image from {{ .Title }}">
</a>
</div>
{{ end }}
<div class="blah w-100{{ if $featured_image }} w-60-ns{{ end }}">
{{ if .IsPage }}
{{ partial "breadcrumb" . }}
{{ end }}
{{ if .Date }}
<div class="f6">
{{ .Date | time.Format (default "Monday 2 January 2006" .Site.Params.date_format) }}
</div>
{{ end }}
<h1 class="f3 fw1 athelas mt0 lh-title">
<a href="{{.RelPermalink}}" class="color-inherit dim link">
{{ .Title }}
</a>
</h1>
<div class="f6 f5-l lh-copy nested-copy-line-height nested-links">
{{ .Summary }}
</div>
<a href="{{.RelPermalink}}" class="ba b--moon-gray bg-light-gray br2 color-inherit dib f7 hover-bg-moon-gray link mt2 ph2 pv1">
{{ $.Param "read_more_copy" | default (i18n "readMore") }}
</a>
{{/* TODO: add author
<p class="f6 lh-copy mv0">By {{ .Author }}</p> */}}
</div>
</div>
</div>
</article>

View File

@ -0,0 +1,16 @@
<div class="mb3 pa4 {{ $.Param "text_color" | default "mid-gray" }} overflow-hidden">
{{ partial "breadcrumb" . }}
{{ if .Date }}
<div class="f6">
{{ .Date | time.Format (default "January 2, 2006" .Site.Params.date_format) }}
</div>
{{ end }}
<h1 class="f3 near-black">
<a href="{{ .RelPermalink }}" class="link black dim">
{{ .Title }}
</a>
</h1>
<div class="nested-links f5 lh-copy nested-copy-line-height">
{{ .Summary }}
</div>
</div>

View File

@ -0,0 +1,19 @@
{{ define "header" }}
{{/* We can override any block in the baseof file be defining it in the template */}}
{{ partial "page-header.html" . }}
{{ end }}
{{ define "main" }}
<article class="cf ph3 ph5-l pv3 pv4-l f4 tc-l center measure-wide lh-copy {{ $.Param "text_color" | default "mid-gray" }}">
{{ .Content }}
</article>
<dl>
{{ range .Sections }}
<dt>
<a href="{{ .RelPermalink }}" class="link grow">{{ .Title }}</a>
</dt>
<dd>{{ add (len .Pages) (len .Resources) }}</dd>
{{ end }}
</dl>
{{ end }}

View File

@ -0,0 +1,44 @@
{{ $user := eq .Section "users" }}
{{ $values := (dict "choices" .Params.ac_choices "results" .Params.ac_choice_results) }}
<form class="ac_choices">
{{ range $index, $choice := $values.choices }}
{{ $text := $choice | markdownify | plainify }}
<div class="ac_choice">
<input id="elt_{{$index}}" name="ac_choice" required type="radio" value="{{$index}}" />
<label class="text" for="elt_{{$index}}">{{$text | htmlUnescape}}</label>
{{ if not $user }}
<div class="destination">
<label for="destination_{{$index}}"></label>
{{ with $.GetPage (substr (index (split $choice "]") 1) 1 -1) }}
<a class="gotoChoice" href="{{.RelPermalink}}"></a>
<input id="destination_{{$index}}"
list="pages"
name="destination"
type="text"
value="{{.Title}}" />
{{ end }}
<button class="delete" type="button">🗑</button>
</div>
{{ end }}
</div>
{{ end }}
{{ if not $user }}
<div class="ac_choice new_choice">
<input id="elt_" name="ac_choice" type="radio" />
<label class="text" for="elt_" placeholder="Nouveau choix..."></label>
<div class="destination">
<label for="destination_"></label>
<a class="gotoChoice"></a>
<input id="destination_" list="pages" placeholder="Destination" type="text" />
<button class="delete" type="button">🗑</button>
</div>
</div>
{{ end }}
</form>
{{ if not $user }}
<datalist id="pages"></datalist>
{{ end }}

View File

@ -0,0 +1,11 @@
<ol class="nav navbar-nav breadcrumb">
{{ template "breadcrumbnav" (dict "p1" . "p2" .) }}
</ol>
{{ define "breadcrumbnav" }}
{{ if .p1.Parent }}
{{ template "breadcrumbnav" (dict "p1" .p1.Parent "p2" .p2 ) }}
{{ end }}
{{ if (and .p1.IsSection (not .p1.Parent.IsHome)) }}
<li><a href="{{ .p1.Permalink }}">{{ .p1.Title }}</a></li>
{{ end }}
{{ end }}

View File

@ -0,0 +1,29 @@
<script>const file = '{{ .File }}'</script>
<script defer
src="https://unpkg.com/tinymce@6.1.2/tinymce.js"
referrerpolicy="origin"></script>
{{ with resources.Get "js/misc.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}
{{ with resources.Get "js/setup.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}
{{ with resources.Get "js/author.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}
{{ with resources.Get "js/choice.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}
{{ with resources.Get "js/create.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}
{{ with resources.Get "js/prop.js" | minify | fingerprint }}
<script defer src="{{ .Permalink }}"></script>
{{ end }}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 109 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -0,0 +1,419 @@
tinymce.addI18n('fr',{
"Redo": "R\u00e9tablir",
"Undo": "Annuler",
"Cut": "Couper",
"Copy": "Copier",
"Paste": "Coller",
"Select all": "S\u00e9lectionner tout",
"New document": "Nouveau document",
"Ok": "OK",
"Cancel": "Annuler",
"Visual aids": "Aides visuelles",
"Bold": "Gras",
"Italic": "Italique",
"Underline": "Soulign\u00e9",
"Strikethrough": "Barr\u00e9",
"Superscript": "Exposant",
"Subscript": "Indice",
"Clear formatting": "Effacer la mise en forme",
"Align left": "Aligner \u00e0 gauche",
"Align center": "Centrer",
"Align right": "Aligner \u00e0 droite",
"Justify": "Justifier",
"Bullet list": "Liste \u00e0 puces",
"Numbered list": "Liste num\u00e9rot\u00e9e",
"Decrease indent": "R\u00e9duire le retrait",
"Increase indent": "Augmenter le retrait",
"Close": "Fermer",
"Formats": "Formats",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Votre navigateur ne supporte pas l\u2019acc\u00e8s direct au presse-papiers. Merci d'utiliser les raccourcis clavier Ctrl+X\/C\/V.",
"Headers": "En-t\u00eates",
"Header 1": "En-t\u00eate 1",
"Header 2": "En-t\u00eate 2",
"Header 3": "En-t\u00eate 3",
"Header 4": "En-t\u00eate 4",
"Header 5": "En-t\u00eate 5",
"Header 6": "En-t\u00eate 6",
"Headings": "Titres",
"Heading 1": "Titre\u00a01",
"Heading 2": "Titre\u00a02",
"Heading 3": "Titre\u00a03",
"Heading 4": "Titre\u00a04",
"Heading 5": "Titre\u00a05",
"Heading 6": "Titre\u00a06",
"Preformatted": "Pr\u00e9format\u00e9",
"Div": "Div",
"Pre": "Pre",
"Code": "Code",
"Paragraph": "Paragraphe",
"Blockquote": "Blockquote",
"Inline": "En ligne",
"Blocks": "Blocs",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Le presse-papiers est maintenant en mode \"texte plein\". Les contenus seront coll\u00e9s sans retenir les formatages jusqu'\u00e0 ce que vous d\u00e9sactiviez cette option.",
"Fonts": "Polices",
"Font Sizes": "Tailles de police",
"Class": "Classe",
"Browse for an image": "Rechercher une image",
"OR": "OU",
"Drop an image here": "D\u00e9poser une image ici",
"Upload": "T\u00e9l\u00e9charger",
"Block": "Bloc",
"Align": "Aligner",
"Default": "Par d\u00e9faut",
"Circle": "Cercle",
"Disc": "Disque",
"Square": "Carr\u00e9",
"Lower Alpha": "Alpha minuscule",
"Lower Greek": "Grec minuscule",
"Lower Roman": "Romain minuscule",
"Upper Alpha": "Alpha majuscule",
"Upper Roman": "Romain majuscule",
"Anchor...": "Ancre...",
"Name": "Nom",
"Id": "Id",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'Id doit commencer par une lettre suivi par des lettres, nombres, tirets, points, deux-points ou underscores",
"You have unsaved changes are you sure you want to navigate away?": "Vous avez des modifications non enregistr\u00e9es, \u00eates-vous s\u00fbr de quitter la page?",
"Restore last draft": "Restaurer le dernier brouillon",
"Special character...": "Caract\u00e8re sp\u00e9cial...",
"Source code": "Code source",
"Insert\/Edit code sample": "Ins\u00e9rer \/ modifier une exemple de code",
"Language": "Langue",
"Code sample...": "Exemple de code...",
"Color Picker": "S\u00e9lecteur de couleurs",
"R": "R",
"G": "V",
"B": "B",
"Left to right": "Gauche \u00e0 droite",
"Right to left": "Droite \u00e0 gauche",
"Emoticons...": "\u00c9motic\u00f4nes...",
"Metadata and Document Properties": "M\u00e9tadonn\u00e9es et propri\u00e9t\u00e9s du document",
"Title": "Titre",
"Keywords": "Mots-cl\u00e9s",
"Description": "Description",
"Robots": "Robots",
"Author": "Auteur",
"Encoding": "Encodage",
"Fullscreen": "Plein \u00e9cran",
"Action": "Action",
"Shortcut": "Raccourci",
"Help": "Aide",
"Address": "Adresse",
"Focus to menubar": "Cibler la barre de menu",
"Focus to toolbar": "Cibler la barre d'outils",
"Focus to element path": "Cibler le chemin vers l'\u00e9l\u00e9ment",
"Focus to contextual toolbar": "Cibler la barre d'outils contextuelle",
"Insert link (if link plugin activated)": "Ins\u00e9rer un lien (si le module link est activ\u00e9)",
"Save (if save plugin activated)": "Enregistrer (si le module save est activ\u00e9)",
"Find (if searchreplace plugin activated)": "Rechercher (si le module searchreplace est activ\u00e9)",
"Plugins installed ({0}):": "Modules install\u00e9s ({0}) : ",
"Premium plugins:": "Modules premium :",
"Learn more...": "En savoir plus...",
"You are using {0}": "Vous utilisez {0}",
"Plugins": "Plugins",
"Handy Shortcuts": "Raccourcis utiles",
"Horizontal line": "Ligne horizontale",
"Insert\/edit image": "Ins\u00e9rer\/modifier une image",
"Image description": "Description de l'image",
"Source": "Source",
"Dimensions": "Dimensions",
"Constrain proportions": "Conserver les proportions",
"General": "G\u00e9n\u00e9ral",
"Advanced": "Avanc\u00e9",
"Style": "Style",
"Vertical space": "Espacement vertical",
"Horizontal space": "Espacement horizontal",
"Border": "Bordure",
"Insert image": "Ins\u00e9rer une image",
"Image...": "Image...",
"Image list": "Liste d'images",
"Rotate counterclockwise": "Rotation anti-horaire",
"Rotate clockwise": "Rotation horaire",
"Flip vertically": "Retournement vertical",
"Flip horizontally": "Retournement horizontal",
"Edit image": "Modifier l'image",
"Image options": "Options de l'image",
"Zoom in": "Zoomer",
"Zoom out": "D\u00e9zoomer",
"Crop": "Rogner",
"Resize": "Redimensionner",
"Orientation": "Orientation",
"Brightness": "Luminosit\u00e9",
"Sharpen": "Affiner",
"Contrast": "Contraste",
"Color levels": "Niveaux de couleur",
"Gamma": "Gamma",
"Invert": "Inverser",
"Apply": "Appliquer",
"Back": "Retour",
"Insert date\/time": "Ins\u00e9rer date\/heure",
"Date\/time": "Date\/heure",
"Insert\/Edit Link": "Ins\u00e9rer\/Modifier lien",
"Insert\/edit link": "Ins\u00e9rer\/modifier un lien",
"Text to display": "Texte \u00e0 afficher",
"Url": "Url",
"Open link in...": "Ouvrir le lien dans...",
"Current window": "Fen\u00eatre active",
"None": "n\/a",
"New window": "Nouvelle fen\u00eatre",
"Remove link": "Enlever le lien",
"Anchors": "Ancres",
"Link...": "Lien...",
"Paste or type a link": "Coller ou taper un lien",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre une adresse e-mail. Voulez-vous ajouter le pr\u00e9fixe mailto: n\u00e9cessaire?",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe http:\/\/ n\u00e9cessaire?",
"Link list": "Liste de liens",
"Insert video": "Ins\u00e9rer une vid\u00e9o",
"Insert\/edit video": "Ins\u00e9rer\/modifier une vid\u00e9o",
"Insert\/edit media": "Ins\u00e9rer\/modifier un m\u00e9dia",
"Alternative source": "Source alternative",
"Alternative source URL": "URL de la source alternative",
"Media poster (Image URL)": "Affiche de m\u00e9dia (URL de l'image)",
"Paste your embed code below:": "Collez votre code d'int\u00e9gration ci-dessous :",
"Embed": "Int\u00e9grer",
"Media...": "M\u00e9dia...",
"Nonbreaking space": "Espace ins\u00e9cable",
"Page break": "Saut de page",
"Paste as text": "Coller comme texte",
"Preview": "Pr\u00e9visualiser",
"Print...": "Imprimer...",
"Save": "Enregistrer",
"Find": "Chercher",
"Replace with": "Remplacer par",
"Replace": "Remplacer",
"Replace all": "Tout remplacer",
"Previous": "Pr\u00e9c\u00e9dente",
"Next": "Suiv",
"Find and replace...": "Trouver et remplacer...",
"Could not find the specified string.": "Impossible de trouver la cha\u00eene sp\u00e9cifi\u00e9e.",
"Match case": "Respecter la casse",
"Find whole words only": "Mot entier",
"Spell check": "V\u00e9rification de l'orthographe",
"Ignore": "Ignorer",
"Ignore all": "Tout ignorer",
"Finish": "Finie",
"Add to Dictionary": "Ajouter au dictionnaire",
"Insert table": "Ins\u00e9rer un tableau",
"Table properties": "Propri\u00e9t\u00e9s du tableau",
"Delete table": "Supprimer le tableau",
"Cell": "Cellule",
"Row": "Ligne",
"Column": "Colonne",
"Cell properties": "Propri\u00e9t\u00e9s de la cellule",
"Merge cells": "Fusionner les cellules",
"Split cell": "Diviser la cellule",
"Insert row before": "Ins\u00e9rer une ligne avant",
"Insert row after": "Ins\u00e9rer une ligne apr\u00e8s",
"Delete row": "Effacer la ligne",
"Row properties": "Propri\u00e9t\u00e9s de la ligne",
"Cut row": "Couper la ligne",
"Copy row": "Copier la ligne",
"Paste row before": "Coller la ligne avant",
"Paste row after": "Coller la ligne apr\u00e8s",
"Insert column before": "Ins\u00e9rer une colonne avant",
"Insert column after": "Ins\u00e9rer une colonne apr\u00e8s",
"Delete column": "Effacer la colonne",
"Cols": "Colonnes",
"Rows": "Lignes",
"Width": "Largeur",
"Height": "Hauteur",
"Cell spacing": "Espacement inter-cellulles",
"Cell padding": "Espacement interne cellule",
"Show caption": "Afficher le sous-titrage",
"Left": "Gauche",
"Center": "Centr\u00e9",
"Right": "Droite",
"Cell type": "Type de cellule",
"Scope": "Etendue",
"Alignment": "Alignement",
"H Align": "Alignement H",
"V Align": "Alignement V",
"Top": "Haut",
"Middle": "Milieu",
"Bottom": "Bas",
"Header cell": "Cellule d'en-t\u00eate",
"Row group": "Groupe de lignes",
"Column group": "Groupe de colonnes",
"Row type": "Type de ligne",
"Header": "En-t\u00eate",
"Body": "Corps",
"Footer": "Pied",
"Border color": "Couleur de la bordure",
"Insert template...": "Ins\u00e9rer un mod\u00e8le...",
"Templates": "Th\u00e8mes",
"Template": "Mod\u00e8le",
"Text color": "Couleur du texte",
"Background color": "Couleur d'arri\u00e8re-plan",
"Custom...": "Personnalis\u00e9...",
"Custom color": "Couleur personnalis\u00e9e",
"No color": "Aucune couleur",
"Remove color": "Supprimer la couleur",
"Table of Contents": "Table des mati\u00e8res",
"Show blocks": "Afficher les blocs",
"Show invisible characters": "Afficher les caract\u00e8res invisibles",
"Word count": "Nombre de mots",
"Count": "Total",
"Document": "Document",
"Selection": "S\u00e9lection",
"Words": "Mots",
"Words: {0}": "Mots : {0}",
"{0} words": "{0} mots",
"File": "Fichier",
"Edit": "Editer",
"Insert": "Ins\u00e9rer",
"View": "Voir",
"Format": "Format",
"Table": "Tableau",
"Tools": "Outils",
"Powered by {0}": "Propuls\u00e9 par {0}",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zone Texte Riche. Appuyer sur ALT-F9 pour le menu. Appuyer sur ALT-F10 pour la barre d'outils. Appuyer sur ALT-0 pour de l'aide.",
"Image title": "Titre d'image",
"Border width": "\u00c9paisseur de la bordure",
"Border style": "Style de la bordure",
"Error": "Erreur",
"Warn": "Avertir",
"Valid": "Valide",
"To open the popup, press Shift+Enter": "Pour ouvrir la popup, appuyez sur Maj+Entr\u00e9e",
"Rich Text Area. Press ALT-0 for help.": "Zone de texte riche. Appuyez sur ALT-0 pour l'aide.",
"System Font": "Police syst\u00e8me",
"Failed to upload image: {0}": "\u00c9chec d'envoi de l'image\u00a0: {0}",
"Failed to load plugin: {0} from url {1}": "\u00c9chec de chargement du plug-in\u00a0: {0} \u00e0 partir de l\u2019URL {1}",
"Failed to load plugin url: {0}": "\u00c9chec de chargement de l'URL du plug-in\u00a0: {0}",
"Failed to initialize plugin: {0}": "\u00c9chec d'initialisation du plug-in\u00a0: {0}",
"example": "exemple",
"Search": "Rechercher",
"All": "Tout",
"Currency": "Devise",
"Text": "Texte",
"Quotations": "Citations",
"Mathematical": "Op\u00e9rateurs math\u00e9matiques",
"Extended Latin": "Latin \u00e9tendu",
"Symbols": "Symboles",
"Arrows": "Fl\u00e8ches",
"User Defined": "D\u00e9fini par l'utilisateur",
"dollar sign": "Symbole dollar",
"currency sign": "Symbole devise",
"euro-currency sign": "Symbole euro",
"colon sign": "Symbole col\u00f3n",
"cruzeiro sign": "Symbole cruzeiro",
"french franc sign": "Symbole franc fran\u00e7ais",
"lira sign": "Symbole lire",
"mill sign": "Symbole milli\u00e8me",
"naira sign": "Symbole naira",
"peseta sign": "Symbole peseta",
"rupee sign": "Symbole roupie",
"won sign": "Symbole won",
"new sheqel sign": "Symbole nouveau ch\u00e9kel",
"dong sign": "Symbole dong",
"kip sign": "Symbole kip",
"tugrik sign": "Symbole tougrik",
"drachma sign": "Symbole drachme",
"german penny symbol": "Symbole pfennig",
"peso sign": "Symbole peso",
"guarani sign": "Symbole guarani",
"austral sign": "Symbole austral",
"hryvnia sign": "Symbole hryvnia",
"cedi sign": "Symbole cedi",
"livre tournois sign": "Symbole livre tournois",
"spesmilo sign": "Symbole spesmilo",
"tenge sign": "Symbole tenge",
"indian rupee sign": "Symbole roupie indienne",
"turkish lira sign": "Symbole lire turque",
"nordic mark sign": "Symbole du mark nordique",
"manat sign": "Symbole manat",
"ruble sign": "Symbole rouble",
"yen character": "Sinogramme Yen",
"yuan character": "Sinogramme Yuan",
"yuan character, in hong kong and taiwan": "Sinogramme Yuan, Hong Kong et Taiwan",
"yen\/yuan character variant one": "Sinogramme Yen\/Yuan, premi\u00e8re variante",
"Loading emoticons...": "Chargement des \u00e9motic\u00f4nes en cours...",
"Could not load emoticons": "\u00c9chec de chargement des \u00e9motic\u00f4nes",
"People": "Personnes",
"Animals and Nature": "Animaux & nature",
"Food and Drink": "Nourriture & boissons",
"Activity": "Activit\u00e9",
"Travel and Places": "Voyages & lieux",
"Objects": "Objets",
"Flags": "Drapeaux",
"Characters": "Caract\u00e8res",
"Characters (no spaces)": "Caract\u00e8res (espaces non compris)",
"{0} characters": "{0}\u00a0caract\u00e8res",
"Error: Form submit field collision.": "Erreur\u00a0: conflit de champs lors de la soumission du formulaire.",
"Error: No form element found.": "Erreur : aucun \u00e9l\u00e9ment de formulaire trouv\u00e9.",
"Update": "Mettre \u00e0 jour",
"Color swatch": "\u00c9chantillon de couleurs",
"Turquoise": "Turquoise",
"Green": "Vert",
"Blue": "Bleu",
"Purple": "Violet",
"Navy Blue": "Bleu marine",
"Dark Turquoise": "Turquoise fonc\u00e9",
"Dark Green": "Vert fonc\u00e9",
"Medium Blue": "Bleu moyen",
"Medium Purple": "Violet moyen",
"Midnight Blue": "Bleu de minuit",
"Yellow": "Jaune",
"Orange": "Orange",
"Red": "Rouge",
"Light Gray": "Gris clair",
"Gray": "Gris",
"Dark Yellow": "Jaune fonc\u00e9",
"Dark Orange": "Orange fonc\u00e9",
"Dark Red": "Rouge fonc\u00e9",
"Medium Gray": "Gris moyen",
"Dark Gray": "Gris fonc\u00e9",
"Light Green": "Vert clair",
"Light Yellow": "Jaune clair",
"Light Red": "Rouge clair",
"Light Purple": "Violet clair",
"Light Blue": "Bleu clair",
"Dark Purple": "Violet fonc\u00e9",
"Dark Blue": "Bleu fonc\u00e9",
"Black": "Noir",
"White": "Blanc",
"Switch to or from fullscreen mode": "Passer en ou quitter le mode plein \u00e9cran",
"Open help dialog": "Ouvrir la bo\u00eete de dialogue d'aide",
"history": "historique",
"styles": "styles",
"formatting": "mise en forme",
"alignment": "alignement",
"indentation": "retrait",
"permanent pen": "feutre ind\u00e9l\u00e9bile",
"comments": "commentaires",
"Format Painter": "Reproduire la mise en forme",
"Insert\/edit iframe": "Ins\u00e9rer\/modifier iframe",
"Capitalization": "Mise en majuscules",
"lowercase": "minuscule",
"UPPERCASE": "MAJUSCULE",
"Title Case": "Casse du titre",
"Permanent Pen Properties": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile",
"Permanent pen properties...": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile...",
"Font": "Police",
"Size": "Taille",
"More...": "Plus...",
"Spellcheck Language": "Langue du correcteur orthographique",
"Select...": "S\u00e9lectionner...",
"Preferences": "Pr\u00e9f\u00e9rences",
"Yes": "Oui",
"No": "Non",
"Keyboard Navigation": "Navigation au clavier",
"Version": "Version",
"Anchor": "Ancre",
"Special character": "Caract\u00e8res sp\u00e9ciaux",
"Code sample": "Extrait de code",
"Color": "Couleur",
"Emoticons": "Emotic\u00f4nes",
"Document properties": "Propri\u00e9t\u00e9 du document",
"Image": "Image",
"Insert link": "Ins\u00e9rer un lien",
"Target": "Cible",
"Link": "Lien",
"Poster": "Publier",
"Media": "M\u00e9dia",
"Print": "Imprimer",
"Prev": "Pr\u00e9c ",
"Find and replace": "Trouver et remplacer",
"Whole words": "Mots entiers",
"Spellcheck": "V\u00e9rification orthographique",
"Caption": "Titre",
"Insert template": "Ajouter un th\u00e8me"
});

View File

@ -0,0 +1,419 @@
tinymce.addI18n('fr',{
"Redo": "R\u00e9tablir",
"Undo": "Annuler",
"Cut": "Couper",
"Copy": "Copier",
"Paste": "Coller",
"Select all": "S\u00e9lectionner tout",
"New document": "Nouveau document",
"Ok": "OK",
"Cancel": "Annuler",
"Visual aids": "Aides visuelles",
"Bold": "Gras",
"Italic": "Italique",
"Underline": "Soulign\u00e9",
"Strikethrough": "Barr\u00e9",
"Superscript": "Exposant",
"Subscript": "Indice",
"Clear formatting": "Effacer la mise en forme",
"Align left": "Aligner \u00e0 gauche",
"Align center": "Centrer",
"Align right": "Aligner \u00e0 droite",
"Justify": "Justifier",
"Bullet list": "Liste \u00e0 puces",
"Numbered list": "Liste num\u00e9rot\u00e9e",
"Decrease indent": "R\u00e9duire le retrait",
"Increase indent": "Augmenter le retrait",
"Close": "Fermer",
"Formats": "Formats",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Votre navigateur ne supporte pas l\u2019acc\u00e8s direct au presse-papiers. Merci d'utiliser les raccourcis clavier Ctrl+X\/C\/V.",
"Headers": "En-t\u00eates",
"Header 1": "En-t\u00eate 1",
"Header 2": "En-t\u00eate 2",
"Header 3": "En-t\u00eate 3",
"Header 4": "En-t\u00eate 4",
"Header 5": "En-t\u00eate 5",
"Header 6": "En-t\u00eate 6",
"Headings": "Titres",
"Heading 1": "Titre\u00a01",
"Heading 2": "Titre\u00a02",
"Heading 3": "Titre\u00a03",
"Heading 4": "Titre\u00a04",
"Heading 5": "Titre\u00a05",
"Heading 6": "Titre\u00a06",
"Preformatted": "Pr\u00e9format\u00e9",
"Div": "Div",
"Pre": "Pre",
"Code": "Code",
"Paragraph": "Paragraphe",
"Blockquote": "Blockquote",
"Inline": "En ligne",
"Blocks": "Blocs",
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Le presse-papiers est maintenant en mode \"texte plein\". Les contenus seront coll\u00e9s sans retenir les formatages jusqu'\u00e0 ce que vous d\u00e9sactiviez cette option.",
"Fonts": "Polices",
"Font Sizes": "Tailles de police",
"Class": "Classe",
"Browse for an image": "Rechercher une image",
"OR": "OU",
"Drop an image here": "D\u00e9poser une image ici",
"Upload": "T\u00e9l\u00e9charger",
"Block": "Bloc",
"Align": "Aligner",
"Default": "Par d\u00e9faut",
"Circle": "Cercle",
"Disc": "Disque",
"Square": "Carr\u00e9",
"Lower Alpha": "Alpha minuscule",
"Lower Greek": "Grec minuscule",
"Lower Roman": "Romain minuscule",
"Upper Alpha": "Alpha majuscule",
"Upper Roman": "Romain majuscule",
"Anchor...": "Ancre...",
"Name": "Nom",
"Id": "Id",
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "L'Id doit commencer par une lettre suivi par des lettres, nombres, tirets, points, deux-points ou underscores",
"You have unsaved changes are you sure you want to navigate away?": "Vous avez des modifications non enregistr\u00e9es, \u00eates-vous s\u00fbr de quitter la page?",
"Restore last draft": "Restaurer le dernier brouillon",
"Special character...": "Caract\u00e8re sp\u00e9cial...",
"Source code": "Code source",
"Insert\/Edit code sample": "Ins\u00e9rer \/ modifier une exemple de code",
"Language": "Langue",
"Code sample...": "Exemple de code...",
"Color Picker": "S\u00e9lecteur de couleurs",
"R": "R",
"G": "V",
"B": "B",
"Left to right": "Gauche \u00e0 droite",
"Right to left": "Droite \u00e0 gauche",
"Emoticons...": "\u00c9motic\u00f4nes...",
"Metadata and Document Properties": "M\u00e9tadonn\u00e9es et propri\u00e9t\u00e9s du document",
"Title": "Titre",
"Keywords": "Mots-cl\u00e9s",
"Description": "Description",
"Robots": "Robots",
"Author": "Auteur",
"Encoding": "Encodage",
"Fullscreen": "Plein \u00e9cran",
"Action": "Action",
"Shortcut": "Raccourci",
"Help": "Aide",
"Address": "Adresse",
"Focus to menubar": "Cibler la barre de menu",
"Focus to toolbar": "Cibler la barre d'outils",
"Focus to element path": "Cibler le chemin vers l'\u00e9l\u00e9ment",
"Focus to contextual toolbar": "Cibler la barre d'outils contextuelle",
"Insert link (if link plugin activated)": "Ins\u00e9rer un lien (si le module link est activ\u00e9)",
"Save (if save plugin activated)": "Enregistrer (si le module save est activ\u00e9)",
"Find (if searchreplace plugin activated)": "Rechercher (si le module searchreplace est activ\u00e9)",
"Plugins installed ({0}):": "Modules install\u00e9s ({0}) : ",
"Premium plugins:": "Modules premium :",
"Learn more...": "En savoir plus...",
"You are using {0}": "Vous utilisez {0}",
"Plugins": "Plugins",
"Handy Shortcuts": "Raccourcis utiles",
"Horizontal line": "Ligne horizontale",
"Insert\/edit image": "Ins\u00e9rer\/modifier une image",
"Image description": "Description de l'image",
"Source": "Source",
"Dimensions": "Dimensions",
"Constrain proportions": "Conserver les proportions",
"General": "G\u00e9n\u00e9ral",
"Advanced": "Avanc\u00e9",
"Style": "Style",
"Vertical space": "Espacement vertical",
"Horizontal space": "Espacement horizontal",
"Border": "Bordure",
"Insert image": "Ins\u00e9rer une image",
"Image...": "Image...",
"Image list": "Liste d'images",
"Rotate counterclockwise": "Rotation anti-horaire",
"Rotate clockwise": "Rotation horaire",
"Flip vertically": "Retournement vertical",
"Flip horizontally": "Retournement horizontal",
"Edit image": "Modifier l'image",
"Image options": "Options de l'image",
"Zoom in": "Zoomer",
"Zoom out": "D\u00e9zoomer",
"Crop": "Rogner",
"Resize": "Redimensionner",
"Orientation": "Orientation",
"Brightness": "Luminosit\u00e9",
"Sharpen": "Affiner",
"Contrast": "Contraste",
"Color levels": "Niveaux de couleur",
"Gamma": "Gamma",
"Invert": "Inverser",
"Apply": "Appliquer",
"Back": "Retour",
"Insert date\/time": "Ins\u00e9rer date\/heure",
"Date\/time": "Date\/heure",
"Insert\/Edit Link": "Ins\u00e9rer\/Modifier lien",
"Insert\/edit link": "Ins\u00e9rer\/modifier un lien",
"Text to display": "Texte \u00e0 afficher",
"Url": "Url",
"Open link in...": "Ouvrir le lien dans...",
"Current window": "Fen\u00eatre active",
"None": "n\/a",
"New window": "Nouvelle fen\u00eatre",
"Remove link": "Enlever le lien",
"Anchors": "Ancres",
"Link...": "Lien...",
"Paste or type a link": "Coller ou taper un lien",
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre une adresse e-mail. Voulez-vous ajouter le pr\u00e9fixe mailto: n\u00e9cessaire?",
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL que vous avez entr\u00e9e semble \u00eatre un lien externe. Voulez-vous ajouter le pr\u00e9fixe http:\/\/ n\u00e9cessaire?",
"Link list": "Liste de liens",
"Insert video": "Ins\u00e9rer une vid\u00e9o",
"Insert\/edit video": "Ins\u00e9rer\/modifier une vid\u00e9o",
"Insert\/edit media": "Ins\u00e9rer\/modifier un m\u00e9dia",
"Alternative source": "Source alternative",
"Alternative source URL": "URL de la source alternative",
"Media poster (Image URL)": "Affiche de m\u00e9dia (URL de l'image)",
"Paste your embed code below:": "Collez votre code d'int\u00e9gration ci-dessous :",
"Embed": "Int\u00e9grer",
"Media...": "M\u00e9dia...",
"Nonbreaking space": "Espace ins\u00e9cable",
"Page break": "Saut de page",
"Paste as text": "Coller comme texte",
"Preview": "Pr\u00e9visualiser",
"Print...": "Imprimer...",
"Save": "Enregistrer",
"Find": "Chercher",
"Replace with": "Remplacer par",
"Replace": "Remplacer",
"Replace all": "Tout remplacer",
"Previous": "Pr\u00e9c\u00e9dente",
"Next": "Suiv",
"Find and replace...": "Trouver et remplacer...",
"Could not find the specified string.": "Impossible de trouver la cha\u00eene sp\u00e9cifi\u00e9e.",
"Match case": "Respecter la casse",
"Find whole words only": "Mot entier",
"Spell check": "V\u00e9rification de l'orthographe",
"Ignore": "Ignorer",
"Ignore all": "Tout ignorer",
"Finish": "Finie",
"Add to Dictionary": "Ajouter au dictionnaire",
"Insert table": "Ins\u00e9rer un tableau",
"Table properties": "Propri\u00e9t\u00e9s du tableau",
"Delete table": "Supprimer le tableau",
"Cell": "Cellule",
"Row": "Ligne",
"Column": "Colonne",
"Cell properties": "Propri\u00e9t\u00e9s de la cellule",
"Merge cells": "Fusionner les cellules",
"Split cell": "Diviser la cellule",
"Insert row before": "Ins\u00e9rer une ligne avant",
"Insert row after": "Ins\u00e9rer une ligne apr\u00e8s",
"Delete row": "Effacer la ligne",
"Row properties": "Propri\u00e9t\u00e9s de la ligne",
"Cut row": "Couper la ligne",
"Copy row": "Copier la ligne",
"Paste row before": "Coller la ligne avant",
"Paste row after": "Coller la ligne apr\u00e8s",
"Insert column before": "Ins\u00e9rer une colonne avant",
"Insert column after": "Ins\u00e9rer une colonne apr\u00e8s",
"Delete column": "Effacer la colonne",
"Cols": "Colonnes",
"Rows": "Lignes",
"Width": "Largeur",
"Height": "Hauteur",
"Cell spacing": "Espacement inter-cellulles",
"Cell padding": "Espacement interne cellule",
"Show caption": "Afficher le sous-titrage",
"Left": "Gauche",
"Center": "Centr\u00e9",
"Right": "Droite",
"Cell type": "Type de cellule",
"Scope": "Etendue",
"Alignment": "Alignement",
"H Align": "Alignement H",
"V Align": "Alignement V",
"Top": "Haut",
"Middle": "Milieu",
"Bottom": "Bas",
"Header cell": "Cellule d'en-t\u00eate",
"Row group": "Groupe de lignes",
"Column group": "Groupe de colonnes",
"Row type": "Type de ligne",
"Header": "En-t\u00eate",
"Body": "Corps",
"Footer": "Pied",
"Border color": "Couleur de la bordure",
"Insert template...": "Ins\u00e9rer un mod\u00e8le...",
"Templates": "Th\u00e8mes",
"Template": "Mod\u00e8le",
"Text color": "Couleur du texte",
"Background color": "Couleur d'arri\u00e8re-plan",
"Custom...": "Personnalis\u00e9...",
"Custom color": "Couleur personnalis\u00e9e",
"No color": "Aucune couleur",
"Remove color": "Supprimer la couleur",
"Table of Contents": "Table des mati\u00e8res",
"Show blocks": "Afficher les blocs",
"Show invisible characters": "Afficher les caract\u00e8res invisibles",
"Word count": "Nombre de mots",
"Count": "Total",
"Document": "Document",
"Selection": "S\u00e9lection",
"Words": "Mots",
"Words: {0}": "Mots : {0}",
"{0} words": "{0} mots",
"File": "Fichier",
"Edit": "Editer",
"Insert": "Ins\u00e9rer",
"View": "Voir",
"Format": "Format",
"Table": "Tableau",
"Tools": "Outils",
"Powered by {0}": "Propuls\u00e9 par {0}",
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Zone Texte Riche. Appuyer sur ALT-F9 pour le menu. Appuyer sur ALT-F10 pour la barre d'outils. Appuyer sur ALT-0 pour de l'aide.",
"Image title": "Titre d'image",
"Border width": "\u00c9paisseur de la bordure",
"Border style": "Style de la bordure",
"Error": "Erreur",
"Warn": "Avertir",
"Valid": "Valide",
"To open the popup, press Shift+Enter": "Pour ouvrir la popup, appuyez sur Maj+Entr\u00e9e",
"Rich Text Area. Press ALT-0 for help.": "Zone de texte riche. Appuyez sur ALT-0 pour l'aide.",
"System Font": "Police syst\u00e8me",
"Failed to upload image: {0}": "\u00c9chec d'envoi de l'image\u00a0: {0}",
"Failed to load plugin: {0} from url {1}": "\u00c9chec de chargement du plug-in\u00a0: {0} \u00e0 partir de l\u2019URL {1}",
"Failed to load plugin url: {0}": "\u00c9chec de chargement de l'URL du plug-in\u00a0: {0}",
"Failed to initialize plugin: {0}": "\u00c9chec d'initialisation du plug-in\u00a0: {0}",
"example": "exemple",
"Search": "Rechercher",
"All": "Tout",
"Currency": "Devise",
"Text": "Texte",
"Quotations": "Citations",
"Mathematical": "Op\u00e9rateurs math\u00e9matiques",
"Extended Latin": "Latin \u00e9tendu",
"Symbols": "Symboles",
"Arrows": "Fl\u00e8ches",
"User Defined": "D\u00e9fini par l'utilisateur",
"dollar sign": "Symbole dollar",
"currency sign": "Symbole devise",
"euro-currency sign": "Symbole euro",
"colon sign": "Symbole col\u00f3n",
"cruzeiro sign": "Symbole cruzeiro",
"french franc sign": "Symbole franc fran\u00e7ais",
"lira sign": "Symbole lire",
"mill sign": "Symbole milli\u00e8me",
"naira sign": "Symbole naira",
"peseta sign": "Symbole peseta",
"rupee sign": "Symbole roupie",
"won sign": "Symbole won",
"new sheqel sign": "Symbole nouveau ch\u00e9kel",
"dong sign": "Symbole dong",
"kip sign": "Symbole kip",
"tugrik sign": "Symbole tougrik",
"drachma sign": "Symbole drachme",
"german penny symbol": "Symbole pfennig",
"peso sign": "Symbole peso",
"guarani sign": "Symbole guarani",
"austral sign": "Symbole austral",
"hryvnia sign": "Symbole hryvnia",
"cedi sign": "Symbole cedi",
"livre tournois sign": "Symbole livre tournois",
"spesmilo sign": "Symbole spesmilo",
"tenge sign": "Symbole tenge",
"indian rupee sign": "Symbole roupie indienne",
"turkish lira sign": "Symbole lire turque",
"nordic mark sign": "Symbole du mark nordique",
"manat sign": "Symbole manat",
"ruble sign": "Symbole rouble",
"yen character": "Sinogramme Yen",
"yuan character": "Sinogramme Yuan",
"yuan character, in hong kong and taiwan": "Sinogramme Yuan, Hong Kong et Taiwan",
"yen\/yuan character variant one": "Sinogramme Yen\/Yuan, premi\u00e8re variante",
"Loading emoticons...": "Chargement des \u00e9motic\u00f4nes en cours...",
"Could not load emoticons": "\u00c9chec de chargement des \u00e9motic\u00f4nes",
"People": "Personnes",
"Animals and Nature": "Animaux & nature",
"Food and Drink": "Nourriture & boissons",
"Activity": "Activit\u00e9",
"Travel and Places": "Voyages & lieux",
"Objects": "Objets",
"Flags": "Drapeaux",
"Characters": "Caract\u00e8res",
"Characters (no spaces)": "Caract\u00e8res (espaces non compris)",
"{0} characters": "{0}\u00a0caract\u00e8res",
"Error: Form submit field collision.": "Erreur\u00a0: conflit de champs lors de la soumission du formulaire.",
"Error: No form element found.": "Erreur : aucun \u00e9l\u00e9ment de formulaire trouv\u00e9.",
"Update": "Mettre \u00e0 jour",
"Color swatch": "\u00c9chantillon de couleurs",
"Turquoise": "Turquoise",
"Green": "Vert",
"Blue": "Bleu",
"Purple": "Violet",
"Navy Blue": "Bleu marine",
"Dark Turquoise": "Turquoise fonc\u00e9",
"Dark Green": "Vert fonc\u00e9",
"Medium Blue": "Bleu moyen",
"Medium Purple": "Violet moyen",
"Midnight Blue": "Bleu de minuit",
"Yellow": "Jaune",
"Orange": "Orange",
"Red": "Rouge",
"Light Gray": "Gris clair",
"Gray": "Gris",
"Dark Yellow": "Jaune fonc\u00e9",
"Dark Orange": "Orange fonc\u00e9",
"Dark Red": "Rouge fonc\u00e9",
"Medium Gray": "Gris moyen",
"Dark Gray": "Gris fonc\u00e9",
"Light Green": "Vert clair",
"Light Yellow": "Jaune clair",
"Light Red": "Rouge clair",
"Light Purple": "Violet clair",
"Light Blue": "Bleu clair",
"Dark Purple": "Violet fonc\u00e9",
"Dark Blue": "Bleu fonc\u00e9",
"Black": "Noir",
"White": "Blanc",
"Switch to or from fullscreen mode": "Passer en ou quitter le mode plein \u00e9cran",
"Open help dialog": "Ouvrir la bo\u00eete de dialogue d'aide",
"history": "historique",
"styles": "styles",
"formatting": "mise en forme",
"alignment": "alignement",
"indentation": "retrait",
"permanent pen": "feutre ind\u00e9l\u00e9bile",
"comments": "commentaires",
"Format Painter": "Reproduire la mise en forme",
"Insert\/edit iframe": "Ins\u00e9rer\/modifier iframe",
"Capitalization": "Mise en majuscules",
"lowercase": "minuscule",
"UPPERCASE": "MAJUSCULE",
"Title Case": "Casse du titre",
"Permanent Pen Properties": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile",
"Permanent pen properties...": "Propri\u00e9t\u00e9s du feutre ind\u00e9l\u00e9bile...",
"Font": "Police",
"Size": "Taille",
"More...": "Plus...",
"Spellcheck Language": "Langue du correcteur orthographique",
"Select...": "S\u00e9lectionner...",
"Preferences": "Pr\u00e9f\u00e9rences",
"Yes": "Oui",
"No": "Non",
"Keyboard Navigation": "Navigation au clavier",
"Version": "Version",
"Anchor": "Ancre",
"Special character": "Caract\u00e8res sp\u00e9ciaux",
"Code sample": "Extrait de code",
"Color": "Couleur",
"Emoticons": "Emotic\u00f4nes",
"Document properties": "Propri\u00e9t\u00e9 du document",
"Image": "Image",
"Insert link": "Ins\u00e9rer un lien",
"Target": "Cible",
"Link": "Lien",
"Poster": "Publier",
"Media": "M\u00e9dia",
"Print": "Imprimer",
"Prev": "Pr\u00e9c ",
"Find and replace": "Trouver et remplacer",
"Whole words": "Mots entiers",
"Spellcheck": "V\u00e9rification orthographique",
"Caption": "Titre",
"Insert template": "Ajouter un th\u00e8me"
});

15
themes/acoeur/theme.toml Executable file
View File

@ -0,0 +1,15 @@
# theme.toml template for a Hugo theme
# See https://github.com/spf13/hugoThemes#themetoml for an example
name = "acoeur Theme"
license = "AGPL"
licenselink = "https://github.com/theNewDynamic/gohugo-theme-ananke/blob/master/LICENSE.md"
description = "A theme the acoeur motor"
homepage = "https://github.com/theNewDynamic/gohugo-theme-ananke"
tags = ["website", "starter", "responsive", "Disqus", "blog", "Tachyons", "Multilingual", "Stackbit"]
features = ["posts", "shortcodes", "related content", "comments"]
min_version = "0.64.0"
[author]
name = "theNewDynamic"
homepage = "https://www.thenewdynamic.com/"

1
themes/ananke Submodule

@ -0,0 +1 @@
Subproject commit 5a8b531a7ce2f22eaa452ebab8325040982c9275

@ -1 +0,0 @@
Subproject commit f5cdf1f3a6ce58040dba752b684988e7251c2e37