소스 검색

Merge pull request #2 from COPIM/main

merging main changes to joel branch
joel
Simon Bowie 1 년 전
부모
커밋
53d863a2b9
No account linked to committer's email address
29개의 변경된 파일268개의 추가작업 그리고 128개의 파일을 삭제
  1. +2
    -2
      .env.template
  2. +17
    -7
      README.md
  3. +4
    -4
      database_functions.sh
  4. +2
    -2
      nginx-conf/compendium.conf
  5. +18
    -15
      web/app/api.py
  6. +13
    -5
      web/app/book.py
  7. +9
    -3
      web/app/main.py
  8. +23
    -5
      web/app/practice.py
  9. +3
    -0
      web/app/relationships.py
  10. +4
    -0
      web/app/resources.py
  11. +4
    -0
      web/app/search.py
  12. BIN
      web/app/static/images/favicon-no_bg.png
  13. BIN
      web/app/static/images/favicon.png
  14. +52
    -0
      web/app/static/styles/main.css
  15. +5
    -1
      web/app/templates/about.html
  16. +4
    -4
      web/app/templates/api.html
  17. +7
    -6
      web/app/templates/base.html
  18. +1
    -1
      web/app/templates/book.html
  19. +6
    -6
      web/app/templates/index.html
  20. +1
    -5
      web/app/templates/resource.html
  21. +37
    -42
      web/app/templates/resources.html
  22. +10
    -5
      web/app/tool.py
  23. +11
    -13
      web/content/about.md
  24. +1
    -0
      web/content/books.md
  25. +29
    -0
      web/content/colophon.md
  26. +1
    -1
      web/content/home.md
  27. +1
    -0
      web/content/practices.md
  28. +1
    -0
      web/content/tools.md
  29. +2
    -1
      web/requirements.txt

+ 2
- 2
.env.template 파일 보기

@@ -5,11 +5,11 @@ FLASK_APP=app
FLASK_RUN_HOST=0.0.0.0
FLASK_DEBUG=
SECRET_KEY=
DATABASE_URL=mysql+pymysql://MYSQL_USER:MYSQL_PASSWORD@mariadb/toolkit
DATABASE_URL=mysql+pymysql://MYSQL_USER:MYSQL_PASSWORD@mariadb/compendium
SSL_SCHEME=

# MariaDB variables
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=toolkit
MYSQL_DATABASE=compendium
MYSQL_USER=flask
MYSQL_PASSWORD=

+ 17
- 7
README.md 파일 보기

@@ -1,16 +1,16 @@
One of the key deliverables for Work Package 6 of the COPIM project is "an online resource detailing opportunities for experimental book publishing". We've decided to put this together in the form of an online toolkit with details of software, practices, examples, and sensitivities that can be used for experimental publishing.
One of the key deliverables for Work Package 6 of the COPIM project is "an online resource detailing opportunities for experimental book publishing". We've decided to put this together in the form of an online compendium with details of software, practices, examples, and sensitivities that can be used for experimental publishing.

The ExPub Compendium will build on this review of tools to present a resource for a researcher, artist, or publisher looking to try experimental publishing. From our preliminary design discussions, we have plans to include not only software tools that can be used to do experimental publishing but examples of experimental publications, practices of experimental publishing, publishers who have done some form of experimental publishing, and sensitivities involved in experimental publishing.
The Experimental Publishing Compendium will build on this review of tools to present a resource for any researcher, artist, or publisher looking to try experimental publishing. This compendium includes not only software tools that can be used to do experimental publishing but practices of experimental publishing and examples of experimental publications.

## application structure

The ExPub Compendium is a Python application using the [Flask](https://flask.palletsprojects.com/en/2.2.x/) framework to render as a website and to provide functions around user authentication and login as well as retrieving data from the underlying database. The Flask framework uses a few HTML template pages to render different pages efficiently based on routes defined in Python files. These template pages use a fairly basic [Bootstrap 5](https://getbootstrap.com/) grid design which allows for responsive design using in-built CSS and HTML elements.
The Experimental Publishing Compendium is a Python application using the [Flask](https://flask.palletsprojects.com/en/2.2.x/) framework to render as a website and to provide functions around user authentication and login as well as retrieving data from the underlying database. The Flask framework uses a few HTML template pages to render different pages efficiently based on routes defined in Python files.

The database is a MariaDB SQL database with a basic structure of Resources, Relationships, and Users. Resources are divided into tools, practices, and books and the table contains fields for these various types of resources. Relationships defines the links between resources using the resource ID in the Resource table: these are rendered on the site as connections between, say, a tool and a practice. Users contains the site's users with basic details like email address and hashed password. This simple structure provides flexibility for displaying resources with filters and to illustrate the connections between various resources.

### RESTful API

The application has a simple RESTful API deployed using Marshmallow to define schemas based on the SQLAlchemy database models. It allows a simple JSON export of users (login required), tools, practices, and books.
The application has a simple RESTful API deployed using [Marshmallow](https://marshmallow.readthedocs.io/en/stable/index.html) to define schemas based on the SQLAlchemy database models. It allows a simple JSON export of users (login required), tools, practices, and books.

The API is relatively open and is available at ./api

@@ -42,9 +42,9 @@ To intially create the database and a database user:

Enter your root password as defined in .env.dev.

`CREATE DATABASE toolkit;`
`CREATE DATABASE compendium;`
`CREATE USER 'flask'@'%' IDENTIFIED BY '[PASSWORD]';`
`GRANT CREATE, INSERT, UPDATE, SELECT, DELETE ON toolkit.* TO 'flask'@'%';`
`GRANT CREATE, INSERT, UPDATE, SELECT, DELETE ON compendium.* TO 'flask'@'%';`

Restart the containers to allow Flask to build the database tables:

@@ -53,7 +53,7 @@ Restart the containers to allow Flask to build the database tables:

You can then use database_functions.sh and an SQL file to populate the database e.g.

`./database_functions -i ./db_imports/toolkit_db_20230112.sql`
`./database_functions -i ./db_imports/compendium_db_20230112.sql`

## database functions

@@ -70,3 +70,13 @@ To build the database tables run:
`docker exec -it python python`
`from app import db, create_app, models`
`db.create_all(app=create_app())`

## credits

Content in the Experimental Publishing Compendium is © 2022–2023 [COPIM](https://copim.ac.uk) and licensed under a [Creative Commons Attribution 4.0 International License (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/).

Book cover data is from the [Open Library Covers API](https://openlibrary.org/dev/docs/api/covers).

The Experimental Publishing Compendium's source code is available at [https://github.com/COPIM/expub_compendium](https://github.com/COPIM/expub_compendium) and is licensed under the [MIT License](https://github.com/COPIM/expub_compendium/blob/main/LICENSE).

The Experimental Publishing Compendium was developed by [Simon Bowie](https://simonxix.com) and designed by [Joel Galvez](https://www.joelgalvez.com/) and Martina Vanini.

+ 4
- 4
database_functions.sh 파일 보기

@@ -3,7 +3,7 @@
# @creation_date: 2022-11-02
# @license: The MIT License <https://opensource.org/licenses/MIT>
# @author: Simon Bowie <ad7588@coventry.ac.uk>
# @purpose: Runs database functions for the ExPub Compendium
# @purpose: Runs database functions for the Experimental Publishing Compendium
# @acknowledgements:
# https://www.redhat.com/sysadmin/arguments-options-bash-scripts

@@ -24,7 +24,7 @@ License()
Help()
{
# Display Help
echo "This script performs database functions for the ExPub Compendium"
echo "This script performs database functions for the Experimental Publishing Compendium"
echo
echo "Syntax: database_functions.sh [-l|h|e|i|c|v|d]"
echo "options:"
@@ -72,11 +72,11 @@ Drop_table()

# set variables
CONTAINER=mariadb
DATABASE=toolkit
DATABASE=compendium
USERNAME=xxxxxxxx
PASSWORD=xxxxxxxx
EXPORT_DIRECTORY="./db_exports"
EXPORT_SQL_FILENAME=toolkit_db_
EXPORT_SQL_FILENAME=compendium_db_
EXPORT_TXT_FILENAME=$2`date +"%Y%m%d"`

# error message for no flags

nginx-conf/toolkit.conf → nginx-conf/compendium.conf 파일 보기

@@ -1,4 +1,4 @@
upstream toolkit {
upstream compendium {
server web:5000;
}

@@ -7,7 +7,7 @@ server {
listen 80;

location / {
proxy_pass http://toolkit;
proxy_pass http://compendium;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

+ 18
- 15
web/app/api.py 파일 보기

@@ -11,17 +11,20 @@ from flask import Blueprint, render_template, request, flash, redirect, url_for,
from flask_login import login_required, current_user
from .models import Resource, User
from .schemas import UserSchema, ToolSchema, PracticeSchema, BookSchema
from .relationships import *
import pandas as pd
import json

api = Blueprint('api', __name__)

# function to get different types from the Resource database table
def get_resource_json(type):
resources = Resource.query.filter_by(type=type)
if (type=='tool'):
def get_resource_json(resource_type):
resources = Resource.query.filter_by(type=resource_type)
if (resource_type=='tool'):
resources_schema = ToolSchema(many=True)
elif (type=='practice'):
elif (resource_type=='practice'):
resources_schema = PracticeSchema(many=True)
elif (type=='book'):
elif (resource_type=='book'):
resources_schema = BookSchema(many=True)
result = resources_schema.dump(resources)
# return all rows as a JSON array of objects
@@ -37,7 +40,7 @@ def api_page():
# route for exporting all users in database
@api.route('/api/users')
@login_required
def get_users():
def get_users_json():
users = User.query.all()
users_schema = UserSchema(many=True)
result = users_schema.dump(users)
@@ -47,21 +50,21 @@ def get_users():

# route for exporting all tools in database
@api.route('/api/tools')
def get_tools():
type = 'tool'
output = get_resource_json(type)
def get_tools_json():
resource_type = 'tool'
output = get_resource_json(resource_type)
return output

# route for exporting all practices in database
@api.route('/api/practices')
def get_practices():
type = 'practice'
output = get_resource_json(type)
def get_practices_json():
resource_type = 'practice'
output = get_resource_json(resource_type)
return output

# route for exporting all books in database
@api.route('/api/books')
def get_books():
type = 'book'
output = get_resource_json(type)
def get_books_json():
resource_type = 'book'
output = get_resource_json(resource_type)
return output

+ 13
- 5
web/app/book.py 파일 보기

@@ -13,15 +13,21 @@ from .resources import *
from .relationships import *
from . import db
import os
from sqlalchemy.sql import func
import markdown

book = Blueprint('book', __name__)

# route for displaying all books in database
@book.route('/books')
def get_books():
# get introductory paragraph Markdown
with open('content/books.md', 'r') as f:
intro_text = f.read()
intro_text = markdown.markdown(intro_text)
view = request.args.get('view')
resource_type = 'book'
books_query = Resource.query.filter_by(type=resource_type)
books_query = Resource.query.filter_by(type=resource_type).order_by(func.random())
for key in request.args.keys():
if key != 'view':
if (key == 'practice' and request.args.get(key) != ''):
@@ -35,12 +41,14 @@ def get_books():
books = books_query.all()
# get number of books
count = len(books)
# reorder books by book name
books = sorted(books, key=lambda d: d.__dict__['name'].lower())
# render Markdown as HTML
for book in books:
book.description = markdown.markdown(book.description)
if view != 'list':
# append relationships to each book
append_relationships_multiple(books)
else:
# reorder books by book name
books = sorted(books, key=lambda d: d.__dict__['name'])
# get values for filters
# practices
practices_filter = Resource.query.filter_by(type='practice').with_entities(Resource.id, Resource.name).all()
@@ -48,7 +56,7 @@ def get_books():
year_filter = get_filter_values('year', resource_type)
# typology
typology_filter = get_filter_values('typology', resource_type)
return render_template('resources.html', resources=books, type=resource_type, practices_filter=practices_filter, year_filter=year_filter, typology_filter=typology_filter, count=count, view=view)
return render_template('resources.html', resources=books, type=resource_type, practices_filter=practices_filter, year_filter=year_filter, typology_filter=typology_filter, count=count, view=view, intro_text=intro_text)

# route for displaying a single book based on the ID in the database
@book.route('/books/<int:book_id>')

+ 9
- 3
web/app/main.py 파일 보기

@@ -28,6 +28,9 @@ def index():
resource_ids = tool_ids + practice_ids + book_ids
# get data for curated resources
curated = get_curated_resources(resource_ids)
# render Markdown as HTML
for resource in curated:
resource.description = markdown.markdown(resource.description)
with open('content/home.md', 'r') as f:
text = f.read()
text = markdown.markdown(text)
@@ -48,6 +51,9 @@ def test():
@main.route('/about')
def about():
with open('content/about.md', 'r') as f:
text = f.read()
text = markdown.markdown(text)
return render_template('about.html', text=text)
about_text = f.read()
about_text = markdown.markdown(about_text)
with open('content/colophon.md', 'r') as f:
colophon_text = f.read()
colophon_text = markdown.markdown(colophon_text)
return render_template('about.html', about_text=about_text, colophon_text=colophon_text)

+ 23
- 5
web/app/practice.py 파일 보기

@@ -14,23 +14,41 @@ from .relationships import *
from . import db
import os
import markdown
from sqlalchemy.sql import func
from sqlalchemy import or_

practice = Blueprint('practice', __name__)

# route for displaying all practices in database
@practice.route('/practices')
def get_practices():
# get introductory paragraph Markdown
with open('content/practices.md', 'r') as f:
intro_text = f.read()
intro_text = markdown.markdown(intro_text)
view = request.args.get('view')
practices = Resource.query.filter_by(type='practice').all()
practices = Resource.query.filter_by(type='practice').order_by(func.random())
# temporarily removing incomplete practices from main list
practices = Resource.query.filter(
or_(
Resource.id==53,
Resource.id==56,
Resource.id==59,
Resource.id==62,
Resource.id==63,
Resource.id==65,
Resource.id==66
))
# finalise the query
practices = practices.all()
# get number of practices
count = len(practices)
# reorder practices by practice name
practices = sorted(practices, key=lambda d: d.__dict__['name'].lower())
if view != 'list':
# append relationships to each practice
append_relationships_multiple(practices)
else:
# reorder practices by practice name
practices = sorted(practices, key=lambda d: d.__dict__['name'])
return render_template('resources.html', resources=practices, type='practice', count=count, view=view)
return render_template('resources.html', resources=practices, type='practice', count=count, view=view, intro_text=intro_text)

# route for displaying a single practice based on the ID in the database
@practice.route('/practices/<int:practice_id>')

+ 3
- 0
web/app/relationships.py 파일 보기

@@ -8,6 +8,7 @@
from .models import Resource
from .models import Relationship
from . import db
import markdown

# function to retrieve linked resources
def get_relationships(primary_id):
@@ -51,6 +52,8 @@ def append_relationships(resource):
else:
resource.__dict__['practices'].append(relationship)
elif relationship.type == 'book':
# render Markdown as HTML
relationship.description = markdown.markdown(relationship.description)
if 'books' not in resource.__dict__.keys():
resource.__dict__['books'] = []
resource.__dict__['books'].append(relationship)

+ 4
- 0
web/app/resources.py 파일 보기

@@ -16,6 +16,7 @@ from isbntools.app import *
import requests
import re
from sqlalchemy.sql import func
import markdown

# function to retrieve data about a single resource from the database
def get_resource(resource_id):
@@ -29,6 +30,9 @@ def get_full_resource(resource_id):
resource = get_resource(resource_id)
resource = append_relationships(resource)
if resource.type == 'book':
# render Markdown as HTML
resource.description = markdown.markdown(resource.description)
# get additional book metadata
book_data = get_book_data(resource.isbn)
if book_data:
resource.__dict__.update(book_data)

+ 4
- 0
web/app/search.py 파일 보기

@@ -9,6 +9,7 @@
from flask import Blueprint, render_template, request, flash, redirect, url_for
from .models import Resource
from sqlalchemy import or_
import markdown

search = Blueprint('search', __name__)

@@ -30,6 +31,9 @@ def basic_search():
Resource.isbn.ilike('%' + query + '%'),
Resource.typology.ilike('%' + query + '%'),
)).all()
# render Markdown as HTML
for result in results:
result.description = markdown.markdown(result.description)
return render_template('search.html', results=results)
else:
return redirect(url_for('main.index'))

BIN
web/app/static/images/favicon-no_bg.png 파일 보기

Before After
Width: 221  |  Height: 222  |  Size: 9.9KB

BIN
web/app/static/images/favicon.png 파일 보기

Before After
Width: 221  |  Height: 222  |  Size: 4.1KB

+ 52
- 0
web/app/static/styles/main.css 파일 보기

@@ -1114,6 +1114,10 @@ select {
gap: 1rem;
}

.facts a {
text-decoration: underline;
}

@media (min-width: 1024px) {

.facts {
@@ -1144,6 +1148,12 @@ h2,h3 {
hyphens: auto;
}

h2 {
font-family: 'ag-fett';
font-size: 1.5rem;
line-height: 1.1;
}

h3 {
font-family: 'ag-fett';
}
@@ -1611,4 +1621,46 @@ a.menuitem:hover {
.lg\:opacity-100 {
opacity: 1;
}
}

.sr-only{
position:absolute;
left:-10000px;
top:auto;
width:1px;
height:1px;
overflow:hidden;
}

#about {
display: inline-block;
width: 60%;
}

#colophon {
float: right;
width: 30%;
}

hr {
clear: both;
margin-bottom: 15%;
visibility: hidden;
}

blockquote {
background: #f9f9f9;
border-left: 10px solid #ccc;
margin: 1.5em 10px;
padding: 0.5em 10px;
}
blockquote:before {
color: #ccc;
font-size: 4em;
line-height: 0.1em;
margin-right: 0.25em;
vertical-align: -0.4em;
}
blockquote p {
display: inline;
}

+ 5
- 1
web/app/templates/about.html 파일 보기

@@ -3,7 +3,11 @@
{% block content %}

<div class="cell-margin text max-w-[65ch] lg:m-16 text-lg lg:text-xl">
{{ text|safe }}
{{ about_text|safe }}
</div>

<div id="colophon" class="cell-margin text">
{{ colophon_text | safe }}
</div>

{% endblock %}

+ 4
- 4
web/app/templates/api.html 파일 보기

@@ -1,18 +1,18 @@
{% block content %}

<a href="/api/users">Users</a> (login required)
<a href="{{ url_for('api.get_users_json') }}">Users</a> (login required)

<br><br>

<a href="/api/tools">Tools</a>
<a href="{{ url_for('api.get_tools_json') }}">Tools</a>

<br><br>

<a href="/api/practices">Practices</a>
<a href="{{ url_for('api.get_practices_json') }}">Practices</a>

<br><br>

<a href="/api/books">Books</a>
<a href="{{ url_for('api.get_books_json') }}">Books</a>

<br><br>


+ 7
- 6
web/app/templates/base.html 파일 보기

@@ -15,7 +15,7 @@
{% macro view_switch() %}

<div class="flex">
<a href="{{ request.base_url }}?view=regular{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"
<a href="{{ url_for(request.endpoint) }}?view=regular{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"
class="block link flex p-3 gap-2 {% if view != 'list' %} active {% endif %}">

<div class="w-5 h-5 inline-block">
@@ -24,12 +24,11 @@
<rect x="27" width="19" height="14" fill="black" />
<rect x="27" y="21" width="19" height="15" fill="black" />
</svg>

</div>

Expanded
</a>
<a href="{{ request.base_url }}?view=list{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"
<a href="{{ url_for(request.endpoint) }}?view=list{% for key in request.args %}{% if key != 'view' %}&{{ key }}={{ request.args.get(key) }}{% endif %}{% endfor %}"
class="block link flex p-3 gap-2 {% if view == 'list' %} active {% endif %}">
<div class="w-5 h-5 inline-block ">
<svg width="100%" height="100%" viewBox="0 0 38 36" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -109,7 +108,8 @@
</div> -->

<form action="{{ url_for('search.basic_search') }}" class="hidden lg:block">
<input type="text" name="query" class="text-center h-full text-base border-l-2 border-black pl-1"
<label id="search-label" for="siteSearch" class="sr-only">Search</label>
<input type="text" name="query" class="text-center h-full text-base border-l-2 border-black pl-1" aria-labelledby="search-label"
placeholder="Search" hx-get="{{ url_for('search.basic_search') }}"
hx-trigger="keyup changed delay:500ms, search" hx-target="main" hx-select="main">
<input class="hidden" type="submit" hidden />
@@ -279,7 +279,7 @@
{% endif %}

<div class="{% if size==1 %} big-text {% else %} small-text {% endif %} mb-[1em]">
{{ resource['description'] | truncate(150) }}
{{ resource['description'] | truncate(150) | safe }}
</div>

</a>
@@ -316,6 +316,8 @@
<script src="{{ url_for('static',filename='js/alpine.min.js') }}" defer></script>
<script src="{{ url_for('static',filename='js/htmx.min.js') }}"></script>
<link href="{{ url_for('static',filename='styles/main.css') }}" rel="stylesheet">
<link rel="shortcut icon" href="{{ url_for('static',filename='images/favicon-no_bg.png') }}" type="image/x-icon">
<link rel="icon" href="{{ url_for('static',filename='images/favicon-no_bg.png') }}" type="image/x-icon">
<script>
// htmx.on('htmx:beforeRequest', e=> {
// console.log(e)
@@ -439,7 +441,6 @@
</div>
</footer>
<!-- JavaScript -->
<!-- jQuery first, then Popper JS, then Bootstrap JS -->
<script src="{{ url_for('static',filename='js/main.js') }}"></script>
</body>


+ 1
- 1
web/app/templates/book.html 파일 보기

@@ -117,7 +117,7 @@
Experimental aspects:
</h3>
<div>
{{ resource['description'] }}
{{ resource['description']|safe }}
</div>
</div>
{% endif %}

+ 6
- 6
web/app/templates/index.html 파일 보기

@@ -15,13 +15,13 @@


{% if view == 'list' %}
{% for resource in resources %}
{{ resource_list(resource, loop, false) }}
{% endfor %}
{% for resource in resources %}
{{ resource_list(resource, loop, false) }}
{% endfor %}
{% else %}
{% for resource in resources %}
{{ resource_with_related(resource, loop, false) }}
{% endfor %}
{% for resource in resources %}
{{ resource_with_related(resource, loop, false) }}
{% endfor %}
{% endif %}

</div>

+ 1
- 5
web/app/templates/resource.html 파일 보기

@@ -112,14 +112,10 @@
{% endif %}
{% if resource['references'] %}
<div class="lg:col-span-2">
<h3> References </h3>
<h3> Further reading </h3>
<p>{{ resource['references']|safe }}</p>
</div>
{% endif %}
<div class="">
<h3>Created</h3>
{{ resource['created'].strftime("%Y-%m-%d %H:%M") }} UTC
</div>
</div>

</div>

+ 37
- 42
web/app/templates/resources.html 파일 보기

@@ -55,15 +55,11 @@

<div class="border-b-2 border-black grid lg:grid-cols-[52rem,30rem] content-start">
<div class="mx-4 lg:ml-[13rem] text my-4 lg:my-8 meta lg:max-w-[30rem]">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ultricies egestas felis at dignissim. Morbi ut
bibendum
nisl. Integer ac sollicitudin risus. Vivamus et est est. Ut vitae lacus nec justo tincidunt interdum. Fusce sapien
odio,
commodo nec est et, interdum varius risus. Curabitur vehicula consequat auctor.
{{ intro_text|safe }}
</div>
</div>

<form action="{{request.base_url}}" method="GET" hx-trigger="change" hx-push-url="true">
<form action="{{ url_for(request.endpoint )}}" method="GET" hx-trigger="change" hx-push-url="true">
<input type="hidden" name="view" value="{{ view }}">
<div
class="flex p-4 lg:p-0 flex-col items-start lg:items-center lg:flex-row lg:flex-wrap gap-2 lg:gap-4 min-h-[2rem] mb-8 border-b-2 border-black ">
@@ -71,42 +67,41 @@
<div class="-m-4 mb-4 lg:m-0">
{{ view_switch() }}
</div>


{% if practices_filter%}
{{ filter_dropdown('practice', practices_filter, 'Practices') }}
{% endif %}
{% if year_filter %}
{{ filter_dropdown_nokey('year', year_filter, 'Year') }}
{% endif %}
{% if typology_filter %}
{{ filter_dropdown_nokey('typology', typology_filter, 'Typologies') }}
{% endif %}
{% if languages_filter %}
{{ filter_dropdown_nokey('scriptingLanguage', languages_filter, 'Scripting languages') }}
{% endif %}
{% if licenses_filter %}
{{ filter_dropdown_nokey('license', licenses_filter, 'Licenses') }}
{% endif %}
{% if status_filter %}
{{ filter_dropdown_nokey('status', status_filter, 'Maintenance status') }}
{% endif %}

<a href="{{ request.base_url }}?view={{ view }}" class="block py-4 lg:py-0">Reset</a>

</div>

<div>
{% if view == 'list' %}
{% for resource in resources %}
{{ resource_list(resource, loop) }}
{% endfor %}
{% else %}
{% for resource in resources %}
{{ resource_with_related(resource, loop) }}
{% endfor %}
{% endif %}
</div>
{% if practices_filter%}
{{ filter_dropdown('practice', practices_filter, 'Practices') }}
{% endif %}
{% if year_filter %}
{{ filter_dropdown_nokey('year', year_filter, 'Year') }}
{% endif %}
{% if typology_filter %}
{{ filter_dropdown_nokey('typology', typology_filter, 'Typologies') }}
{% endif %}
{% if languages_filter %}
{{ filter_dropdown_nokey('scriptingLanguage', languages_filter, 'Scripting languages') }}
{% endif %}
{% if licenses_filter %}
{{ filter_dropdown_nokey('license', licenses_filter, 'Licenses') }}
{% endif %}
{% if status_filter %}
{{ filter_dropdown_nokey('status', status_filter, 'Maintenance status') }}
{% endif %}
<a href="{{ url_for(request.endpoint) }}?view={{ view }}">Reset</a>
</div>
<div>
{% if view == 'list' %}
{% for resource in resources %}
{{ resource_list(resource, loop) }}
{% endfor %}
{% else %}
{% for resource in resources %}
{{ resource_with_related(resource, loop) }}
{% endfor %}
{% endif %}
</div>

</form>


+ 10
- 5
web/app/tool.py 파일 보기

@@ -13,15 +13,21 @@ from .resources import *
from .relationships import *
from . import db
import os
from sqlalchemy.sql import func
import markdown

tool = Blueprint('tool', __name__)

# route for displaying all tools in database
@tool.route('/tools')
def get_tools():
# get introductory paragraph Markdown
with open('content/tools.md', 'r') as f:
intro_text = f.read()
intro_text = markdown.markdown(intro_text)
view = request.args.get('view')
resource_type = 'tool'
tools_query = Resource.query.filter_by(type=resource_type)
tools_query = Resource.query.filter_by(type=resource_type).order_by(func.random())
for key in request.args.keys():
if key != 'view':
if (key == 'practice' and request.args.get(key) != ''):
@@ -38,12 +44,11 @@ def get_tools():
tools = tools_query.all()
# get number of tools
count = len(tools)
# reorder tools by tools name
tools = sorted(tools, key=lambda d: d.__dict__['name'].lower())
if view != 'list':
# append relationships to each tool
append_relationships_multiple(tools)
else:
# reorder tools by tools name
tools = sorted(tools, key=lambda d: d.__dict__['name'])
# get values for filters
# practices
practices_filter = Resource.query.filter_by(type='practice').with_entities(Resource.id, Resource.name).all()
@@ -53,7 +58,7 @@ def get_tools():
languages_filter = get_filter_values('scriptingLanguage', resource_type)
# status
status_filter = get_filter_values('status', resource_type)
return render_template('resources.html', resources=tools, type=resource_type, practices_filter=practices_filter, licenses_filter=licenses_filter, languages_filter=languages_filter, status_filter=status_filter, count=count, view=view)
return render_template('resources.html', resources=tools, type=resource_type, practices_filter=practices_filter, licenses_filter=licenses_filter, languages_filter=languages_filter, status_filter=status_filter, count=count, view=view, intro_text=intro_text)

# route for displaying a single tool based on the ID in the database
@tool.route('/tools/<int:tool_id>')

+ 11
- 13
web/content/about.md 파일 보기

@@ -1,27 +1,25 @@
## Books Contain Multitudes: A Scholarly Compendium for Experimental Book Publishing.
## Books Contain Multitudes: A Scholarly Compendium for Experimental Book Publishing.

Scholars, publishers, infrastructure providers, developers, and librarians, are increasingly experimenting with alternative tools, practices, and formats for scholarly publishing. This field of work has been growing with the emergence of digital and open access publishing, yet those who want to experiment with the forms, practices, and systems of academic publishing still struggle to find appropriate publishers, tools, examples, and communities that can support their ventures. Others might simply become disillusioned, put off perhaps by the apparent disconnect between the desire to experiment with forms, media and formats of scholarly books and the unfamiliarity amongst scholars and publishers with the tools, technologies, and publishing and funding opportunities needed to do so. Furthermore, monograph publishing in the humanities has been embedded in an individual and competitive academic culture that, as Samuel Moore (2019) underlines, has a strong ordering effect on both academics and the way in which they publish: “projects are undertaken with specific publication formats in mind; journal choice is frequently determined by how well regarded they are by assessment panels; and there is an informal hierarchy of certain kinds of academic publication, from the monograph at the top down to co-authored works and book chapters in edited volumes towards the bottom” (41).
Scholars, publishers, infrastructure providers, developers, and librarians, are increasingly experimenting with alternative tools, practices, and formats for scholarly publishing. This field of work has been growing with the emergence of digital and open access publishing, yet those who want to experiment with the forms, practices, and systems of academic publishing still struggle to find appropriate publishers, tools, examples, and communities that can support their ventures. Others might simply become disillusioned, put off perhaps by the apparent disconnect between the desire to experiment with the forms, media, and formats of scholarly books and the unfamiliarity amongst scholars and publishers with the tools, technologies, and funding opportunities needed to do so. Furthermore, monograph publishing in the humanities has been embedded in an individual and competitive academic culture that, as Samuel Moore (2019) underlines, has a strong ordering effect on both academics and the way in which they publish: “projects are undertaken with specific publication formats in mind; journal choice is frequently determined by how well regarded they are by assessment panels; and there is an informal hierarchy of certain kinds of academic publication, from the monograph at the top down to co-authored works and book chapters in edited volumes towards the bottom” (41).

Having worked on experimental book publishing as part of a community of researchers, authors, developers, editors, librarians and publishers collaborating in the framework of the COPIM project, we compiled this compendium to address this gap. The compendium is based on and expands from two reports we developed within COPIM's Experimental Publishing Group. We want the compendium to act as a guide and reference for both experienced practitioners and those just setting out to experiment with the form, content, and practices of scholarly bookmaking. The compendium includes experiments with the form and format of the scholarly book; with the various (multi)media we can publish long-form research in; and with how people produce, disseminate, consume, review, reuse, interact with and form communities around books. Far from being merely a formal exercise, **experimental publishing as we conceive it here also reimagines the relationalities that constitute scholarly writing, research, and publishing.** Books, after all, validate what counts as research and materialise how scholarly knowledge production is organised. The linked entries in this compendium may inspire speculations on the future of the book and the humanities more in general and encourage publishers and authors to explore publications beyond the standard printed codex format.
Having worked on experimental book publishing as part of a community of researchers, authors, developers, editors, librarians and publishers collaborating in the framework of COPIM — the Community-led Open Publication Infrastructures for Monographs project, we compiled this compendium to address this gap. The compendium is based on and expands from [two](https://copim.pubpub.org/books-contain-multitudes-exploring-experimental-publishing-2022-update) [reports](https://copim.pubpub.org/promoting-and-nurturing-interactions-with-open-access-books-strategies-for-publishers-and-authors) we developed within COPIM's Experimental Publishing Group. We want the compendium to act as a guide and reference for both experienced practitioners and those just setting out to experiment with the forms, content, and practices of scholarly bookmaking. The compendium includes experiments with the form and format of the scholarly book; with the various (multi)media we can publish long-form research in; and with how people produce, disseminate, consume, review, reuse, interact with and form communities around books. Far from being merely a formal exercise, **experimental publishing as we conceive it here also reimagines the relationalities that constitute scholarly writing, research, and publishing**. Books, after all, validate what counts as research and materialise how scholarly knowledge production is organised. The linked entries in this compendium may inspire speculations on the future of the book and the humanities more in general and encourage publishers and authors to explore publications beyond the standard printed codex format.

This compendium has been compiled by Janneke Adema, Simon Bowie, Gary Hall, Rebekka Kiesewetter, Julien McHardy, and Tobias Steiner. Having experimented with books for many years in various constellations we came together in COPIM’s Experimental Publishing Group for a period of three-and-a-half-years. During this time we collaborated with authors, tool and platform providers, designers, publishers, librarians, and developers, working together to create a number of pilot projects and research reports. This compendium gathers insights from the process of producing these resources, reflecting on our practice and that of our collaborators. Given that experimental publishing is continually-emergent and diverse, and that our understanding will always be partial, contradictory, and situated we hope that this compendium will evolve with those who interact with it, with the communities we created around our publishing experiments, and the communities that are still to come. In this introduction, we are sharing how this compendium came about and how we hope to further develop it, amongst others by inviting amendments by all who carry it forward by interacting with it, and by ongoing maintenance and (re-)use.

### Books are Political

Our starting premise is that scholarly bookmaking is political (Adema and Hall, 2015). Far from coming at the end of academic work, books contain multitudes, manifesting the entire field of scholarly knowledge production. How research is conceptualised, funded, conducted, analysed, articulated, valued and shared affects the shape and form of academic books. Experimenting with academic books, in turn, is to experiment with how academic labour and research are organised. From this starting point, we propose that experimenting with academic books is never just a formal exercise. Publishing is *one* site where scholars might intervene and reconfigure the knowledge production process. The idea that seemingly technical practices and infrastructures are political is a core insight of Science and Technology Studies (STS). Still, until recently, the critical study of knowledge infrastructures has long refrained from reflecting on our own research practices, to look inward to explore how academic publishing infrastructures shape academic realities. Many scholar-led publishing intitiatives take up this challenge. Involving scholars in the critical remaking of academic publishing emphasises that publishing is neither merely a service nor an end product, but an integral part of how research gets done. There cannot be *one* uniform 'best' way to organise academic publishing. Acknowledging - together with e.g. Haraway (1988) and Chan et al. (2019) - the contextual and situated nature of knowledge production, and moving away from notions of 'best' practice, we recognise that different research endeavours and academic communities might require a variety of forms of, and approaches to publishing, which is where COPIM — the Community-led Open Publication Infrastructures for Monographs project — comes in.
Our starting premise is that scholarly book publishing is political (Adema and Hall, 2015). Far from coming at the end of academic work, books contain multitudes, manifesting the entire field of scholarly knowledge production. How research is conceptualised, funded, conducted, analysed, articulated, valued, and shared affects the shape and form of academic books. Experimenting with academic books, in turn, is to experiment with how academic labour and research are organised. From this starting point, we propose that experimenting with academic books is never just a formal exercise. Publishing is *one* site where scholars might intervene and reconfigure the knowledge production process. The idea that seemingly technical practices and infrastructures are political is a core insight of Science and Technology Studies (STS). Still, until recently, the critical study of knowledge infrastructures has long refrained from reflecting on our own research practices, to look inward to explore how academic publishing infrastructures shape academic realities. Many scholar-led publishing initiatives have taken up this challenge, and have often stood at the vanguard of more experimental forms of publishing (Adema and Stone, 2017). Being involved as scholars in the critical remaking of academic publishing emphasises that publishing is neither merely a service nor an end product, but an integral part of how research gets done. There cannot be *one* uniform 'best' way to organise academic publishing. Acknowledging - together with e.g. Haraway (1988) and Chan et al. (2019) - the contextual and situated nature of knowledge production, and moving away from notions of 'best' practice, we recognise that different research endeavours and academic communities might require a variety of forms of, and approaches to publishing, which is where the COPIM project has come in.

As commercial consolidation continues to threaten to monopolise and homogenise the emerging scholarly Open Access publishing landscape, COPIM's mission was to gather researchers, publishers, libraries and infrastructure providers to develop community-owned ***alternatives to established infrastructure*** that can support and scale a diverse publishing landscapes. Open *infrastructures*, we proposed, can provide an alternative to platform capitalism that extracts value by monopolising access. Under the banner of Scaling Small, COPIM worked towards a diverse publishing landscape prioritising community ownership, collective production and governance, scholar-led publishing, and sharing resources and open infrastructures amongst various institutions guided by the project's core value of Bibliophilia (love and care for books). COPIM’s work packages were largely dedicated to serious infrastructure building, except for the experimental publishing group, which grants the question of how experimental publishing contributes to the ambition to establish infrastructures that allow diverse *small* initiatives to proliferate at *scale*?
As commercial consolidation continues to threaten to monopolise and homogenise the scholarly open access publishing landscape, COPIM's mission was to gather researchers, publishers, libraries, and infrastructure providers to develop community-owned ***alternatives to established infrastructure*** that can support and scale a diverse publishing landscapes. Open *infrastructures*, we proposed, can provide an alternative to platform capitalism that extracts value by monopolising access. Under the banner of *scaling small* (Adema and Moore, 2021), COPIM worked towards a diverse publishing landscape prioritising community ownership, collective production and governance, scholar-led publishing, and sharing resources and open infrastructures amongst various institutions guided by the project's core value of [bibliophilia](https://www.copim.ac.uk/about-us/mission/) (love and care for books). COPIM’s work packages were largely dedicated to serious infrastructure building. The experimental publishing group, in this context, brought together publishers, technologists, researchers, and designers to devise strategies to promote experimental book publishing and the reuse of, and engagement with, open access books. We have been examining ways to align existing open source software, tools, and workflows for experimental publishing with the workflow of open access book publishers, as well as with the infrastructures for scholar-led OA publishing that COPIM has created.

The image of diverse publishing landscapes or interrelated publishing ecosystems helped position COPIM’s work. These ecological metaphors evoke publishing as a relational enterprise, more or less explicitly valuing diversity over monoculture. Staying with metaphors of lively, specific and abundant interdependences allows us to sketch our understanding of experimental publishing’s place in scholarly knowledge production. Speaking of publishing ecologies reiterates our point that scholarly publishing cannot be separated from how it is funded, conceptualised, written, valued, reviewed, rewarded, read and taught. Scholarly publishing ecologies reflect and materialise the broader scholarly landscape. In this ecological view, scholarly books are not containers of knowledge but relational nodes that materialise what does and doesn’t count as valuable practices, sites, labour, and subjects of knowledge. In this metaphor, scholarly works, like all specimens, coevolve with the environment they inhabit and shape. In contrast to ecological metaphors, where knowledge circulates in diverse, partially connected patterns, schematic understandings of academic knowledge production frequently liken the flow of knowledge to managed water. For example, grant applications and project timetables tend to imagine scholarly publishing at the end of a pipeline. How institutions such as libraries, universities, publishers, funders, and intellectual property regimes organise knowledge production tends to reinforce the notion of a manageable flow from funding to research question to investigation to publication to evaluation to more funding. The metaphor of channelled flow and the premises of contained stages provides structure. The notion that valuable knowledge may be channeled, gives publishing a place and a form: the book coming at the end of the pipe. But, you see it coming, where there are pipes, there are blockages and spillage. Coming back to experimental publishing and ecological metaphors of flow, new forms of publication might streamline or spill over into relational circulations that have more in common with moors, swamps, and wetlands than pipes. Either way, we posit that experimental publishing is one of the sites where the shape of scholarly landscapes, and their relationship to other ecologies of knowledge and power is negotiated and materialised in practice. How we *do* publish matters. Experimenting with scholarly books is to experiment with scholarly modes of knowledge production. This labour, like other experimental practice, takes place at the growing edges and in the cracks of established practices, where by steady erosion, underground commotion or capital-intense incubation forms of writing, making, sharing, reviewing, discovering, reading and cataloging books come into being that will question, and occasionally change what counts as scholarly work.
The vision of a diverse publishing landscape or an interrelated publishing ecosystem has helped position COPIM’s work. These ecological metaphors evoke publishing as a relational enterprise, more or less explicitly valuing diversity over monoculture. Staying with metaphors of lively, specific, and abundant interdependences allows us to sketch our understanding of experimental publishing’s place in scholarly knowledge production. Speaking of publishing ecologies reiterates our point that scholarly publishing cannot be separated from how it is funded, conceptualised, written, valued, reviewed, rewarded, read and taught. Scholarly publishing ecologies reflect and materialise the broader scholarly landscape. In this ecological view, scholarly books are not containers of knowledge but relational nodes that materialise what does and doesn’t count as valuable practices, sites, labour, and subjects of knowledge. In this metaphor, scholarly works, like all specimens, coevolve with the environment they inhabit and shape. In contrast to ecological metaphors, where knowledge circulates in diverse, partially connected patterns, schematic understandings of academic knowledge production frequently liken the flow of knowledge to managed water. For example, grant applications and project timetables tend to imagine scholarly publishing at the end of a pipeline. How institutions such as libraries, universities, publishers, funders, and intellectual property regimes organise knowledge production tends to reinforce the notion of a manageable flow from funding to research question to investigation to publication to evaluation to more funding. The metaphor of channelled flow and the premises of contained stages provides structure. The notion that valuable knowledge may be channelled, gives publishing a place and a form: the book coming at the end of the pipe-line. But where there are pipes, there are blockages and spillage. Coming back to experimental publishing and ecological metaphors of flow, new forms of publication might streamline or spill over into relational circulations that have more in common with moors, swamps, and wetlands than pipes. Either way, we posit that experimental publishing is one of the sites where the shape of scholarly landscapes, and their relationship to other ecologies of knowledge and power is negotiated and materialised in practice. How we *do* publishing matters. Experimenting with scholarly books is to experiment with scholarly modes of knowledge production. This labour, like other experimental practices, takes place at the growing edges and in the cracks of established practices, where by steady erosion, underground commotion, or capital-intense incubation, forms of writing, making, sharing, reviewing, discovering, reading and cataloguing books come into being that question, and occasionally change what counts as scholarly work.

The compendium gathers and links tools, examples and practices with a focus on free and open-source software, platforms and digital publishing tools that presses and authors can either use freely and/or further adapt themselves to their workflows. The compendium also proposes a typology of experimental publishing. This typology is a starting point for exploration, rather than a fixed classification. It doesn’t provide clear definitions of the various experiments undertaken within scholarly book publishing—if only because many of the examples will defy categories. This mapping provides a snapshot, a temporary overview and analysis, one that will hopefully be updated, revised, and reused in different contexts. In this respect analysing experimental publishing—perhaps more than established forms of publishing—requires a continuous re-mapping due to the nature of its speculative and emergent form, where any map will need to be repeatedly redrawn if we want to analyse experimental publishing’s material-discursive practices. At the same time, we are aware of the performative character of our analyses (i.e., how any classification we suggest will provide further authority and weight to that classification), which will inherently be a factor in the stabilising, fixing, and freezing of these practices and knowledge relations, including as part of the mapping or typology that we provide here.
The compendium gathers and links tools, examples, and practices with a focus on free and open-source software, platforms, and digital publishing tools that presses and authors can either use freely and/or further adapt themselves to their workflows. The compendium also proposes a typology of experimental books. This typology is a starting point for exploration, rather than a fixed classification. It doesn’t provide any clear-cut definitions of the various experiments undertaken within scholarly book publishing—if only because many of the examples will defy categorisation. This mapping provides a snapshot, a temporary overview and analysis, one that will hopefully be updated, revised, and reused in different contexts. In this respect analysing experimental publishing—perhaps more than established forms of publishing—requires a continuous re-mapping due to the nature of its speculative and emergent form, where any map will need to be repeatedly redrawn if we want to analyse experimental publishing’s material-discursive practices. At the same time, we are aware of the performative character of our analyses (i.e., how any classification we suggest will provide further authority and weight to that classification), which will inherently be a factor in the stabilising, fixing, and freezing of these practices and knowledge relations, including as part of the mapping or typology that we provide here.

By keeping this mapping open, both for updates and further uptake by the community, we hope we can prevent a too stringently fixing-down of the speculative character of these experiments, where instead we want to emphasise that its political nature lies in the book continuing ‘to be able to serve ‘‘new ends’’ as a medium through which politics itself can be rethought’ (Adema and Hall 2013; Drucker, 2004). Indeed, experimental publishing can be seen as an attempt to keep ‘open the politics of knowledge and communication in a context where these are being closed down’. Following this line of thinking, instead of defining what makes an experimental book or what constitutes experimental publishing, we position it here in relation to certain practices and contexts instead. For example, what becomes clear when examining experimental book publishing within academia is that it is (historically) positioned across three interconnected discourses: the codex format, digital publishing, and openness.
By keeping this mapping open, both for updates and further uptake by the community, we hope we can prevent a too stringently fixing-down of the speculative character of these experiments, where instead we want to emphasise that its political nature lies in the book continuing ‘to be able to serve ‘‘new ends’’ as a medium through which politics itself can be rethought’ (Adema and Hall 2013; Drucker, 2004). Indeed, experimental publishing can be seen as an attempt to keep ‘open the politics of knowledge and communication in a context where these are being closed down’. Following this line of thinking, instead of defining what makes an experimental book or what constitutes experimental publishing, we position it here in relation to certain practices and contexts instead, as we have tried to do here in this compendium.

As outlined above, experimental forms and practices of publishing open up and explore questions around modalities, linearity, workflow, and the relationalities of publishing; they examine established practices that many scholarly communities have taken for granted and repeated within conventional forms of publishing—where they have become solidified in standard print- and codex-based publishing forms and practices. This especially concerns discussions about what constitutes a publication, or at what point scholarship is formally ‘published’ (the current consensus is that a book is published once it is peer reviewed and published by a reputable press). Unlike Elliott and others, who argue for clear definitions to distinguish experimental publishing, we resist clear definitions, simply because the form and value of experimentation is research-, field- and discourse-specific. Fixed definitions risks closing down conversations that different scholarly communities have to determine their own (what we hope are contingent and continuously reviewed) understandings of what constitutes a book or a publication. In this compendium, we speak of experimental publishing and experimental books to refer to a mode of publishing that might also be called multimodal, screen-based, or interactive. We prefer experimental publishing because it can encompass multi-modal, interactive, and screen-based works, without restricting which media forms or practices count as experimental. Experimental publishing thus invites discussion about the form and intend of publishing experiments.
As outlined above, experimental forms and practices of publishing open up and explore questions around modalities, linearity, workflow, and the relationalities of publishing; they examine established practices that many scholarly communities have taken for granted and repeated within conventional forms of publishing—where they have become solidified in standard print- and codex-based publishing forms and practices. This especially concerns discussions about what constitutes a publication, or at what point scholarship is formally ‘published’ (the current consensus being that a book is published once it is peer reviewed and published by a reputable press). We resist clear definitions of what constitutes an (experimental) book, simply because the form and value of experimentation is research-, field- and discourse-specific. Fixed definitions risks closing down conversations that different scholarly communities have to determine their own (what we hope are contingent and continuously reviewed) understandings of what constitutes a book or a publication. In this compendium, we speak of experimental publishing and experimental books to refer to a mode of publishing that might also be called multimodal, screen-based, or interactive. We prefer experimental publishing because it can encompass multi-modal, interactive, and screen-based works, without restricting which media forms or practices count as experimental. Experimental publishing thus invites discussion about the form and intend of publishing experiments.

We, to collapse our editorial politics for a minute, favour the technofeminist dreamscape of biodiverse swamps and moors where more collective, inclusive, embodied, situated and caring modes of knowledge production may emerge. Pushing for diverse publishing landscapes, we recognise that this dream is limited and particular. The notion that changes in publishing effect the entire scholarly landscape applies equally to pipe dreams of scholarly efficiency and to ways of reimagining scholarly publishing that lies in our blindspot, beyond our horizon. While we know where we stand, we hope that this compendium is useful for all who are working to expand scholarly publishing, working to promote and give visibility to the rich and diverse forms of digital scholarship, and multimodal and interactive research out there and inspire ongoing experimentation. The compendium will be funded for X years by X. During this time at least the compendium will remain under active development. Our hope is that it will help build relationships between software and tool providers, publishers, librarians, researchers, and authors, working with and strengthening communities of expertise around experimental books.
We, to collapse our editorial politics for a minute, favour the technofeminist visions of biodiverse swamps and moors where more collective, inclusive, embodied, situated and caring modes of knowledge production may emerge. Pushing for diverse publishing landscapes, we recognise that this vision remains limited and particular. The notion that changes in publishing effect the entire scholarly landscape applies equally to pipe dreams of scholarly efficiency and to ways of reimagining scholarly publishing that lies in our blindspot, beyond our horizon. While we know where we stand, we hope that this compendium is useful for all who are working to expand scholarly publishing, to promote and give visibility to the rich and diverse forms of digital scholarship, and all the multimodal and interactive research out there, to inspire ongoing experimentation. The compendium will be released in a beta form in first instance and will remain under active development for the next few years, due to generous funding from the [Research England Development (RED) Fund](https://re.ukri.org/funding/our-funds-overview/research-england-development-red-fund/) and [Arcadia](https://www.arcadiafund.org.uk/), a charitable fund of Lisbet Rausing and Peter Baldwin. Our hope is that it will help build relationships between software and tool providers, publishers, librarians, researchers, and authors, working with and strengthening communities of expertise around experimental books. But we also want to expand, strengthen, and maintain the compendium together with this community to both govern and oversee it.

If you are a publisher, developer, initiative, library, institution or author wanting to contribute to the further development of the compendium please get in touch with [compendium@openbookcollective.org](mailto:compendium@openbookcollective.org).

The compendium grew out of the Books Contain Multitudes: Exploring Experimental Publishing Report. (2022 update). Community-Led Open Publication Infrastructures for Monographs (COPIM). [https://doi.org/10.21428/785a6451.1792b84f](https://doi.org/10.21428/785a6451.1792b84f) & [https://doi.org/10.5281/zenodo.6545475](https://doi.org/10.5281/zenodo.6545475).
**If you are a scholar, publisher, developer, library, institution or designer wanting to contribute to the further development of the compendium please get in touch with [julien@matteringpress.org](mailto:julien@matteringpress.org).**

+ 1
- 0
web/content/books.md 파일 보기

@@ -0,0 +1 @@
Experimental books undo, critique, reinvent, and expand the processes and norms of scholarly publishing.

+ 29
- 0
web/content/colophon.md 파일 보기

@@ -0,0 +1,29 @@
## Beta 1.0 (2023)

Version 1.0 has been curated by Janneke Adema, Julien McHardy, and Simon Bowie. Future versions will be overseen, curated, and maintained by an Editorial Board (members TBC).

Back-end coding by [Simon Bowie](https://simonxix.com), front-end coding by [Joel Galvez](https://www.joelgalvez.com/), design by Joel Galvez & Martina Vanini.

Special thanks to Gary Hall, Rebekka Kiesewetter, Marcell Mars, Toby Steiner, and Samuel Moore, and everyone who has provided feedback on our research or shared suggestions of examples to feature, including the participants of COPIM’s experimental publishing workshop, and Nicolás Arata, Dominique Babini, Maria Fernanda Pampin, Sebastian Nordhoff, Abel Packer, and Armanda Ramalho, and Agatha Morka.

Our appreciation also goes out to the [Next Generation Library Publishing Project](https://educopia.org/next-generation-library-publishing/) for sharing an early catalogue-in-progress version of [SComCat](https://www.scomcat.net/) with us, which formed one of the inspirations behind the Compendium.
___

Copyright © 2023 [COPIM](https://copim.ac.uk/).

Design © 2023 [Joel Galvez](https://joelgalvez.com/selected).

Licensed under a [Creative Commons Attribution 4.0 International License (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/).

All source code is available on GitHub at [https://github.com/COPIM/expub_compendium](https://github.com/COPIM/expub_compendium) under an [MIT License](https://github.com/COPIM/expub_compendium/blob/main/LICENSE).
___

The compendium grew out of the following two reports:

Adema, J., Bowie, S., Mars, M., and T. Steiner (2022) *Books Contain Multitudes: Exploring Experimental Publishing (2022 update)*. Community-Led Open Publication Infrastructures for Monographs (COPIM). doi: [10.21428/785a6451.1792b84f](https://doi.org/10.21428/785a6451.1792b84f) & [10.5281/zenodo.6545475](https://doi.org/10.5281/zenodo.6545475).

Adema, J., Moore, S., and T. Steiner (2021) *Promoting and Nurturing Interactions with Open Access Books: Strategies for Publishers and Authors*. Community-Led Open Publication Infrastructures for Monographs (COPIM). doi: [10.21428/785a6451.2d6f4263](https://doi.org/10.21428/785a6451.2d6f4263) and [10.5281/zenodo.5572413](https://doi.org/10.5281/zenodo.5572413)

___

COPIM and the Experimental Publishing Compendium are supported by the [Research England Development (RED) Fund](https://re.ukri.org/funding/our-funds-overview/research-england-development-red-fund/) and by [Arcadia](https://www.arcadiafund.org.uk), a charitable fund of Lisbet Rausing and Peter Baldwin.

+ 1
- 1
web/content/home.md 파일 보기

@@ -1 +1 @@
The Experimental Publishing Compendium is for authors, designers, publishers, institutions and technologist who challenge, push and redefine the shape, form and rationale of scholarly works. The compendium offers a catalogues of tools, practices, and books to inspire experimental scholarly works. [Read more](/about)
The Experimental Publishing Compendium is a guide and reference for scholars, publishers, developers, librarians, and designers who want to challenge, push and redefine the shape, form and rationale of scholarly books. The compendium brings together tools, practices, and books to promote the publication of experimental scholarly works. [Read more](/about)

+ 1
- 0
web/content/practices.md 파일 보기

@@ -0,0 +1 @@
Sorting the compendium by practice (annotating, collaborative writing, forking, remixing, reviewing, translating, versioning) provides inspiration on how-to make experimental books.

+ 1
- 0
web/content/tools.md 파일 보기

@@ -0,0 +1 @@
Open source software tools and platforms enable experimentation with scholarly books: changing how people, collate, write, assemble, review, publish, share, reuse, and read long-form texts.

+ 2
- 1
web/requirements.txt 파일 보기

@@ -8,4 +8,5 @@ markdown
isbntools
requests
marshmallow
flask-marshmallow
flask-marshmallow
pandas

Loading…
취소
저장