Filter

The following options affect only the render and export commands.

--filter <[OP]{FIELD}:{QUERY}>

Filter books/annotations before outputting.

Filtering allows you to specify, to a certain degree, which books and/or annotations to output. Currently, this is available for the export and render commands.

For example, this filter would only render annotations where its respective book's title is exactly the art spirit AND their tags contain the #star tag.

readstor render \
    --extract-tags \
    --filter "=title:the art spirit" \
    --filter "tag:#star"

This filter would export annotations where its respective book's author contains the string krishnamurti AND their tags contain either #star or #love.

readstor export \
    --extract-tags \
    --filter "author:krishnmurti" \
    --filter "?tag:#star #love"

Note that filters are case-insensitive.

Filter Results

After all the filters are run, a confirmation prompt is shown with a brief summary of the filtered down books/annotations.

$ readstor render \
    --extract-tags \
    --filter "=title:the art spirit" \
    --filter "tag:#star"
...
   ----------------------------------------------------------------
   Found 9 annotations from 2 books:
    • Think on These Things by Krishnamurti
    • The Art Spirit by Robert Henri
   ----------------------------------------------------------------
   Continue? [y/N]: █

This prompt can be auto-confirmed by passing the --auto-confirm-filter flag.

Filter Syntax

A filter consists of three parts: an optional operator, a field and a query. The syntax structure is as follows:

[operator]{field}:{query}

For example, looking at part of the command from above, we can see the three district parts of a filter:

readstor render \
    --extract-tags \
    --filter "=title:the art spirit" \
              │└──┬┘ └───────────┬┘
              │   │              │
              │   │              └────────── query: the art spirit
              │   └───────────────────────── field: title
              └────────────────────────── operator: = (exact)
    --filter "tag:#star"
              └┬┘ └──┬┘
               │     │
               │     └────────────────────── query: #star
               └──────────────────────────── field: tag
                                operator (default): ? (any)

Operator

The operator token determines how matching will be handled against the query.

Nameoperator
DescriptionThe match operation to use when filtering.
Valid Values?(any) * (all) = (exact)
RequiredNo
Default? (any)

When a filter is processed, the query is split on its spaces to create its component queries. For example, the input string the art sprit turns into three parts: the, art and spirit, and depending on the operator these three parts are handled differently in order to determine if an annotation is filtered out or not.

OperatorNameDescription
?AnyMatches if any part of the split query is a match.
*AllMatches if all parts of the split query are a match.
=ExactMatches if the original unsplit query is an exact match.

Note that when searching for an exact match in the tags field i.e. =tags:[query], the query remains split and the set of tags in the query is compared to those in each annotation.

Field

The field token determines which field to run the filter on.

Namefield
DescriptionThe field to use for filtering.
Valid Valuestitle author tags
RequiredYes
Default-

Currently, only three fields are supported:

NameSearchesDescription
titlebooksThe title of the book.
authorbooksThe author of the book.
tagsannotationsThe annotation's #tags.

Query

The query string determines what will be searched in the specified field. A query is a space delineated set of words where each word can potentially be a separate search term depending on the specified operator.

Namequery
DescriptionA space delineated query string.
Valid ValuesAny
RequiredYes
Default-

--auto-confirm-filter

Auto-confirm Filter Results.