diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..013f8f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vscode +__paycache__ +output +*.pyc diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0b72e41 --- /dev/null +++ b/Makefile @@ -0,0 +1,85 @@ +PY?=python3 +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + +SSH_HOST=localhost +SSH_PORT=22 +SSH_USER=root +SSH_TARGET_DIR=/var/www + + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +SERVER ?= "0.0.0.0" + +PORT ?= 0 +ifneq ($(PORT), 0) + PELICANOPTS += -p $(PORT) +endif + + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make devserver-global regenerate and serve on 0.0.0.0 ' + @echo ' make ssh_upload upload the web site via SSH ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +html: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +clean: + [ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)" + +regenerate: + "$(PELICAN)" -r "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +serve-global: + "$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) -b $(SERVER) + +devserver: + "$(PELICAN)" -lr "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS) + +devserver-global: + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -b 0.0.0.0 + +publish: + "$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS) + +ssh_upload: publish + scp -P $(SSH_PORT) -r "$(OUTPUTDIR)"/* "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --include tags --cvs-exclude --delete "$(OUTPUTDIR)"/ "$(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)" + + +.PHONY: html help clean regenerate serve serve-global devserver publish ssh_upload rsync_upload \ No newline at end of file diff --git a/content/pages/about.md b/content/pages/about.md new file mode 100644 index 0000000..23ee3f2 --- /dev/null +++ b/content/pages/about.md @@ -0,0 +1,12 @@ +title: About an Algoliterary Publishing House +slug: about + +Anaïs Berck is an alias that exists since September 2019. The name stands for a collaboration between humans, algorithms and trees. + +As a collective Anais Berck opens up a space in which human intelligence is explored in the company of plant intelligence and artificial intelligence. + +For this project, Anaïs Berck is represented by the human beings An Mertens, Guillaume Slizewicz, Gijs de Heij and Loren Britton, all members or friends of [Constant](https://constantvzw.org), the association for arts and media in Brussels; and of [Algolit](https://algolit.net), the artistic research group around text and free code. + +This research is initiated in June 2021, with An Mertens, Gijs de Heij and Loren Britton, during a three-week residency at Medialab Prado in Madrid (granted by the Vlaamse Overheid as part of their 'Digital Culture Residencies' program). It will be continued during one year with the support of a grant by [FRArt/Art & Recherche](http://www.art-recherche.be), in partnership with [ESA St-Luc Brussels](http://www.stluc-bruxelles-esa.be/), [ESA La Cambre Brussels](http://www.stluc-bruxelles-esa.be/), [Botanic Garden Meise](https://www.plantentuinmeise.be/en/home/), [Villa Empain](https://www.villaempain.com/), the [Royal Library of Belgium](https://www.kbr.be/en/) and the [Bibliothèque Nationale de France](https://www.bnf.fr/fr). + +Feel free to subscribe for more news: \ No newline at end of file diff --git a/content/pages/activities.md b/content/pages/activities.md new file mode 100644 index 0000000..d0d5feb --- /dev/null +++ b/content/pages/activities.md @@ -0,0 +1,4 @@ +title: activities +hidden: True + +--- \ No newline at end of file diff --git a/content/pages/algoliterary-works.md b/content/pages/algoliterary-works.md new file mode 100644 index 0000000..855293b --- /dev/null +++ b/content/pages/algoliterary-works.md @@ -0,0 +1,4 @@ +title: Algoliterary Works +hidden: True + +--- \ No newline at end of file diff --git a/content/pages/home.md b/content/pages/home.md new file mode 100644 index 0000000..e6ad497 --- /dev/null +++ b/content/pages/home.md @@ -0,0 +1,9 @@ +title: An Algoliterary Publishing House +slug: home +hidden: true + +This project by [Anaïs Berck](https://www.anaisberck.be/) proposes to explore the notion of a publishing house in which the authors are algorithms, presented with their contexts and codes; and in which the content of the books seeds with trees and nature. + +By putting the tree and its representations at the center of their works, and by welcoming algorithms not at the service of extracting resources or value towards a commercial objective, but for making kin with nature, these intelligences create narratives which speak about trees and also challenge colonial views of classification, methods of standardization, and might speak critically about the effects of dominant cultures. While doing so, they put trees at the center of the creation, and therefore decenter the perspective of the human being. + +The project looks into formal narratives generated by algorithms, question the form of the book as an object and authorial product, explore the concept of a ‘decolonial publishing house’ and experiment with the influence of ‘forest baths’ on the writing of code and the communication with trees. diff --git a/content/pages/oracle.md b/content/pages/oracle.md new file mode 100644 index 0000000..46b0387 --- /dev/null +++ b/content/pages/oracle.md @@ -0,0 +1,4 @@ +title: Oracle +hidden: True + +--- \ No newline at end of file diff --git a/content/pages/reader.md b/content/pages/reader.md new file mode 100644 index 0000000..3596a7c --- /dev/null +++ b/content/pages/reader.md @@ -0,0 +1,3 @@ +title: reader + +--- \ No newline at end of file diff --git a/content/pages/research-questions.md b/content/pages/research-questions.md new file mode 100644 index 0000000..0523dfb --- /dev/null +++ b/content/pages/research-questions.md @@ -0,0 +1,3 @@ +title: Research questions + +--- \ No newline at end of file diff --git a/pelicanconf.py b/pelicanconf.py new file mode 100644 index 0000000..ecb2a40 --- /dev/null +++ b/pelicanconf.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- # + +AUTHOR = 'Anaïs Berck' +SITENAME = 'An Algoliterary Publishing House' +SITEURL = '' + +PATH = 'content' + +TIMEZONE = 'Europe/Brussels' + +DEFAULT_LANG = 'en' + +# Feed generation is usually not desired when developing +FEED_ALL_ATOM = None +CATEGORY_FEED_ATOM = None +TRANSLATION_FEED_ATOM = None +AUTHOR_FEED_ATOM = None +AUTHOR_FEED_RSS = None + +# Blogroll +LINKS = (('Pelican', 'https://getpelican.com/'), + ('Python.org', 'https://www.python.org/'), + ('Jinja2', 'https://palletsprojects.com/p/jinja/'), + ('You can modify those links in your config file', '#'),) + +# Social widget +SOCIAL = (('You can add links in your config file', '#'), + ('Another social link', '#'),) + +DEFAULT_PAGINATION = False + +# Uncomment following line if you want document-relative URLs when developing +#RELATIVE_URLS = True + +THEME = 'theme' \ No newline at end of file diff --git a/publishconf.py b/publishconf.py new file mode 100644 index 0000000..5fdc7d2 --- /dev/null +++ b/publishconf.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- # + +# This file is only used if you use `make publish` or +# explicitly specify it as your config file. + +import os +import sys +sys.path.append(os.curdir) +from pelicanconf import * + +# If your site is available via HTTPS, make sure SITEURL begins with https:// +SITEURL = '' +RELATIVE_URLS = False + +FEED_ALL_ATOM = 'feeds/all.atom.xml' +CATEGORY_FEED_ATOM = 'feeds/{slug}.atom.xml' + +DELETE_OUTPUT_DIRECTORY = True + +# Following items are often useful when publishing + +#DISQUS_SITENAME = "" +#GOOGLE_ANALYTICS = "" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..fa95caf --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pelican diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..c68714e --- /dev/null +++ b/tasks.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- + +import os +import shlex +import shutil +import sys +import datetime + +from invoke import task +from invoke.main import program +from invoke.util import cd +from pelican import main as pelican_main +from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer +from pelican.settings import DEFAULT_CONFIG, get_settings_from_file + +OPEN_BROWSER_ON_SERVE = True +SETTINGS_FILE_BASE = 'pelicanconf.py' +SETTINGS = {} +SETTINGS.update(DEFAULT_CONFIG) +LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE) +SETTINGS.update(LOCAL_SETTINGS) + +CONFIG = { + 'settings_base': SETTINGS_FILE_BASE, + 'settings_publish': 'publishconf.py', + # Output path. Can be absolute or relative to tasks.py. Default: 'output' + 'deploy_path': SETTINGS['OUTPUT_PATH'], + # Remote server configuration + 'ssh_user': 'root', + 'ssh_host': 'localhost', + 'ssh_port': '22', + 'ssh_path': '/var/www', + # Host and port for `serve` + 'host': 'localhost', + 'port': 8000, +} + +@task +def clean(c): + """Remove generated files""" + if os.path.isdir(CONFIG['deploy_path']): + shutil.rmtree(CONFIG['deploy_path']) + os.makedirs(CONFIG['deploy_path']) + +@task +def build(c): + """Build local version of site""" + pelican_run('-s {settings_base}'.format(**CONFIG)) + +@task +def rebuild(c): + """`build` with the delete switch""" + pelican_run('-d -s {settings_base}'.format(**CONFIG)) + +@task +def regenerate(c): + """Automatically regenerate site upon file modification""" + pelican_run('-r -s {settings_base}'.format(**CONFIG)) + +@task +def serve(c): + """Serve site at http://$HOST:$PORT/ (default is localhost:8000)""" + + class AddressReuseTCPServer(RootedHTTPServer): + allow_reuse_address = True + + server = AddressReuseTCPServer( + CONFIG['deploy_path'], + (CONFIG['host'], CONFIG['port']), + ComplexHTTPRequestHandler) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + sys.stderr.write('Serving at {host}:{port} ...\n'.format(**CONFIG)) + server.serve_forever() + +@task +def reserve(c): + """`build`, then `serve`""" + build(c) + serve(c) + +@task +def preview(c): + """Build production version of site""" + pelican_run('-s {settings_publish}'.format(**CONFIG)) + +@task +def livereload(c): + """Automatically reload browser tab upon file modification.""" + from livereload import Server + + def cached_build(): + cmd = '-s {settings_base} -e CACHE_CONTENT=True LOAD_CONTENT_CACHE=True' + pelican_run(cmd.format(**CONFIG)) + + cached_build() + server = Server() + theme_path = SETTINGS['THEME'] + watched_globs = [ + CONFIG['settings_base'], + '{}/templates/**/*.html'.format(theme_path), + ] + + content_file_extensions = ['.md', '.rst'] + for extension in content_file_extensions: + content_glob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension) + watched_globs.append(content_glob) + + static_file_extensions = ['.css', '.js'] + for extension in static_file_extensions: + static_file_glob = '{0}/static/**/*{1}'.format(theme_path, extension) + watched_globs.append(static_file_glob) + + for glob in watched_globs: + server.watch(glob, cached_build) + + if OPEN_BROWSER_ON_SERVE: + # Open site in default browser + import webbrowser + webbrowser.open("http://{host}:{port}".format(**CONFIG)) + + server.serve(host=CONFIG['host'], port=CONFIG['port'], root=CONFIG['deploy_path']) + + +@task +def publish(c): + """Publish to production via rsync""" + pelican_run('-s {settings_publish}'.format(**CONFIG)) + c.run( + 'rsync --delete --exclude ".DS_Store" -pthrvz -c ' + '-e "ssh -p {ssh_port}" ' + '{} {ssh_user}@{ssh_host}:{ssh_path}'.format( + CONFIG['deploy_path'].rstrip('/') + '/', + **CONFIG)) + + +def pelican_run(cmd): + cmd += ' ' + program.core.remainder # allows to pass-through args to pelican + pelican_main(shlex.split(cmd)) \ No newline at end of file diff --git a/static/fonts/fira-mono/FiraMono-Bold.ttf b/theme/static/fonts/fira-mono/FiraMono-Bold.ttf similarity index 100% rename from static/fonts/fira-mono/FiraMono-Bold.ttf rename to theme/static/fonts/fira-mono/FiraMono-Bold.ttf diff --git a/static/fonts/fira-mono/FiraMono-Medium.ttf b/theme/static/fonts/fira-mono/FiraMono-Medium.ttf similarity index 100% rename from static/fonts/fira-mono/FiraMono-Medium.ttf rename to theme/static/fonts/fira-mono/FiraMono-Medium.ttf diff --git a/static/fonts/fira-mono/FiraMono-Regular.ttf b/theme/static/fonts/fira-mono/FiraMono-Regular.ttf similarity index 100% rename from static/fonts/fira-mono/FiraMono-Regular.ttf rename to theme/static/fonts/fira-mono/FiraMono-Regular.ttf diff --git a/static/fonts/fira-mono/OFL.txt b/theme/static/fonts/fira-mono/OFL.txt similarity index 100% rename from static/fonts/fira-mono/OFL.txt rename to theme/static/fonts/fira-mono/OFL.txt diff --git a/static/styles/reset.css b/theme/static/styles/reset.css similarity index 100% rename from static/styles/reset.css rename to theme/static/styles/reset.css diff --git a/static/styles/styles.css b/theme/static/styles/styles.css similarity index 100% rename from static/styles/styles.css rename to theme/static/styles/styles.css diff --git a/theme/templates/archives.html b/theme/templates/archives.html new file mode 100644 index 0000000..cd12950 --- /dev/null +++ b/theme/templates/archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Archives{% endblock %} + +{% block content %} +

Archives for {{ SITENAME }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+{% endblock %} diff --git a/theme/templates/article.html b/theme/templates/article.html new file mode 100644 index 0000000..c8c9a4f --- /dev/null +++ b/theme/templates/article.html @@ -0,0 +1,67 @@ +{% extends "base.html" %} +{% block html_lang %}{{ article.lang }}{% endblock %} + +{% block title %}{{ SITENAME }} - {{ article.title|striptags }}{% endblock %} + +{% block head %} + {{ super() }} + + {% import 'translations.html' as translations with context %} + {% if translations.entry_hreflang(article) %} + {{ translations.entry_hreflang(article) }} + {% endif %} + + {% if article.description %} + + {% endif %} + + {% for tag in article.tags %} + + {% endfor %} + +{% endblock %} + +{% block content %} +
+
+

+ {{ article.title }}

+ {% import 'translations.html' as translations with context %} + {{ translations.translations_for(article) }} +
+
+ + {% if article.modified %} + + {% endif %} + {% if article.authors %} +
+ By {% for author in article.authors %} + {{ author }} + {% endfor %} +
+ {% endif %} + {% if article.category %} +
+ Category: {{ article.category }} +
+ {% endif %} + {% if article.tags %} +
+ Tags: + {% for tag in article.tags %} + {{ tag }} + {% endfor %} +
+ {% endif %} +
+
+ {{ article.content }} +
+
+{% endblock %} diff --git a/theme/templates/author.html b/theme/templates/author.html new file mode 100644 index 0000000..a190194 --- /dev/null +++ b/theme/templates/author.html @@ -0,0 +1,8 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - Articles by {{ author }}{% endblock %} + +{% block content_title %} +

Articles by {{ author }}

+{% endblock %} + diff --git a/theme/templates/authors.html b/theme/templates/authors.html new file mode 100644 index 0000000..9aee5db --- /dev/null +++ b/theme/templates/authors.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Authors{% endblock %} + +{% block content %} +

Authors on {{ SITENAME }}

+ +{% endblock %} diff --git a/theme/templates/base.html b/theme/templates/base.html new file mode 100644 index 0000000..37f0c6e --- /dev/null +++ b/theme/templates/base.html @@ -0,0 +1,45 @@ + + + + {% block head %} + {% block title %}{{ SITENAME }}{% endblock title %} + + {% if FEED_ALL_ATOM %} + + {% endif %} + {% if FEED_ALL_RSS %} + + {% endif %} + {% if FEED_ATOM %} + + {% endif %} + {% if FEED_RSS %} + + {% endif %} + {% if CATEGORY_FEED_ATOM and category %} + + {% endif %} + {% if CATEGORY_FEED_RSS and category %} + + {% endif %} + {% if TAG_FEED_ATOM and tag %} + + {% endif %} + {% if TAG_FEED_RSS and tag %} + + {% endif %} + {% endblock head %} + + + + +
+ {% block content %} + {% endblock %} +
+ + + diff --git a/theme/templates/categories.html b/theme/templates/categories.html new file mode 100644 index 0000000..7999de4 --- /dev/null +++ b/theme/templates/categories.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Categories{% endblock %} + +{% block content %} +

Categories on {{ SITENAME }}

+ +{% endblock %} diff --git a/theme/templates/category.html b/theme/templates/category.html new file mode 100644 index 0000000..14d7ff0 --- /dev/null +++ b/theme/templates/category.html @@ -0,0 +1,8 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - {{ category }} category{% endblock %} + +{% block content_title %} +

Articles in the {{ category }} category

+{% endblock %} + diff --git a/theme/templates/gosquared.html b/theme/templates/gosquared.html new file mode 100644 index 0000000..49ccbbe --- /dev/null +++ b/theme/templates/gosquared.html @@ -0,0 +1,14 @@ +{% if GOSQUARED_SITENAME %} + +{% endif %} diff --git a/theme/templates/index.html b/theme/templates/index.html new file mode 100644 index 0000000..a8def79 --- /dev/null +++ b/theme/templates/index.html @@ -0,0 +1,108 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }}{%endblock%} + +{% block bodyclass %}home{% endblock %} + +{% block content %} +

An Algoliterary Publishing House

+

This project by Anaïs Berck proposes to explore the notion of a publishing house in which the authors are algorithms, presented with their contexts and codes; and in which the content of the books seeds with trees and nature.

+

By putting the tree and its representations at the center of their works, and by welcoming algorithms not at the service of extracting resources or value towards a commercial objective, but for making kin with nature, these intelligences create narratives which speak about trees and also challenge colonial views of classification, methods of standardization, and might speak critically about the effects of dominant cultures. While doing so, they put trees at the center of the creation, and therefore decenter the perspective of the human being.

+

The project looks into formal narratives generated by algorithms, question the form of the book as an object and authorial product, explore the concept of a ‘decolonial publishing house’ and experiment with the influence of ‘forest baths’ on the writing of code and the communication with trees.

+

Read more →

+{% endblock %} + +{% block sidebar %} +
+ +

Levenshtein Distance

+
+
Algorithm
+
Levenshtein Distance
+
Trees
+
eucaliptus + found species in Spanish on the internet
+
Humans
+
Julio Cortázar, Gijs de Heij, An Mertens
+
Language
+
Spanish
+
Published
+
2021
+
License
+
Collective Conditions for (re-)use (CC4r), June 2021
+
+ +
+
+

'The author of this book is the Levenhstein Distance algorithm, the subject is the eucalyptus tree in "Fama y eucalipto", an excerpt from Historias de Cronopios y de Famas by Julio Cortázar, published in 1962 by Editorial Minotauro. Levenshtein distance, edit distance or word distance is an algorithm that operates in spell checkers. It is the minimum number of operations required to transform one word into another. An operation can be an insertion, deletion or substitution of a character. The algorithm was an invention of Russian scientist Vladimir Levenshtein in 1965.

+
+
URL
+
http://anaisberck.tabakalera.eus/
+
Repository
+
https://gitlab.constantvzw.org/​anais_berck/​levenshtein-distance-lee-a-cortazar
+
With the support of
+
This book is a creation for ÁGORA / CEMENT / CÓDIGO, an online exhibition curated by Lekutan, within the programme of Komisario Berriak supported by Tabakalera in Donostia/San Sebastián, Spain.
+
Thanks to
+
Andrea Estankona, Jaime Munárriz, Esther Berdión
+
+
+
+ +

Paseo por arboles de madrid

+
+
Algorithm
+
Markov Chain
+
Trees
+
collection of trees in the neighbourhood of Barrio de Las Letras in Madrid, retrieved from Un Alcorque, un Arbol
+
Humans
+
Emilia Pardo Bazán, Benito Pérez Gáldos, Jaime Munárriz, Luis Morell, An Mertens, Eva Marina Gracia, Gijs de Heij, Ana Isabel Garrido Mártinez, Alfredo Calosci, Daniel Arribas Hedo
+
Language
+
Spanish
+
Published
+
In development
+
License
+
Collective Conditions for (re-)use (CC4r), June 2021
+
+ +
+
+

In this book, the Markov Chain algorithm simultaneously generates a poem and a walk along trees in the neighbourhood Las Letras in the centre of Madrid. Despite the impression that there are few trees in the neighbourhood, the algorithm counts 460 of them. Markov Chain was designed in 1906 by Andrey Markov, a Russian mathematician who died in 1992. This algorithm is at the basis of many softwares that generate spam. It is used for systems that describe a series of events that are interdependent. What happens depends only on the previous step. That is why Markov Chains are also called "memoryless".

+
+
URL
+
paseo-por-arboles.algoliterarypublishing.net
+
Repository
+
https://gitlab.constantvzw.org/​anais_berck/​paseo-por-arboles-de-madrid
+
With the support of
+
This book was created as part of the residency of Anaïs Berck in Medialab Prado in Madrid, granted by the Government of Flanders as part of their 'Residency Digital Culture' program. The creation happened in company of collaborators of Medialab Prado, who assisted to various workshops.
+
+
+
+ +

Grafted trees

+
+
Algorithm
+
Oulipo constraint 'Littérature définitionnelle'
+
Trees
+
collection of quotes about trees taken from onetreeplanted.org
+
Humans
+
Marcel Bénabou, Gijs de Heij, An Mertens and all the gardeners
+
Language
+
Spanish
+
Published
+
In development
+
License
+
Collective Conditions for (re-)use (CC4r), June 2021
+
+ +
+
+

'Grafted trees' takes quotes about trees from existing works. Each graft is defined by its gardener, who is present with a short biography scraped from Wikipedia. The reader chooses the amount of seasons the graft will grow. A random noun is picked and defined as a 'bud' from which a new branch grows by replacing the word by its definition. The algorithm is inspired by Oulipo's constraint of 'Littérature définitionnelle', invented by Marcel Bénabou in 1966: in a given phrase, one replaces every significant element (noun, adjective, verb, adverb) by one of its definitions in a given dictionary; one reiterates the operation on the newly received phrase, and again.

+
+
URL
+
grafted-trees.algoliterarypublishing.net
+
Repository
+
https://gitlab.constantvzw.org/​anais_berck/​grafting_trees
+
With the support of
+
This book was first shown as an installation in the exhibition Data Workers in Mundaneum, financed by Communauté Wallonie-Bruxelles/Arts Numériques; it was then published by Andreas Bülhoff as a pdf as part of the online magazine about digital literature sync (nr 37). The French version of the installation was part of the exhibition 'Littérature et Numérique' in La Maison du Livre in Brussels.
+
+
+{% endblock %} \ No newline at end of file diff --git a/theme/templates/page.html b/theme/templates/page.html new file mode 100644 index 0000000..d24cd6c --- /dev/null +++ b/theme/templates/page.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block html_lang %}{{ page.lang }}{% endblock %} + +{% block title %}{{ SITENAME }} - {{ page.title|striptags }}{%endblock%} + +{% block bodyclass %}{{ page.slug }}{% endblock %} + +{% block content %} +

{{ page.title }}

+ + {{ page.content }} + +

← Back

+{% endblock %} diff --git a/theme/templates/pagination.html b/theme/templates/pagination.html new file mode 100644 index 0000000..588f130 --- /dev/null +++ b/theme/templates/pagination.html @@ -0,0 +1,15 @@ +{% if DEFAULT_PAGINATION %} +{% set first_page = articles_paginator.page(1) %} +{% set last_page = articles_paginator.page(articles_paginator.num_pages) %} +

+ {% if articles_page.has_previous() %} + + « + {% endif %} + Page {{ articles_page.number }} / {{ articles_paginator.num_pages }} + {% if articles_page.has_next() %} + » + + {% endif %} +

+{% endif %} diff --git a/theme/templates/period_archives.html b/theme/templates/period_archives.html new file mode 100644 index 0000000..e1ddf62 --- /dev/null +++ b/theme/templates/period_archives.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - {{ period | reverse | join(' ') }} archives{% endblock %} + +{% block content %} +

Archives for {{ period | reverse | join(' ') }}

+ +
+{% for article in dates %} +
{{ article.locale_date }}
+
{{ article.title }}
+{% endfor %} +
+{% endblock %} diff --git a/theme/templates/tag.html b/theme/templates/tag.html new file mode 100644 index 0000000..9c95803 --- /dev/null +++ b/theme/templates/tag.html @@ -0,0 +1,7 @@ +{% extends "index.html" %} + +{% block title %}{{ SITENAME }} - {{ tag }} tag{% endblock %} + +{% block content_title %} +

Articles tagged with {{ tag }}

+{% endblock %} diff --git a/theme/templates/tags.html b/theme/templates/tags.html new file mode 100644 index 0000000..b90b0ac --- /dev/null +++ b/theme/templates/tags.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}{{ SITENAME }} - Tags{% endblock %} + +{% block content %} +

Tags for {{ SITENAME }}

+ +{% endblock %} diff --git a/theme/templates/translations.html b/theme/templates/translations.html new file mode 100644 index 0000000..f0e2478 --- /dev/null +++ b/theme/templates/translations.html @@ -0,0 +1,16 @@ +{% macro translations_for(article) %} +{% if article.translations %} +Translations: +{% for translation in article.translations %} +{{ translation.lang }} +{% endfor %} +{% endif %} +{% endmacro %} + +{% macro entry_hreflang(entry) %} +{% if entry.translations %} + {% for translation in entry.translations %} + + {% endfor %} +{% endif %} +{% endmacro %} diff --git a/theme/themes/static/fonts/fira-mono/FiraMono-Bold.ttf b/theme/themes/static/fonts/fira-mono/FiraMono-Bold.ttf new file mode 100644 index 0000000..db6f63f Binary files /dev/null and b/theme/themes/static/fonts/fira-mono/FiraMono-Bold.ttf differ diff --git a/theme/themes/static/fonts/fira-mono/FiraMono-Medium.ttf b/theme/themes/static/fonts/fira-mono/FiraMono-Medium.ttf new file mode 100644 index 0000000..892c124 Binary files /dev/null and b/theme/themes/static/fonts/fira-mono/FiraMono-Medium.ttf differ diff --git a/theme/themes/static/fonts/fira-mono/FiraMono-Regular.ttf b/theme/themes/static/fonts/fira-mono/FiraMono-Regular.ttf new file mode 100644 index 0000000..3910f17 Binary files /dev/null and b/theme/themes/static/fonts/fira-mono/FiraMono-Regular.ttf differ diff --git a/theme/themes/static/fonts/fira-mono/OFL.txt b/theme/themes/static/fonts/fira-mono/OFL.txt new file mode 100644 index 0000000..1ba1596 --- /dev/null +++ b/theme/themes/static/fonts/fira-mono/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/theme/themes/static/styles/reset.css b/theme/themes/static/styles/reset.css new file mode 100644 index 0000000..af94440 --- /dev/null +++ b/theme/themes/static/styles/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/theme/themes/static/styles/styles.css b/theme/themes/static/styles/styles.css new file mode 100644 index 0000000..9943a3d --- /dev/null +++ b/theme/themes/static/styles/styles.css @@ -0,0 +1,243 @@ +@font-face { + font-family: "Fira mono"; + src: url("../fonts/fira-mono/FiraMono-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "Fira mono"; + src: url("../fonts/fira-mono/FiraMono-Medium.ttf") format("truetype"); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: "Fira mono"; + src: url("../fonts/fira-mono/FiraMono-Bold.ttf") format("truetype"); + font-weight: 600; + font-style: bold; +} + +:root { + --line-height: 16pt; + --font-size: 11pt; +} + +html, body { + font-family: "Fira mono"; + font-size: var(--font-size); + line-height: var(--line-height); +} + +body { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: 1fr; + height: 100vh; + box-sizing: border-box; +} + +h1, h2 { + display: block; + letter-spacing: 0.25em; + font-weight: 500; +} + +h1 { + margin-bottom: var(--line-height); +} + +h2 { + letter-spacing: .05em; + text-decoration: underline; + cursor: pointer; +} + +p { + max-width: 80ch; + margin-bottom: var(--line-height); +} + +main { + grid-column: 1; + padding: var(--line-height) calc(3 * var(--line-height)) var(--line-height) var(--line-height); + overflow-y: auto; +} + +main { + border-right: 1px solid black; +} + +aside { + grid-column: 2; + overflow-y: auto; +} + +summary { + padding: calc(.5 * var(--line-height)) 0; + list-style: none; + border: none; + outline: none; +} + +.read-online-link { + letter-spacing: .1em; +} + +dd.read-online-link { + margin-top: calc(var(--line-height) * .425); +} + +dd.read-online-link a { + text-decoration-style: solid; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details { + border-bottom: 1px solid black; + padding: calc(.5 * var(--line-height)) calc(2.5 * var(--line-height)) calc(.5 * var(--line-height)) var(--line-height); +} + +details[open] { + padding-bottom: calc(2.5 * var(--line-height)); +} + +details[open] > summary { + margin-bottom: calc(var(--line-height) * .5); +} + +details + details { + margin-top: -1px; +} + +a { + color: currentColor; +} + +a:hover { + text-decoration: none; +} + +dl { + margin: var(--line-height) 0 0 0; + display: grid; + grid-template-columns: 15ch 1fr; + max-width: 80ch; + font-size: 85%; +} + +dl a { + text-decoration-style: dotted; +} + +summary dl { + margin-top: calc(var(--line-height) * .425); +} + +strong { + font-weight: 500; +} + +@media screen and (min-width: 601px) { + + summary::after { + content: "Show details ↓"; + font-size: 85%; + margin-top: calc(var(--line-height) * .425); + display: block; + cursor: pointer; + margin-left: 15ch; + } + + [open] > summary::after { + content: "Hide details ↑"; + } +} + +@media screen and (max-width: 600px) { + body { + display: block; + padding: var(--line-height) calc(2 * var(--line-height)) var(--line-height) var(--line-height); + height: initial; + box-sizing: border-box; + } + + main, aside { + padding: 0; + height: initial; + overflow-y: initial; + } + + main { + border-right: none; + } + + dl { + display: initial; + } + + dt { + margin-top: calc(var(--line-height) * .425); + } + + dt::after { + content: ':'; + } + + dt:empty::after { + content: ''; + } + + details, details[open] { + padding-left: calc(1 * var(--line-height)); + padding-right: calc(2 * var(--line-height)); + padding-bottom: var(--line-height); + border-bottom: 0; + border-top: 1px solid black; + margin-left: calc(-1 * var(--line-height)); + margin-right: calc(-2 * var(--line-height)); + } + + details { + max-height: 50vh; + position: relative; + overflow-y: hidden; + } + + details[open] { + max-height: initial; + } + + details:not([open]) summary::after { + display: block; + content: 'show details ↓'; + position: absolute; + bottom: 0px; + left: 0; + right: 0; + height: calc(3.5 * var(--line-height)); + z-index: 1; + background: linear-gradient(to bottom, rgba(255,255,255,0), rgba(255,255,255,1) calc(2 * var(--line-height))); + box-sizing: border-box; + font-size: 85%; + padding: calc(2 * var(--line-height)) 0 0 var(--line-height); + /* pointer-events: none; */ + } + + details[open]::after { + content: none; + } + + [open] > summary::after { + content: "Hide details ↑"; + font-size: 85%; + margin-top: calc(var(--line-height) * .85); + display: block; + cursor: pointer; + } + +} \ No newline at end of file