Kerko is a web application component implemented in Python for the Flask framework that provides a user-friendly search and browsing interface for sharing a bibliography managed with the Zotero reference manager.
The combination of Kerko and Zotero gives you the best of both worlds: a rich but easy to use web interface for end-users of the bibliography, and a well-established and powerful bibliographic reference management tool for individuals or teams working on the bibliography's content.
A Kerko-powered bibliography is managed using Zotero, and stored in the cloud on zotero.org, while Kerko itself is incorporated into an application which is installed on a web server. The bibliographic references may reside in a Zotero group library, where multiple users may collaborate to manage the content, or in a Zotero private library. On the web server, Kerko maintains a search index, which is a copy of the Zotero library that is optimized for search. When users interact with the web application, Kerko gets all the required data from that search index, without ever contacting zotero.org. It is through a scheduled task, which runs at regular intervals, that Kerko automatically brings its search index up to date by using the Zotero Web API to retrieve the latest data from zotero.org.
As a Flask blueprint (a "blueprint" is Flask's term for an application component, similar to what some other systems might call a plugin or an extension), Kerko only works when incorporated into a Flask application. However, a sample stand-alone application is available, KerkoApp, which is pre-built with Kerko and ready to be deployed on a web server. KerkoApp might work for you if you like the default appearance and if the provided configuration options are sufficient for your needs, otherwise you should probably consider building a custom application. In a custom application, the Kerko-powered bibliography might be just one section of a larger website.
A KerkoApp-based demo site is available for you to try. You may also view the Zotero library that contains the source data for the demo site.
The following features are implemented in Kerko:
AND
: matches items that contain all specified terms. This is the default
relation between terms when no operator is specified, e.g., a b
is the
same as a AND b
.OR
: matches items that contain any of the specified terms, e.g., a OR b
.NOT
: excludes items that match the term, e.g., NOT a
.(a OR b) AND c
."a b c"
. The default
difference between word positions is 1, meaning that an item will match if
it contains the words next to each other, but a different maximum distance
may be selected (with the tilde character), e.g. "web search"~2
allows up
to 1 word between web
and search
, meaning it could match web site search
as well as web search
.faceted^2 search browsing^0.5
specifies that faceted
is twice as important as search
when computing
the relevance score of results, while browsing
is half as important.
Boosting may be applied to a logical grouping, e.g., (a b)^3 c
.search
, searches
,
and searching
all return the same results. The Snowball algorithm is
used for that purpose.flask
command (see Command line
interface).Kerko requires Python 3.7 or later.
The following packages will be automatically installed when installing Kerko:
The following front-end resources are loaded from CDNs by Kerko's default templates (but could be completely removed or replaced by your application):
This section only applies if you intend to integrate Kerko into your own application. If you are more interested into the standalone KerkoApp application, please refer to its installation instructions.
We'll assume that you have some familiarity with Flask and suggest steps for
building a minimal app, let's call it hello_kerko.py
, to get you started.
The first step is to install Kerko. As with any Python library, it is highly recommended to install Kerko within a virtual environment.
Once the virtual environment is set and active, use the following command:
pip install kerko
In hello_kerko.py
, configure variables required by Kerko and create your
app
object, as in the example below:
import pathlib
from flask import Flask
from kerko.composer import Composer
app = Flask(__name__)
app.config['SECRET_KEY'] = '_5#y2L"F4Q8z\n\xec]/' # Replace this value.
app.config['KERKO_ZOTERO_API_KEY'] = 'xxxxxxxxxxxxxxxxxxxxxxxx' # Replace this value.
app.config['KERKO_ZOTERO_LIBRARY_ID'] = '9999999' # Replace this value.
app.config['KERKO_ZOTERO_LIBRARY_TYPE'] = 'group' # Replace this value if necessary.
app.config['KERKO_DATA_DIR'] = str(pathlib.Path(__file__).parent / 'data' / 'kerko')
app.config['KERKO_COMPOSER'] = Composer()
SECRET_KEY
: This variable is required for generating secure tokens in web
forms. It should have a secure, random value and it really has to be
secret. It is usually set in an environment variable rather than in Python
code, to make sure it never ends up in a code repository. But here we're
taking the minimal route and thus are cutting some corners!KERKO_ZOTERO_API_KEY
, KERKO_ZOTERO_LIBRARY_ID
and
KERKO_ZOTERO_LIBRARY_TYPE
: These variables are required for Kerko to be
able to access your Zotero library. See Configuration
variables for details on how to properly set
these variables.KERKO_DATA_DIR
: This variable specifies the directory where to store the
search index and the file attachments. If the specified directory does not
already exists, Kerko will try to create it.KERKO_COMPOSER
: This variable specifies key elements needed by Kerko,
e.g., fields for display and search, facets for filtering. These are
defined by instantiating the Composer
class. Your application may
manipulate the resulting object at configuration time to add, remove or
alter fields, facets, sort options, search scopes, record download formats,
or badges. See Kerko Recipes for some examples.Also configure the Flask-Babel and Bootstrap-Flask extensions:
from flask_babel import Babel
from flask_bootstrap import Bootstrap
babel = Babel(app)
bootstrap = Bootstrap(app)
See the respective docs of Flask-Babel and Bootstrap-Flask for more details.
Instantiate the Kerko blueprint and register it in your app:
from kerko import blueprint as kerko_blueprint
app.register_blueprint(kerko_blueprint, url_prefix='/bibliography')
The url_prefix
argument defines the base path for every URL provided by
Kerko.
In the same directory as hello_kerko.py
with your virtual environment
active, run the following shell commands:
export FLASK_APP=hello_kerko.py
flask kerko sync
Kerko will retrieve your bibliographic data from zotero.org. If you have a large bibliography or large attachments, this may take a while (and there is no progress indicator). In production use, that command is usually added to the crontab file for regular execution (with enough time between executions for each to complete before the next one starts).
To list all commands provided by Kerko:
flask kerko --help
Run your application:
flask run
Open http://127.0.0.1:5000/bibliography/ in your browser and explore the bibliography.
You have just built a really minimal application for Kerko. This code example is available at KerkoStart. See also KerkoApp for a slightly more complete example.
The variables below are required and have no default values:
KERKO_COMPOSER
: An instance of the kerko.composer.Composer
class.KERKO_DATA_DIR
: The directory where to store the search index and the file
attachments. Subdirectories index
and attachments
will be created if they
do not already exist.KERKO_ZOTERO_API_KEY
: Your API key, as created on
zotero.org.KERKO_ZOTERO_LIBRARY_ID
: The identifier of the library to get data from. For
your personal library this value should be your userID, as found on
https://www.zotero.org/settings/keys (you must be logged-in). For a group
library this value should be the groupID of the library, as found in the URL
of that library (e.g., in https://www.zotero.org/groups/2348869/kerko_demo,
the groupID is 2348869
).KERKO_ZOTERO_LIBRARY_TYPE
: The type of library to get data from, either
'user'
for your personal library, or 'group'
for a group library.Any of the following variables may be added to your configuration if you wish to override their default value:
KERKO_CSL_STYLE
: The citation style to use for formatted references. Can be
either the file name (without the .csl
extension) of one of the styles in the
Zotero Styles Repository (e.g., apa
) or the URL of a remote
CSL file. Defaults to 'apa'
.KERKO_DOWNLOAD_ATTACHMENT_NEW_WINDOW
: Open attachments in new windows, i.e.,
add the target="_blank"
attribute to attachment links. Defaults to False
.KERKO_DOWNLOAD_CITATIONS_LINK
: Provide a record download button on search
results pages. Defaults to True
.KERKO_DOWNLOAD_CITATIONS_MAX_COUNT
: Limit over which the record download
button should be hidden from search results pages. Defaults to 0
(i.e. no
limit).KERKO_FACET_COLLAPSING
: Allow collapsible facets. Defaults to False
.KERKO_FULLTEXT_SEARCH
: Allow full-text search of PDF attachments. Defaults
to True
. To get consistent results, see Ensuring full-text indexing of your
attachments in
Zotero.KERKO_HIGHWIREPRESS_TAGS
: Embed Highwire Press
tags into
the HTML of item pages. This should help search engines such as Google Scholar
index your items, but works only with book, conference paper, journal article,
report or thesis items. Defaults to True
(i.e. enabled).KERKO_PAGE_LEN
: The number of search results per page. Defaults to 20
.KERKO_PAGER_LINKS
: Number of pages to show in the pager (not counting the
current page). Defaults to 4
.KERKO_PRINT_ITEM_LINK
: Provide a print button on item pages. Defaults to
False
.KERKO_PRINT_CITATIONS_LINK
: Provide a print button on search results
pages. Defaults to False
.KERKO_PRINT_CITATIONS_MAX_COUNT
: Limit over which the print button should
be hidden from search results pages. Defaults to 0
(i.e. no limit).KERKO_RELATIONS_INITIAL_LIMIT
: Number of related items to show above the
"view all" link. Defaults to 5
.KERKO_RELATIONS_LINKS
: Show item links in lists of related items. Defaults
to False
. Enabling this only has an effect if at least one of the following
variables is also set to True
: KERKO_RESULTS_ATTACHMENT_LINKS
,
KERKO_RESULTS_URL_LINKS
).KERKO_RESULTS_ABSTRACTS
: Show abstracts on search result pages. Defaults to
False
(abstracts are hidden).KERKO_RESULTS_ABSTRACTS_TOGGLER
: Show a button letting users show or hide
abstracts on search results pages. Defaults to True
(toggle is displayed).KERKO_RESULTS_ABSTRACTS_MAX_LENGTH
: Truncate abstracts at the given length
(in number of characters). If text is to be truncated in the middle of a word,
the whole word is discarded instead. Truncated text is appended with an
ellipsis sign ("..."). Defaults to 0
(abstracts get displayed in their full
length, without any truncation).KERKO_RESULTS_ABSTRACTS_MAX_LENGTH_LEEWAY
: If the length of an abstract only
exceeds KERKO_RESULTS_ABSTRACTS_MAX_LENGTH
by this tolerance margin (in
number of characters), it will not be truncated. Defaults to 0
(no tolerance
margin).KERKO_RESULTS_ATTACHMENT_LINKS
: Provide links to attachments in search
results. Defaults to True
.KERKO_RESULTS_URL_LINKS
: Provide links to online resources in search
results (for items whose URL field has a value). Defaults to True
.KERKO_RESULTS_FIELDS
: List of item fields to retrieve for search results
(most notably used by the KERKO_TEMPLATE_SEARCH_ITEM
template). Values in
this list are keys identifying fields defined in the kerko.composer.Composer
instance. One probably only needs to change the default list when overriding
the template to display additional fields. Note that some fields from the
default list may be required by other Kerko functions.KERKO_TEMPLATE_SEARCH
: Name of the Jinja2 template to render for the search
page with list of results. Defaults to kerko/search.html.jinja2
.KERKO_TEMPLATE_SEARCH_ITEM
: Name of the Jinja2 template to render for the
search page with a single bibliographic record. Defaults to
kerko/search-item.html.jinja2
.KERKO_TEMPLATE_ITEM
: Name of the Jinja2 template to render for the
bibliographic record view. Defaults to kerko/item.html.jinja2
.KERKO_TEMPLATE_LAYOUT
: Name of the Jinja2 template that is extended by the
search, search-item, and item templates. Defaults to kerko/layout.html.jinja2
.KERKO_TEMPLATE_BASE
: Name of the Jinja2 template that is extended by the
layout template. Defaults to kerko/base.html.jinja2
.KERKO_TITLE
: The title to display in web pages. Defaults to 'Kerko'
.KERKO_ZOTERO_BATCH_SIZE
: Number of items to request on each call to the
Zotero API. Defaults to 100
(which is the maximum currently allowed by the
API).KERKO_ZOTERO_MAX_ATTEMPTS
: Maximum number of tries after the Zotero API
has returned an error or not responded during indexing. Defaults to 10
.KERKO_ZOTERO_WAIT
: Time to wait (in seconds) between failed attempts to
call the Zotero API. Defaults to 120
.BABEL_DEFAULT_LOCALE
: The default language of the user interface. Defaults
to 'en'
. Your application may set this variable and/or implement a locale
selector function to override it (see the Flask-Babel
documentation).BABEL_DEFAULT_TIMEZONE
: The timezone to use for user facing dates.
Defaults to 'UTC'
. Your application may set this variable and/or implement
a timezone selector function to override it (see the Flask-Babel
documentation). Any timezone name supported by
the pytz package should work.KERKO_USE_TRANSLATIONS
: Use translations provided by the Kerko package.
Defaults to True
. When this is set to False
, translations may be
provided by the application's own translation catalog.KERKO_WHOOSH_LANGUAGE
: The language of search requests. Defaults to
'en'
. You may refer to Whoosh's source to get the list of supported
languages (whoosh.lang.languages
) and the list of languages that support
stemming (whoosh.lang.has_stemmer()
).KERKO_ZOTERO_LOCALE
: The locale to use with Zotero API calls. This
dictates the locale of Zotero item types, field names, creator types and
citations. Defaults to 'en-US'
. Supported locales are listed at
https://api.zotero.org/schema, under "locales".GOOGLE_ANALYTICS_ID
: A Google Analytics property ID, e.g., 'UA-99999-9'.
This variable is optional and there is no default value. If set, the Google
Analytics tag is inserted into the pages.KERKO_ZOTERO_START
: Skip items, start at the specified position. Defaults
to 0
. Useful only for development/tests.KERKO_ZOTERO_END
: Load items from Zotero until the specified position.
Defaults to 0
(no limit). Useful only for development/tests.Caution: Many of the configuration variables cause changes to the structure of Kerko's cache or search index. Changing those variables may require that you rebuild the cache or the search index, and restart the application. See the command line interface for the cleaning and synchronization commands.
Kerko does one-way data synchronization from zotero.org through a 3-step process:
The first step performs incremental updates of the local cache. After an initial full update, the subsequent synchronization runs will request only new and updated items from Zotero. This greatly reduces the number of Zotero API calls, and thus the time required to complete the synchronization process.
The second step reads data from the cache to update the search index. If the cache has changed since the last update, it performs a full update of the search index, otherwise it skips to the next step. Any changes to the search index are "committed" as a whole at the end of this step, thus up to that point any user using the application sees the data that was available prior to the synchronization run.
The third and last step reads the list of file attachments from the search index, with their MD5 hashes. It compares those with the available local copies of the files, and downloads new or changed files from Zotero. It also deletes any local files that may no longer be used.
Normally, all synchronization steps are executed. But under certain circumstances it can be useful to execute a given step individually. For example, after changing some configuration settings, one may clean just the search index and rebuild it from the cache (see the command line interface below), which will be much faster than re-synchronizing from Zotero.
Kerko provides an integration with the Flask command line interface.
The flask
command will work with your virtual environment active, and with the
FLASK_APP
environment variable set to tell it where to find your application.
Some frequently used commands are:
# List all commands provided by Kerko:
flask kerko --help
# Delete all of Kerko's data.
flask kerko clean
# Get help about the clean command:
flask kerko clean --help
# Synchronize everything from Zotero.
flask kerko sync
# Get help about the sync command:
flask kerko sync --help
# Delete the cache (the next sync will perform a full update from Zotero, but
# it will not re-download all file attachments).
flask kerko clean cache
# Delete just the search index.
flask kerko clean index
# Synchronize just the search index.
flask kerko sync index
TODO: More recipes!
Kerko's full-text indexing relies on text content extracted from attachments by Zotero. Consequently, for Kerko's full-text search to work, you must make sure that full-text indexing works in Zotero first; see Zotero's documentation on full-text indexing.
Individual attachments in Zotero can be indexed, partially indexed, or unindexed. Various conditions may cause an attachment to be partially indexed or unindexed, e.g., file is large, has not been processed yet, or does not contain text.
Zotero shows the indexing status in the attachment's right pane. If it shows "Indexed: Yes", all is good. If it shows "Indexed: No" or "Indexed: Partial", then clicking the "Reindex Item" button (next to the indexing status) should ensure that the attachment gets fully indexed, that is if the file actually contains text. If there is no "Reindex Item" button, it probably means that Zotero does not support that file type for full-text indexing (at the moment, it only supports PDF and plain text files).
It can be tedious to go through hundreds of attachments just to find out whether they are indexed or not. To make things easier, you could create a saved search in your Zotero library to get an always up-to-date list of unindexed PDFs. Use the following search conditions:
Controlling the indexing status will not only improve full-text search on your Kerko site, but also full-text search from within Zotero!
Zotero allows one to link items together through its Related field. However, such relations are not typed nor directed, making it impossible (1) to indicate the nature of the relation, or (2) to distinguish which of two related items is the citing entity, and which is the one being cited. Consequently, Kerko has its own method for setting up those relations.
To establish Cites relations in your Zotero library, you must follow the procedure below:
https://www.zotero.org/groups/9999999/items/ABCDEFGH
or
https://www.zotero.org/users/9999999/items/ABCDEFGH
._cites
. That tag that will tell Kerko that this particular note is special,
that it contains relations.At the next synchronization, Kerko will retrieve the references found in notes
tagged with _cites
. Afterwards, proper hyperlinked citations will appear in
the Cites and Cited by sections of the related bibliographic records.
Remarks:
zotero://select/
) in the
notes, if you prefer those to Zotero URIs.href
attribute of <a>
elements.Kerko can be translated using Babel's setuptools integration.
The following commands should be executed from the directory that contains
setup.py
, and the appropriate virtual environment must have been
activated beforehand.
Create or update the PO template (POT) file:
python setup.py extract_messages
Create a new PO file (for a new locale) based on the POT file. Replace
YOUR_LOCALE
with the appropriate language code, e.g., de
, es
, fr
:
python setup.py init_catalog --locale YOUR_LOCALE
Update an existing PO file based on the POT file:
python setup.py update_catalog --locale YOUR_LOCALE
Compile MO files:
python setup.py compile_catalog
You are welcome to contribute your translation. See Submitting a translation.
Issues may be submitted on Kerko's issue tracker. Please consider the following guidelines:
Clone the Kerko repository into a local directory. Set up a virtual
environment, then install this local version of Kerko in the virtual
environment, including development and testing dependencies by running the
following command from Kerko's root directory, i.e., where setup.cfg
resides:
pip install -e .[dev,tests]
To run basic tests in your current environment:
python -m unittest
To check code coverage as well, use this command instead:
coverage run -m unittest
Then generate the coverage report:
coverage report
Note: Test coverage is still very low at the moment. You are welcome to contribute new tests!
To run the full test suite under different environments (using the various Python interpreters available on your machine):
tox
Pull requests may be submitted against Kerko's repository. Please consider the following guidelines:
--style='{based_on_style: facebook, column_limit: 100}'
). Many
editors provide Yapf integration.Some guidelines:
Please submit your translation as a pull request against Kerko's repository, or by e-mail, with the PO file included as an attachment (do not copy the PO file's content into an e-mail's body, since that could introduce formatting or encoding issues).
Nurturing an open source project such as Kerko, following up on issues and helping others in working with the system is a lot of work, but hiring the original developers of Kerko can do a lot in ensuring continued support and development of the project.
If you need professional support related to Kerko, have requirements not currently implemented in Kerko, want to make sure that some Kerko issue important to you gets resolved, or if you just like our work and would like to hire us for an unrelated project, please e-mail us.
For a summary of changes by release version, see the changelog.
Kerko was inspired by two prior projects:
Later on, it became clear that other organizations needed a similar solution. However, software from the prior projects had to be rewritten so it could more easily be configured for different bibliographies from organizations with different needs. That led to Kerko, whose development was made possible through the following project:
The name Zotero reportedly derives from the Albanian word zotëroj, which means "to learn something extremely well, that is to master or acquire a skill in learning" (Source: Mark Dingemanse, 2008, Etymology of Zotero).
The name Kerko is a nod to Zotero as it takes a similar etymological route: it derives from the Albanian word kërkoj, which means "to ask, to request, to seek, to look for, to demand, to search" and seems fit to describe a search tool.
The following online bibliographies are powered by Kerko:
If you wish to add your Kerko-powered online bibliography to this list, please e-mail us or submit a pull request.
Bug fixes:
Warning: Upgrading from version 0.7.x or earlier will require that you clean and re-sync your existing search index. Use the following commands, then restart the application:
flask kerko clean index
flask kerko sync
Features:
KERKO_FULLTEXT_SEARCH
to False
. Since this feature relies on Zotero's
full-text indexing, you must make sure that it works in Zotero first; see
Zotero's
documentation.KERKO_RESULTS_URL_LINKS
to False
.KERKO_RESULTS_ATTACHMENT_LINKS
to
False
.standalone_attachment_download
, lets one retrieve a
standalone file attachment.KERKO_RESULTS_ABSTRACTS_MAX_LENGTH
and
KERKO_RESULTS_ABSTRACTS_MAX_LENGTH_LEEWAY
).KERKO_HIGHWIREPRESS_TAGS
to False
.href
attribute of <a>
elements.Bug fixes:
Other changes:
sync cache
command to the command line interface.sortable
Whoosh flag on relevant
fields._
) are now trimmed from facet
value labels. This happens after sorting the values, which means that the
underscore can still be used as a prefix to alter the alphabetical order.type
HTML attribute to record download links.rel="alternate"
HTML attribute to record download links on item
pages. Also add a corresponding link
element to the page head
.Backwards incompatible changes:
kerko index
CLI command (use kerko sync
instead).Possibly backwards incompatible changes (more or less internal API changes):
KERKO_RESULTS_FIELDS
setting now includes the
'url'
field. If you have overridden that setting in your application and
KERKO_RESULTS_URL_LINKS
is enabled, you'll probably have to add 'url'
too.item_type
has been renamed to item_type_label
. If you
have custom templates, please review any use of item.item_type
.kerko/_search-result.html.jinja2
template has changed
somewhat. If you have overridden it, you'll need to review the changes.ItemContext
class has been eliminated. The Extractor.extract()
method
now receives an item's dictionary instead of an ItemContext
object, and if
an item has children these are now available directly in the item (with the
children
key). If you have created custom extractor classes, their
extract()
method will need to be adapted accordingly.BaseAttachmentsExtractor
→ BaseChildAttachmentsExtractor
BaseNotesExtractor
→ BaseChildNotesExtractor
LinkedURIAttachmentsExtractor
→ ChildLinkedURIAttachmentsExtractor
NotesTextExtractor
→ ChildNotesTextExtractor
RawNotesExtractor
→ RawChildNotesExtractor
RelationsInNotesExtractor
→ RelationsInChildNotesExtractor
StoredFileAttachmentsExtractor
→ ChildFileAttachmentsExtractor
item_attachment_download
→ child_attachment_download
alternateId
→ alternate_id
Security fixes:
Bug fixes:
Other changes:
Documentation changes:
Warning: Upgrading from version 0.6 or earlier will require that you clean and re-sync your existing search index. Use the following commands, then restart the application:
flask kerko clean index
flask kerko sync
Features:
_cites
tag.dc.replaces
relation that's managed internally by Zotero on some operations
such as item merges.id
parameter to the search result URLs, and
redirect the user to that item's permanent URL if the search result no longer
matches because of database changes.search
to the search form.aria-label
attribute to many elements.aria-current
attribute to indicate the current value of widgets.Bug fixes:
Other changes:
setup.py
to
setup.cfg
.src
layout.Backwards incompatible changes:
pager
dict passed to the _pager.html.jinja2
template are
now lists. Previously, only the values at keys 'before'
and 'after'
were
lists; now the values at keys 'previous'
, 'first'
, 'current'
, 'last'
,
and 'next'
are lists as well.'blacklist'
and 'whitelist'
in variable names are replaced with
'exclude'
and 'include'
.KERKO_RESULTS_ABSTRACT
configuration variable is replaced by two
variables, KERKO_RESULTS_ABSTRACTS
(note the now plural form) and
KERKO_RESULTS_ABSTRACTS_TOGGLER
.{url_prefix}/{itemID}/export/{format}
for individual items ('export'
has
been inserted), and {url_prefix}/export/{format}/
for search result pages
('download'
has been replaced by 'export'
).Extractor
class' interface has changed, improving consistency and
separation of concerns:__init__()
must now be specified as keyword arguments.extract()
method no longer have a document
argument, and the spec
argument is now the last one. The method now returns a value instead of
assigning it to the document.extract_and_store()
method handles extraction, encoding, and
assignment to the document, assigning the value only when it is not None
.AttachmentsExtractor
class has been renamed to
StoredFileAttachmentsExtractor
.InCollectionExtractor
now extends collection membership to subcollections.
To preserve the previous behavior, set the check_subcollections
parameter to
False
when initializing the extractor.Possibly backwards incompatible changes (more or less internal API changes):
search_results
variable passed to the search.html.jinja2
template is
now an iterator of tuples, where the first element of each tuple is a result,
and the second element the URL of the result.Security fixes:
Backwards incompatible changes:
KERKO_DATA_DIR
configuration variable. KerkoApp
users don't need to worry about this as KerkoApp takes care of it, but custom
apps that did not already set this variable now have to.Features:
KERKO_DOWNLOAD_ATTACHMENT_NEW_WINDOW
configuration variable to
control whether to open documents in a new window or in the same window.Bug fixes:
Other changes:
Possibly backwards incompatible changes (more or less internal API changes):
content_with_badges
template macro as badges
, and leave it to
the caller to display content.Warning: Upgrading from version 0.4 or earlier will require that you clean and re-sync your existing search index. Use the following commands:
flask kerko clean index
flask kerko sync
Features:
KERKO_TEMPLATE_*
configuration variables for page template names.renderer
argument to kerko.specs.FacetSpec
, kerko.specs.BadgeSpec
).KERKO_RESULTS_FIELDS
configuration variable to specify which
fields to retrieve with search queries.kerko.extractors.InCollectionExtractor
, new parameters for
kerko.codecs.BooleanFacetCodec
).Bug fixes:
Other changes:
kerko index
in favor of new command kerko sync
.Possibly backwards incompatible changes (more or less internal API changes):
kerko.composer.Composer.__init__()
.kerko.composer.Composer.__init__()
arguments
default_note_whitelist_re
as default_child_whitelist_re
,
default_note_blacklist_re
as default_child_blacklist_re
.kerko.views.item()
as kerko.views.item_view()
._facet.html.jinja2
as _facets.html.jinja2
.checkboxes
in template macro field()
with add_link_icon
and remove_link_icon
.Features:
faceted^2 search browsing^0.5
.Security fixes:
Other changes:
AndNot
, AndMaybe
,
Require
were unwanted but enabled by default by Whoosh's OperatorsPlugin
).Features:
Bug fixes:
Other changes:
Possibly backwards incompatible changes (more or less internal API changes):
kerko.composer.Composer.get_ordered_specs()
replaces
get_ordered_scopes()
, get_ordered_facets()
and get_ordered_sorts()
.Version | Tag | Published |
---|---|---|
0.8.1 | 9mos ago | |
0.8 | 9mos ago | |
0.7.1 | 2yrs ago | |
0.7 | 2yrs ago |