- ZI-main.md
- The main Zotero Integration template
- runImport.md
- Template that enables updating literature notes at the click of a button, and much more.
- Meta bind button template
- Template for in-note button that executes runImport.md
-
-
Save FeralFlora/78f494c1862ce4457cef28d9d9ba5a01 to your computer and use it in GitHub Desktop.
<%* // Get citekey from 'citekey' property, or alias starting with '@' or file name const citekey = tp.frontmatter?.citekey || tp.frontmatter.aliases?.find(alias => alias.startsWith('@')) || tp.file.title; // Get the library ID from the properties. Fall back to "My Library" (1), if the library ID is not accessible const libraryID = tp.frontmatter.libraryID || 1; // Run the import app.plugins.getPlugin('obsidian-zotero-desktop-connector').runImport('IMPORT NAME', citekey, libraryID); ; %>
citekey: {{citekey}} aliases:
- "{%- if creators -%} {{creators[0].lastName or creators[0].name }} {%- if creators|length == 2 %} & {{creators[1].lastName or creators[1].name}}{% endif -%} {%- if creators|length > 2 %} et al.{% endif -%} {%- endif -%} {%- if date %} ({{date | format("YYYY")}}){% endif -%} {%- if shortTitle %} {{shortTitle | safe}} {%- else %} {{title | safe}} {%- endif -%}"{% if itemType == "bookSection" %} book-title: "{{bookTitle | replace('"',"'")}}"{% endif %} title: "{{title | replace('"',"'")}}" {%- set camelRegex = r/([a-z])([A-Z])/g %} {%- for type, creators in creators | groupby("creatorType") %} {% if creators.length > 1 %}{{type | replace(camelRegex, "$1 $2") | lower | trim}}s:{%- for creator in creators %}{% if creator.name %}
- {{creator.name}}{% else%}
- {{creator.firstName}} {{creator.lastName}} {% endif %}{%- endfor %} {% else -%} {{type | replace(camelRegex, "$1-$2") | lower | trim}}:{%- for creator in creators %}{% if creator.name %} "{{creator.name}}"{% else%} "{{creator.firstName}} {{creator.lastName}}"{% endif -%}{%- endfor -%}{% endif -%}{% endfor %} year: {% if date %}{{date | format("YYYY")}}{% endif %} item-type: {{itemType | replace(camelRegex, "$1 $2") | title | trim}} publisher: {% if publicationTitle %}"{{publicationTitle}}"{% else %}"{{publisher}}"{% endif %} {%- if notes.length > 0 -%} {%- set longShortCutoff = 20 -%} {%- set shortnotes = [] -%} {%- set longnotes = [] -%} {%- for note in notes -%} {%- if note.note | wordcount <= longShortCutoff -%} {%- set shortnotes = (shortnotes.push(note.note), shortnotes) -%} {%- else -%} {%- set longnotes = (longnotes.push(note), longnotes) -%} {%- endif -%}{%- endfor -%}{%- endif -%} {%- for comment in shortnotes %} {%- if comment and loop.first %} comments: {% endif -%}
- "{{comment|replace('"',"'")| replace("\n"," ")}}"{% endfor %} tags:{% for t in tags %}
- {{t.tag | replace(r/\s+/g, "-")}}{% endfor %}{% if DOI %} doi: https://doi.org/{{DOI}}{% endif %}{% if itemType == "book" %} ISBN: {{ISBN}}{% endif %} cssclasses:
- literature-note{% if attachments.length > 0 %}{% for attachment in attachments %}{% if loop.first %} attachments:{% endif %}
- {{attachment.path}}{% endfor %}{% endif %} libraryID: {{libraryID}}
BUTTON[update-litnote]
{% persist "notes" -%} {%- if isFirstImport %}
{# ==The following sections (Key takeaways and Processing) are not filled automatically. They are for for you to write into manually.== -#}
{#- The following is a cursor placeholder for the Templater plugin. After importing the note, you can jump to each of these with an assigned hotkey like ctrl+J #}
- <% tp.file.cursor(1) %>
- Status:: new
- Connections:: <% tp.file.cursor(4) %>
- Projects::
{% endif %}{% endpersist %}
[!info]- Info π Zotero{% if DOI %} | DOI{% endif %}{% for attachment in attachments | filterby("path", "endswith", ".pdf") %} | [PDF-{{loop.index}}](file:///{{attachment.path | replace(" ", "%20")}}){%- endfor %}
{% if bibliography %}Bibliography: {{bibliography|replace("\n","" )}}{% endif %}
Authors:: {% for a in creators %} [[03 - Source notes/People/{{a.firstName}} {{a.lastName}}|{{a.firstName}} {{a.lastName}}]]{% if not loop.last %}, {% endif %}{% endfor %}
{% if tags %}Tags: {% for t in tags %}#{{t.tag | replace(r/\s+/g, "-")}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif %}
Collections:: {% for collection in collections %}[[{{collection.name}}]]{% if not loop.last %}, {% endif %}{% endfor -%} {%- set readingSpeed = 220 %} {%- set wordsPerPage = 360 %} {%- if pages %} {%- set pageRegex = r/(\d+)-(\d+)/ %} {%- set splitPages = pageRegex.test(pages) %} {%- if splitPages %} {%- set pageMatch = pageRegex.exec(pages) %} {%- set firstPage = pageMatch[1] %} {%- set pageCount = pageMatch[2] - pageMatch[1] %} {%- else %} {%- set pageCount = pages %} {%- endif %} {%- elif numPages %} {%- set pageCount = numPages %} {%- else %} {%- set pageCount = 0 %} {% endif -%} {%- if firstPage %}
First-page:: {{firstPage}} {%- endif -%} {%- if pageCount > 0 -%} {%- set readingTime = ((pageCount* wordsPerPage)/readingSpeed)/60 %}
Page-count:: {{pageCount}}
Reading-time:: {% if readingTime < 1 %}{{(readingTime * 60) | round + " minutes"}}{% else %}{{readingTime | round(3) + " hours"}}{% endif %}{% endif %}
[!abstract]- {% if abstractNote %} {{abstractNote|replace("\n","\n>")|striptags(true)|replace("Objectives", "Objectives")|replace("Background", "Background")|replace("Methodology", "Methodology")|replace("Results","Results")|replace("Conclusion","Conclusion")}} {% endif %}
[!quote]- Citations
content: "@{{citekey}}" -file:@{{citekey}}
{%- set headingRegex = r/^#+/ -%} {%- set titleRegex = r/^#+./ -%} {%- set lineRegex = r/^.$/m %} {%- if longnotes.length > 0 -%} {%- for n in longnotes -%} {%- if n and loop.first %}
[!note]- Zotero notes ({{longnotes.length}})
Notes longer than {{longShortCutoff}} words. {%- endif %}
[!example]- Note {{loop.index}} |{%- if headingRegex.test(n.note) == true %}{{n.note | replace(n.note,titleRegex.exec(n.note))|replace(headingRegex,"")}}{% else %} {{lineRegex.exec(n.note | truncate(30))}} {% endif %} {{n.note | replace("\n", "\n>> ")| replace(titleRegex, "")}}{% if n.tags.length > 0 %}
Tags:{% for t in n.tags %} #{{t.tag}}{% if not loop.last %}, {% endif %}{% endfor %}{% endif -%}{%- if not loop.last %} {%- endif -%} {%- endfor -%}{%- endif %}
{% set colorValueMap = { "#2ea8e5": { "colorCategory": "Blue", "heading": "β Problem formulation", "symbol": "@" }, "#5fb236": { "colorCategory": "Green", "heading": "π― Key takeaways", "symbol": "$" }, "#ffd400": { "colorCategory": "Yellow", "heading": "π¬ Evidence and arguments", "symbol": "&" }, "#f19837": { "colorCategory": "Orange", "heading": "β Actionable takeaways", "symbol": "?" }, "#a28ae5": { "colorCategory": "Purple", "heading": "π§© Concepts and frameworks", "symbol": "~" }, "#e56eee": { "colorCategory": "Magenta", "heading": "πΊοΈ Context and connections", "symbol": "β¬" }, "#ff6666": { "colorCategory": "Red", "heading": "π§ Digging and disclaimers", "symbol": "!" }, "#aaaaaa": { "colorCategory": "Gray", "heading": "π Statistics and info", "symbol": "%" } } -%}
{%- macro tagFormatter(annotation) -%} {% if annotation.tags -%} {%- for t in annotation.tags %} #{{ t.tag | replace(r/\s+/g, "-") }}{% if not loop.last %}, {% endif %}{%- endfor %} {%- endif %} {%- endmacro -%}
{% persist "annotations" %} {% set annotations = annotations | filterby("date", "dateafter", lastImportDate) -%} {% if annotations.length > 0 %} Imported on [[{{importDate | format("YYYY-MM-DD")}}]] at {{importDate | format("HH:mm")}}
{%- set grouped_annotations = annotations | groupby("color") -%} {%- for color, colorValue in colorValueMap -%} {%- if color in grouped_annotations -%} {%- set annotations = grouped_annotations[color] -%} {%- for annotation in annotations -%} {%- set citationLink = '[(p. ' ~ annotation.pageLabel ~ ')](' ~ annotation.desktopURI ~ ')' %} {%- set tagString = tagFormatter(annotation) %}
{%- if annotation and loop.first %}
{% endif -%}
{%- if annotation.imageRelativePath %}
[!cite]+ Image {{citationLink}} ![[{{annotation.imageRelativePath}}]]{% if annotation.tags %} {{tagString}}{% endif %}{%- if (annotation.comment or []).indexOf("todo ") !== -1 %}
- {{annotation.comment | replace("todo ", "")}}{%- elif annotation.comment %} {{annotation.comment}}{%- endif %} {% elif (annotation.comment or []).indexOf("todo ") !== -1 %}
- {{annotation.comment | replace("todo ", "")}}:{% if not annotation.annotatedText %} {{citationLink}}{% else %}
- {{colorValue.symbol}} {{annotation.annotatedText | replace(r/\s+/g, " ")}} {{citationLink}}{{tagString}}{% endif -%} {% elif annotation.comment %}
- {{annotation.comment}}:{% if not annotation.annotatedText %} {{citationLink}}{% else %}
- {{colorValue.symbol}} {{annotation.annotatedText | replace(r/\s+/g, " ") }} {{citationLink}}{{tagString}}{% endif -%} {%- elif annotation.annotatedText %}
- {{colorValue.symbol}} {{annotation.annotatedText | replace(r/\s+/g, " ") }} {{citationLink}}{{tagString}} {%- endif -%}{%- endfor %}{%- endif -%} {% endfor -%} {% endif %}
{% endpersist %}
Hey @Bulgy404,
The reason why those annotations have no color is because the symbols at the start don't correspond to the defaults of the List Callouts plugin, which is what handles the coloring of the annotations in Obsidian. The List Callouts plugin comes with 7 preconfigured symbols that will be rendered as highlighted list callouts:
Color | List Callouts' defaults | My setup |
---|---|---|
Blue | @ |
? |
Green | $ |
$ |
Yellow | & |
& |
Orange | ? |
! |
Purple | ~ |
~ |
Magenta | no default | β¬ |
Red | ! |
Β£ |
Gray | % |
% |
Zotero includes an eigth color: Magenta. Two of your annotations are magenta, so this is why they are lacking colors in Obsidian. I'll explain the issue with the red color below.
Magenta
As mentioned in my setup guide over in the Obsidian forum, I recommend setting up a symbol -> color configuration for magenta in the List Callouts plugin's settings. The template adds the "β¬" symbol for magenta, by default, so the easiest thing is to setup a color for that symbol in the List Callout settings, but feel free to choose any symbol that works for you. Just make sure that the List callout settings and the template use the same symbols for the same colors.
Red
The other case where you're missing colors is Red. The reason for this is an oversight on my part, as it reflects my personal setup. Originally, I made the template so that all seven of the default colors worked as expected out of the box, with the Zotero colors mapped to the List Callout defaults. But since then, I've switched to using !
for orange (which means "Actionable takeaways" in my annotation system) rather than for red, and then I needed a new symbol for red. I chose Β£
for Red, but this is not part of the List Callout defaults.
This is also the reason why your orange highlights are shown as red in Obsidian.
I will change it again so that the template shared here corresponds to the List Callout defaults, so that colors will match with Zotero as expect. It will still be necessary to add a configuration for magenta, though.
The simplest solutions
- Fix Magenta: Add a List Callout configuration for the
β¬
symbol and choose magenta as the color - Fix Orange: Change the template so that the symbol for red is
!
, and the symbol for orange is?
Or, customize the symbols you use in whatever way makes sense to you (maybe ?
for whichever color you use for questions?). Just make sure that the symbol assigned in the template corresponds to what you configure in the List Callout plugin's settings.
@Bulgy404 I've now updated the gist so that the symbol-to-color mappings are again aligned with the List Callout defaults. This means that going forward, people only need to add the configuration for magenta. All the other colors should now work as expected out-of-the-box again. The template still uses β¬
for magenta.
I still recommend that people change the List Callout defaults to suit their needs, and to make the usage of the symbols more intuitively aligned with the meaning of the annotation color. Just make that the symbol-to-color mappings are the same in the List Callouts configuration and the template.
@Shade1698 & @douglasbreaks Sorry for taking so long in getting back to you. Just wanted to say thank you for reaching out, I really appreciate it, and I'm very glad to hear that my work and help has been so valuable for you. Good luck with everything, and don't hesitate to reach out again, if you need anything!
Hey, has anybody an idea why not all of my colors are, well colored?
Here is how it looks when rendered:
Here is the raw source code of the template:
citekey: {{citekey}}
aliases:
{{creators[0].lastName or creators[0].name }}
{%- if creators|length == 2 %} & {{creators[1].lastName or creators[1].name}}{% endif -%}
{%- if creators|length > 2 %} et al.{% endif -%}
{%- endif -%}
{%- if date %} ({{date | format("YYYY")}}){% endif -%}
{%- if shortTitle %} {{shortTitle | safe}} {%- else %} {{title | safe}} {%- endif -%}"{% if itemType == "bookSection" %}
book-title: "{{bookTitle | replace('"',"'")}}"{% endif %}
title: "{{title | replace('"',"'")}}"
{%- set camelRegex = r/([a-z])([A-Z])/g %}
{%- for type, creators in creators | groupby("creatorType") %}
{% if creators.length > 1 %}{{type | replace(camelRegex, "$1 $2") | lower | trim}}s:{%- for creator in creators %}{% if creator.name %}
{{type | replace(camelRegex, "$1-$2") | lower | trim}}:{%- for creator in creators %}{% if creator.name %} "{{creator.name}}"{% else%} "{{creator.firstName}} {{creator.lastName}}"{% endif -%}{%- endfor -%}{% endif -%}{% endfor %}
year: {% if date %}{{date | format("YYYY")}}{% endif %}
item-type: {{itemType | replace(camelRegex, "$1 $2") | title | trim}}
publisher: {% if publicationTitle %}"{{publicationTitle}}"{% else %}"{{publisher}}"{% endif %}
{%- if notes.length > 0 -%}
{%- set longShortCutoff = 20 -%}
{%- set shortnotes = [] -%}
{%- set longnotes = [] -%}
{%- for note in notes -%}
{%- if note.note | wordcount <= longShortCutoff -%}
{%- set shortnotes = (shortnotes.push(note.note), shortnotes) -%}
{%- else -%}
{%- set longnotes = (longnotes.push(note), longnotes) -%}
{%- endif -%}{%- endfor -%}{%- endif -%}
{%- for comment in shortnotes %}
{%- if comment and loop.first %}
comments:
{% endif -%}
tags:{% for t in tags %}
doi: https://doi.org/{{DOI}}{% endif %}{% if itemType == "book" %}
ISBN: {{ISBN}}{% endif %}
cssclasses:
attachments:{% endif %}
libraryID: {{libraryID}}
{% persist "notes" -%}
{%- if isFirstImport %}
{# ==The following sections (Key takeaways and Processing) are not filled automatically. They are for for you to write into manually.== -#}
Key takeaways
{#- The following is a cursor placeholder for the Templater plugin. After importing the note, you can jump to each of these with an assigned hotkey like ctrl+J #}
{% endif %}{% endpersist %}
{%- set headingRegex = r/^#+/ -%}
{%- set titleRegex = r/^#+./ -%}
{%- set lineRegex = r/^.$/m %}
{%- if longnotes.length > 0 -%}
{%- for n in longnotes -%}
{%- if n and loop.first %}
Reading notes
{% set colorValueMap = {
"#2ea8e5": {
"colorCategory": "Blue",
"heading": "β Problem formulation",
"symbol": "?"
},
"#5fb236": {
"colorCategory": "Green",
"heading": "π― Key takeaways",
"symbol": "$"
},
"#ffd400": {
"colorCategory": "Yellow",
"heading": "π¬ Evidence and arguments",
"symbol": "&"
},
"#f19837": {
"colorCategory": "Orange",
"heading": "β Actionable takeaways",
"symbol": "!"
},
"#a28ae5": {
"colorCategory": "Purple",
"heading": "π§© Concepts and frameworks",
"symbol": "~"
},
"#e56eee": {
"colorCategory": "Magenta",
"heading": "πΊοΈ Context and connections",
"symbol": "β¬"
},
"#ff6666": {
"colorCategory": "Red",
"heading": "π§ Digging and disclaimers",
"symbol": "Β£"
},
"#aaaaaa": {
"colorCategory": "Gray",
"heading": "π Statistics and info",
"symbol": "%"
}
} -%}
{%- macro tagFormatter(annotation) -%}
{% if annotation.tags -%}
{%- for t in annotation.tags %} #{{ t.tag | replace(r/\s+/g, "-") }}{% if not loop.last %}, {% endif %}{%- endfor %}
{%- endif %}
{%- endmacro -%}
{% persist "annotations" %}
{% set annotations = annotations | filterby("date", "dateafter", lastImportDate) -%}
{% if annotations.length > 0 %}
Imported on [[{{importDate | format("YYYY-MM-DD")}}]] at {{importDate | format("HH:mm")}}
{%- set grouped_annotations = annotations | groupby("color") -%}
{%- for color, colorValue in colorValueMap -%}
{%- if color in grouped_annotations -%}
{%- set annotations = grouped_annotations[color] -%}
{%- for annotation in annotations -%}
{%- set citationLink = '[(p. ' ~ annotation.pageLabel ~ ')](' ~ annotation.desktopURI ~ ')' %}
{%- set tagString = tagFormatter(annotation) %}
{%- if annotation and loop.first %}
{{colorValue.heading}} %% fold %%
{% endif -%}
{%- if annotation.imageRelativePath %}
{% elif annotation.comment %}
{%- elif annotation.annotatedText %}
{%- endif -%}{%- endfor %}{%- endif -%}
{% endfor -%}
{% endif %}
{% endpersist %}