sophosia
THE reference manager with features including PDF reading/annotating, Markdown/Excalidraw note-taking, project/note linking, and more...
Science Score: 31.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
○.zenodo.json file
-
○DOI references
-
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (14.7%) to scientific vocabulary
Keywords
Repository
THE reference manager with features including PDF reading/annotating, Markdown/Excalidraw note-taking, project/note linking, and more...
Basic Info
- Host: GitHub
- Owner: sophosia
- License: gpl-3.0
- Language: Vue
- Default Branch: main
- Homepage: https://sophosia.app
- Size: 104 MB
Statistics
- Stars: 129
- Watchers: 3
- Forks: 7
- Open Issues: 10
- Releases: 46
Topics
Metadata Files
README.md
Sophosia: Your Research Helper
[!NOTE]
For normal users, download Sophosia from the newest release.
If you want to contribute to Sophosia, follow the instructions below
Sophosia
Sophosia is a paper/book/note management tool. It is a reference management tool with various useful functionalities such as a built-in PDF reader, live markdown note and excalidraw note.
Manage References and Notes
You can manage your references and corresponding notes in one place. Setting favourites, modifying meta information of a reference, managing tags, searching for references... All essential functionalities are here.

Read and Annotate PDFs
PDF reader comes with an internal link peeker, no need to flip back and forward to read figures, tables and formulas now. Of course, PDF reader supports annotations, and LaTeX is supported in the annotation. Perfect for STEM researchers.

Take Notes with Markdown
WYSIWYG Markdown is the most elegant way to take notes. Together with the power of internal links, you can build your knowledge network.

Draft with Excalidraw
Free your mind using the canvas without borders. Perfect for people who like to write or draw things with a pen.

Contribute to Sophosia
Research Helper uses QUASAR as a framework. In this project, the combination of Vue.js3 and Tauri is used.
Install the dependencies
- Tauri is needed. The instructions for installing Tauri are on Tauri's official site.
- The front end will be built using Vue3. The frontend packages are listed in
package.jsonalready. Usingyarn(recommended) ornpmto install them.
```bash yarn # strongly recommended
```
Start the Tauri app in development mode (hot-code reloading, error reporting, etc.)
bash
yarn dev
To build the app
bash
yarn build
Tests
bash
yarn test:unit:ci # backend unit test
yarn test:component:ci # vue component test
Acknowledgement
This project is made possible by the following open-source projects.
- Quasar
- Tauri
- Vue.js
- citation-js
- Cytoscape
- golden-layout
- pdf.js
- konva
- vditor
- Excalidraw
Owner
- Name: Sophosia
- Login: sophosia
- Kind: organization
- Repositories: 1
- Profile: https://github.com/sophosia
Citation (citation_styles/apa.js)
export const apaStyle = `<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="never" page-range-format="expanded">
<info>
<title>American Psychological Association 7th edition</title>
<title-short>APA</title-short>
<id>http://www.zotero.org/styles/apa</id>
<link href="http://www.zotero.org/styles/apa" rel="self"/>
<link href="http://www.zotero.org/styles/apa-6th-edition" rel="template"/>
<link href="https://apastyle.apa.org/style-grammar-guidelines/references/examples" rel="documentation"/>
<author>
<name>Brenton M. Wiernik</name>
<email>zotero@wiernik.org</email>
</author>
<category citation-format="author-date"/>
<category field="psychology"/>
<category field="generic-base"/>
<updated>2023-07-16T22:56:49+00:00</updated>
<rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
</info>
<locale xml:lang="en">
<terms>
<term name="editortranslator" form="short">
<single>ed. & trans.</single>
<multiple>eds. & trans.</multiple>
</term>
<term name="translator" form="short">trans.</term>
<term name="interviewer" form="short">
<single>interviewer</single>
<multiple>interviewers</multiple>
</term>
<term name="collection-editor" form="short">
<single>ed.</single>
<multiple>eds.</multiple>
</term>
<term name="circa" form="short">ca.</term>
<term name="bc"> B.C.E.</term>
<term name="ad"> C.E.</term>
<term name="issue" form="long">
<single>issue</single>
<multiple>issues</multiple>
</term>
<term name="software">computer software</term>
</terms>
</locale>
<locale xml:lang="da">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="de">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="es">
<terms>
<term name="from">de</term>
</terms>
</locale>
<locale xml:lang="fr">
<terms>
<term name="editor" form="short">
<single>éd.</single>
<multiple>éds.</multiple>
</term>
</terms>
</locale>
<locale xml:lang="nb">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="nl">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<locale xml:lang="nn">
<terms>
<term name="et-al">et al.</term>
</terms>
</locale>
<!-- TODO: New types: classic collection document event hearing performance periodical regulation -software- standard -->
<!-- TODO: New creator roles: chair compiler contributor curator executive-producer guest host narrator organizer performer producer script-writer series-creator -->
<!-- TODO: New variables:
available-date submitted
part-number printing-number supplement-number
part-title volume-title
archive_collection
division jurisdiction
event-title
language
license
reviewed-genre
-->
<!-- TODO: New terms:
advance-online-publication
album on audio-recording
original-work-published
personal-communication
preprint
review-of
item types
-->
<!-- TODO: Check Indigeneous Knowledge format -->
<!-- General categories of item types:
Periodical: article-journal article-magazine article-newspaper post-weblog review review-book
Periodical or Booklike: paper-conference
Booklike: article book broadcast chapter classic collection dataset document
entry entry-dictionary entry-encyclopedia event figure
graphic interview manuscript map motion_picture musical_score pamphlet patent
performance periodical personal_communication post report
software song speech standard thesis webpage
Legal: bill hearing legal_case legislation regulation treaty
-->
<!-- APA references contain four parts: author, date, title, source -->
<macro name="author-bib">
<!-- TODO: New creator roles (media, contributor) -->
<!-- TODO: Add new item types -->
<names variable="composer" delimiter=", ">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<substitute>
<names variable="author"/>
<names variable="illustrator"/>
<names variable="director">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="long" prefix=" (" suffix=")" text-case="title"/>
</names>
<choose>
<if variable="container-title">
<choose>
<if type="book entry entry-dictionary entry-encyclopedia" match="any">
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
</group>
</if>
<else>
<text macro="title-and-descriptions"/>
</else>
</choose>
</if>
</choose>
</if>
</choose>
<!-- TODO: Test for editortranslator and put that first as that becomes available -->
<names variable="editor" delimiter=", ">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="short" prefix=" (" suffix=")" text-case="title"/>
</names>
<names variable="editorial-director">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="short" prefix=" (" suffix=")" text-case="title"/>
</names>
<names variable="collection-editor">
<name name-as-sort-order="all" and="symbol" sort-separator=", " initialize-with=". " delimiter=", " delimiter-precedes-last="always"/>
<label form="short" prefix=" (" suffix=")" text-case="title"/>
</names>
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
</group>
</if>
<else>
<text macro="title-and-descriptions"/>
</else>
</choose>
</substitute>
</names>
</macro>
<macro name="author-intext">
<!-- TODO: New creator roles -->
<!-- TODO: Add new item types -->
<choose>
<if type="bill legal_case legislation treaty" match="any">
<text macro="title-intext"/>
</if>
<else-if type="interview personal_communication" match="any">
<choose>
<!-- These variables indicate that the letter is retrievable by the reader.
If not, then use the APA in-text-only personal communication format -->
<if variable="archive container-title DOI publisher URL" match="none">
<group delimiter=", ">
<names variable="author">
<name and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<text macro="title-intext"/>
</substitute>
</names>
<text term="personal-communication"/>
</group>
</if>
<else>
<names variable="author" delimiter=", ">
<name form="short" and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<text macro="title-intext"/>
</substitute>
</names>
</else>
</choose>
</else-if>
<else>
<names variable="composer" delimiter=", ">
<name form="short" and="symbol" delimiter=", " initialize-with=". "/>
<substitute>
<names variable="author"/>
<names variable="illustrator"/>
<names variable="director"/>
<choose>
<if variable="container-title">
<choose>
<if type="book entry entry-dictionary entry-encyclopedia" match="any">
<text macro="title-intext"/>
</if>
</choose>
</if>
</choose>
<names variable="editor"/>
<names variable="editorial-director"/>
<text macro="title-intext"/>
</substitute>
</names>
</else>
</choose>
</macro>
<macro name="date-bib">
<!-- TODO: Add new item types -->
<group delimiter=" " prefix="(" suffix=")">
<choose>
<if is-uncertain-date="issued">
<text term="circa" form="short"/>
</if>
</choose>
<group>
<choose>
<if variable="issued">
<date variable="issued">
<date-part name="year"/>
</date>
<text variable="year-suffix"/>
<choose>
<if type="article-magazine article-newspaper broadcast interview motion_picture pamphlet personal_communication post post-weblog song speech webpage" match="any">
<!-- Many video and audio examples in manual give full dates. Err on the side of too much information. -->
<date variable="issued">
<date-part prefix=", " name="month"/>
<date-part prefix=" " name="day"/>
</date>
</if>
<else-if type="paper-conference">
<!-- Capture 'speech' stored as 'paper-conference' -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<date variable="issued">
<date-part prefix=", " name="month"/>
<date-part prefix=" " name="day"/>
</date>
</if>
</choose>
</else-if>
<!-- Only year: article article-journal book chapter entry entry-dictionary entry-encyclopedia dataset figure graphic
manuscript map musical_score paper-conference[published] patent report review review-book thesis -->
</choose>
</if>
<else-if variable="status">
<group>
<!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="lowercase"/>
<text variable="year-suffix" prefix="-"/>
</group>
</else-if>
<else>
<text term="no date" form="short"/>
<text variable="year-suffix" prefix="-"/>
</else>
</choose>
</group>
</group>
</macro>
<macro name="date-sort-group">
<!-- APA sorts 1. no-date items, 2. items with dates, 3. in-press (status) items -->
<choose>
<if variable="issued">
<text value="1"/>
</if>
<else-if variable="status">
<text value="2"/>
</else-if>
<else>
<text value="0"/>
</else>
</choose>
</macro>
<macro name="date-intext">
<!-- TODO: Add new item types -->
<choose>
<if variable="issued">
<group delimiter="/">
<group delimiter=" ">
<choose>
<if is-uncertain-date="original-date">
<text term="circa" form="short"/>
</if>
</choose>
<date variable="original-date">
<date-part name="year"/>
</date>
</group>
<group delimiter=" ">
<choose>
<if is-uncertain-date="issued">
<text term="circa" form="short"/>
</if>
</choose>
<group>
<choose>
<if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
<!-- These variables indicate that the communication is retrievable by the reader.
If not, then use the in-text-only personal communication format -->
<date variable="issued" form="text"/>
</if>
<else>
<date variable="issued">
<date-part name="year"/>
</date>
</else>
</choose>
</if>
<else>
<date variable="issued">
<date-part name="year"/>
</date>
</else>
</choose>
<text variable="year-suffix"/>
</group>
</group>
</group>
</if>
<else-if variable="status">
<!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="lowercase"/>
<text variable="year-suffix" prefix="-"/>
</else-if>
<else>
<text term="no date" form="short"/>
<text variable="year-suffix" prefix="-"/>
</else>
</choose>
</macro>
<!-- APA has two description elements following the title:
title (parenthetical) [bracketed] -->
<macro name="title-and-descriptions">
<choose>
<if variable="title">
<group delimiter=" ">
<text macro="title"/>
<text macro="parenthetical"/>
<text macro="bracketed"/>
</group>
</if>
<else>
<group delimiter=" ">
<text macro="bracketed"/>
<text macro="parenthetical"/>
</group>
</else>
</choose>
</macro>
<macro name="title">
<!-- TODO: Add new item types -->
<choose>
<if type="post webpage" match="any">
<!-- Webpages are always italicized -->
<text variable="title" font-style="italic"/>
</if>
<else-if variable="container-title" match="any">
<!-- Other types are italicized based on presence of container-title.
Assume that review and review-book are published in periodicals/blogs,
not just on a web page (ex. 69) -->
<text variable="title"/>
</else-if>
<else>
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<text variable="title" font-style="italic"/>
</if>
<else-if type="paper-conference">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<group delimiter=": " font-style="italic">
<text variable="title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</if>
<else>
<text variable="title" font-style="italic"/>
</else>
</choose>
</else-if>
<else>
<group delimiter=": " font-style="italic">
<text variable="title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</else>
</choose>
</else>
</choose>
</macro>
<macro name="title-intext">
<!-- TODO: Add new item types -->
<choose>
<if variable="title" match="none">
<text macro="bracketed-intext" prefix="[" suffix="]"/>
</if>
<else-if type="hearing">
<!-- Hearings are italicized -->
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else-if>
<else-if type="bill">
<!-- Bills are not italicized and substitute bill number if no title. -->
<choose>
<if variable="title">
<text variable="title" form="short" text-case="title"/>
</if>
<else>
<group delimiter=" ">
<text variable="genre"/>
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
<label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
</group>
</group>
</else>
</choose>
</else-if>
<else-if type="legal_case" match="any">
<!-- Cases are italicized -->
<text variable="title" font-style="italic"/>
</else-if>
<else-if type="legislation treaty" match="any">
<!-- Legislation and treaties not italicized or quoted -->
<text variable="title" form="short" text-case="title"/>
</else-if>
<else-if type="post webpage" match="any">
<!-- Webpages are always italicized -->
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else-if>
<else-if variable="container-title" match="any">
<!-- Other types are italicized or quoted based on presence of container-title. As in title macro. -->
<text variable="title" form="short" quotes="true" text-case="title"/>
</else-if>
<else>
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else>
</choose>
</macro>
<macro name="parenthetical">
<!-- TODO: Add new item types -->
<!-- (Secondary contributors; Database location; Genre no. 123; Report Series 123, Version, Edition, Volume, Page) -->
<group prefix="(" suffix=")">
<choose>
<if type="patent">
<!-- authority: U.S. ; genre: patent ; number: 123,445 -->
<group delimiter=" ">
<text variable="authority" form="short"/>
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
<text term="patent" text-case="capitalize-first"/>
</else>
</choose>
<group delimiter=" ">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</group>
</if>
<else-if type="post webpage" match="any">
<!-- For post webpage, container-title is treated as publisher -->
<group delimiter="; ">
<text macro="secondary-contributors"/>
<text macro="database-location"/>
<text macro="number"/>
<text macro="locators-booklike"/>
</group>
</else-if>
<else-if variable="container-title">
<group delimiter="; ">
<text macro="secondary-contributors"/>
<choose>
<if type="broadcast graphic map motion_picture song" match="any">
<!-- For audiovisual media, number information comes after title, not container-title -->
<text macro="number"/>
</if>
</choose>
</group>
</else-if>
<else>
<group delimiter="; ">
<text macro="secondary-contributors"/>
<text macro="database-location"/>
<text macro="number"/>
<text macro="locators-booklike"/>
</group>
</else>
</choose>
</group>
</macro>
<macro name="parenthetical-container">
<!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group prefix="(" suffix=")">
<group delimiter="; ">
<text macro="database-location"/>
<choose>
<if type="broadcast graphic map motion_picture song" match="none">
<!-- For audiovisual media, number information comes after title, not container-title -->
<text macro="number"/>
</if>
</choose>
<text macro="locators-booklike"/>
</group>
</group>
</if>
</choose>
</macro>
<macro name="bracketed">
<!-- TODO: Add new item types -->
<!-- [Descriptive information] -->
<!-- If there is a number, genre is already printed in macro="number" -->
<group prefix="[" suffix="]">
<choose>
<if variable="reviewed-author reviewed-title" type="review review-book" match="any">
<!-- Reviewed item -->
<group delimiter="; ">
<group delimiter=", ">
<group delimiter=" ">
<!-- Assume that genre is entered as 'Review of the book' or similar -->
<choose>
<if variable="number" match="none">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
<!-- TODO: Replace with term="review" -->
<!-- TODO: Handle review vs review-of depending on presence of reviewed-title -->
<!-- TODO: Add reviewed-genre -->
<text value="Review of"/>
</else>
</choose>
</if>
<else>
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<!-- TODO: Replace with term="review" -->
<!-- TODO: Handle review vs review-of depending on presence of reviewed-title -->
<!-- TODO: Add reviewed-genre -->
<text value="Review of"/>
</else>
</choose>
</else>
</choose>
<text macro="reviewed-title"/>
</group>
<names variable="reviewed-author">
<label form="verb-short" suffix=" "/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</group>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
<else-if type="thesis">
<!-- Thesis type and institution -->
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<group delimiter=", ">
<text variable="genre" text-case="capitalize-first"/>
<choose>
<if variable="archive DOI URL" match="any">
<!-- Include the university in brackets if thesis is published -->
<text variable="publisher"/>
</if>
</choose>
</group>
</if>
</choose>
<text variable="medium" text-case="capitalize-first"/>
</group>
</else-if>
<else-if variable="interviewer" type="interview" match="any">
<!-- Interview information -->
<choose>
<if variable="title">
<text macro="format"/>
</if>
<else-if variable="genre">
<group delimiter="; ">
<group delimiter=" ">
<text variable="genre" text-case="capitalize-first"/>
<group delimiter=" ">
<text term="author" form="verb"/>
<names variable="interviewer">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</group>
</group>
</group>
</else-if>
<else-if variable="interviewer">
<group delimiter="; ">
<names variable="interviewer">
<label form="verb" suffix=" " text-case="capitalize-first"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<text variable="medium" text-case="capitalize-first"/>
</group>
</else-if>
<else>
<text macro="format"/>
</else>
</choose>
</else-if>
<else-if type="personal_communication">
<!-- Letter information -->
<choose>
<if variable="recipient">
<group delimiter="; ">
<group delimiter=" ">
<choose>
<if variable="number" match="none">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</if>
<else>
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
</else>
</choose>
<names variable="recipient" delimiter=", ">
<label form="verb" suffix=" "/>
<name and="symbol" delimiter=", "/>
</names>
</group>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
<else>
<text macro="format"/>
</else>
</choose>
</else-if>
<else-if variable="composer" type="song" match="all">
<!-- Performer of classical music works -->
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<group delimiter=" ">
<choose>
<if variable="genre">
<text variable="genre" text-case="capitalize-first"/>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else-if>
<else>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else>
</choose>
</group>
</if>
<else>
<group delimiter=" ">
<choose>
<if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</if>
<else>
<!-- TODO: Replace prefix with performer label -->
<names variable="author" prefix="Recorded by ">
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
</else>
</choose>
</group>
</else>
</choose>
<choose>
<if variable="genre" match="any">
<choose>
<if variable="number" match="none">
<text variable="medium" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</else-if>
<else-if variable="container-title" match="none">
<!-- Other description -->
<text macro="format"/>
</else-if>
<else>
<!-- For conference presentations, chapters in reports, software, place bracketed after the container title -->
<choose>
<if type="paper-conference speech" match="any">
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="any">
<text macro="format"/>
</if>
</choose>
</if>
<else-if type="report software" match="none">
<text macro="format"/>
</else-if>
</choose>
</else>
</choose>
</group>
</macro>
<macro name="bracketed-intext">
<!-- TODO: Add new item types -->
<group prefix="[" suffix="]">
<choose>
<if variable="reviewed-author reviewed-title" type="review review-book" match="any">
<group delimiter=" ">
<text term="review-of" text-case="capitalize-first"/>
<text macro="reviewed-title-intext"/>
</group>
</if>
<else-if variable="interviewer" type="interview" match="any">
<names variable="interviewer">
<label form="verb" suffix=" " text-case="capitalize-first"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
<substitute>
<text macro="format-intext"/>
</substitute>
</names>
</else-if>
<else-if type="personal_communication">
<!-- Letter information -->
<choose>
<if variable="recipient">
<group delimiter=" ">
<choose>
<if variable="number" match="none">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else>
<text term="letter" text-case="capitalize-first"/>
</else>
</choose>
<names variable="recipient" delimiter=", ">
<label form="verb" suffix=" "/>
<name and="symbol" delimiter=", "/>
</names>
</group>
</if>
<else>
<text macro="format-intext"/>
</else>
</choose>
</else-if>
<else>
<text macro="format-intext"/>
</else>
</choose>
</group>
</macro>
<macro name="bracketed-container">
<!-- TODO: Add new item types -->
<group prefix="[" suffix="]">
<choose>
<if type="paper-conference speech" match="any">
<!-- Conference presentations should describe the session [container] in bracketed unless published in a proceedings -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<text macro="format"/>
</if>
</choose>
</if>
<else-if type="software" match="all">
<!-- For entries in mobile app reference works, place bracketed after the container-title -->
<text macro="format"/>
</else-if>
<else-if type="report">
<!-- For chapters in reports, place bracketed after the container title -->
<text macro="format"/>
</else-if>
</choose>
</group>
</macro>
<macro name="secondary-contributors">
<!-- TODO: Add new item types -->
<!-- TODO: Add new creator roles -->
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<text macro="secondary-contributors-periodical"/>
</if>
<else-if type="paper-conference">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<text macro="secondary-contributors-booklike"/>
</if>
<else>
<text macro="secondary-contributors-periodical"/>
</else>
</choose>
</else-if>
<else>
<text macro="secondary-contributors-booklike"/>
</else>
</choose>
</macro>
<macro name="secondary-contributors-periodical">
<group delimiter="; ">
<choose>
<if variable="title">
<names variable="interviewer" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</if>
</choose>
<names variable="translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</macro>
<macro name="secondary-contributors-booklike">
<!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if variable="title">
<names variable="interviewer">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</if>
</choose>
<!-- TODO: When editortranslator becomes available, add a test: variable="editortranslator" match="none"; then print translator -->
<choose>
<if type="post webpage" match="none">
<!-- Webpages treat container-title like publisher -->
<choose>
<if variable="container-title" match="none">
<group delimiter="; ">
<names variable="container-author">
<label form="verb-short" suffix=" " text-case="title"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<names variable="editor translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</if>
</choose>
</if>
<else>
<group delimiter="; ">
<names variable="container-author">
<label form="verb-short" suffix=" " text-case="title"/>
<name and="symbol" initialize-with=". " delimiter=", "/>
</names>
<names variable="editor translator" delimiter="; ">
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" prefix=", " text-case="title"/>
</names>
</group>
</else>
</choose>
</group>
</macro>
<macro name="database-location">
<choose>
<if variable="archive-place" match="none">
<!-- With 'archive-place': physical archives. Without: online archives. -->
<!-- TODO: Add archive_collection -->
<text variable="archive_location"/>
</if>
</choose>
</macro>
<macro name="number">
<!-- TODO: Add new item types -->
<choose>
<if variable="number">
<group delimiter=", ">
<group delimiter=" ">
<text variable="genre" text-case="title"/>
<choose>
<if is-numeric="number">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</if>
<else>
<text variable="number"/>
</else>
</choose>
</group>
<choose>
<if type="thesis">
<choose>
<!-- Include the university in brackets if thesis is published -->
<if variable="archive DOI URL" match="any">
<text variable="publisher"/>
</if>
</choose>
</if>
</choose>
</group>
</if>
</choose>
</macro>
<macro name="locators-booklike">
<!-- TODO: Add new item types -->
<choose>
<if type="article-journal article-magazine article-newspaper broadcast interview patent post post-weblog review review-book speech webpage" match="any"/>
<else-if type="paper-conference">
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<group delimiter=", ">
<text macro="version"/>
<text macro="edition"/>
<text macro="volume-booklike"/>
</group>
</if>
</choose>
</else-if>
<else>
<group delimiter=", ">
<text macro="version"/>
<text macro="edition"/>
<text macro="volume-booklike"/>
</group>
</else>
</choose>
</macro>
<macro name="version">
<choose>
<if is-numeric="version">
<group delimiter=" ">
<label variable="version" text-case="capitalize-first"/>
<text variable="version"/>
</group>
</if>
<else>
<text variable="version"/>
</else>
</choose>
</macro>
<macro name="edition">
<choose>
<if is-numeric="edition">
<group delimiter=" ">
<number variable="edition" form="ordinal"/>
<label variable="edition" form="short"/>
</group>
</if>
<else>
<text variable="edition"/>
</else>
</choose>
</macro>
<macro name="volume-booklike">
<!-- TODO: Add new item types -->
<group delimiter=", ">
<!-- Report series [ex. 52] -->
<choose>
<if type="report">
<group delimiter=" ">
<text variable="collection-title" text-case="title"/>
<text variable="collection-number"/>
</group>
</if>
</choose>
<choose>
<if variable="volume" match="any">
<!-- TODO: Update using volume-title -->
<choose>
<!-- Non-numeric volumes are already printed as part of the book title -->
<if is-numeric="volume" match="none"/>
<else>
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<number variable="volume" form="numeric"/>
</group>
</else>
</choose>
</if>
<else>
<group>
<label variable="number-of-volumes" form="short" text-case="capitalize-first" suffix=" "/>
<text term="page-range-delimiter" prefix="1"/>
<number variable="number-of-volumes" form="numeric"/>
</group>
</else>
</choose>
<group delimiter=" ">
<label variable="issue" text-case="capitalize-first"/>
<text variable="issue"/>
</group>
<group delimiter=" ">
<label variable="page" form="short" suffix=" "/>
<text variable="page"/>
</group>
</group>
</macro>
<macro name="reviewed-title">
<choose>
<if variable="reviewed-title">
<!-- Not possible to distinguish TV series episode from other reviewed
works [Ex. 69] -->
<text variable="reviewed-title" font-style="italic"/>
</if>
<else>
<!-- Assume title is title of reviewed work -->
<text variable="title" font-style="italic"/>
</else>
</choose>
</macro>
<macro name="reviewed-title-intext">
<choose>
<if variable="reviewed-title">
<!-- Not possible to distinguish TV series episode from other reviewed works [Ex. 69] -->
<text variable="reviewed-title" form="short" font-style="italic" text-case="title"/>
</if>
<else>
<!-- Assume title is title of reviewed work -->
<text variable="title" form="short" font-style="italic" text-case="title"/>
</else>
</choose>
</macro>
<macro name="format">
<!-- TODO: Add new item types -->
<choose>
<if variable="genre medium" match="any">
<group delimiter="; ">
<choose>
<if variable="number" match="none">
<text variable="genre" text-case="capitalize-first"/>
</if>
</choose>
<text variable="medium" text-case="capitalize-first"/>
</group>
</if>
<!-- Generic labels for specific types -->
<!-- TODO: Add terms for other types? -->
<else-if type="dataset">
<text term="dataset"/>
</else-if>
<else-if type="software">
<text term="software" text-case="capitalize-first"/>
</else-if>
<else-if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
<text term="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
</else-if>
</choose>
</else-if>
<else-if type="map">
<text term="map" text-case="capitalize-first"/>
</else-if>
</choose>
</macro>
<macro name="format-intext">
<!-- TODO: Add new item types -->
<choose>
<if variable="genre" match="any">
<text variable="genre" text-case="capitalize-first"/>
</if>
<else-if variable="medium">
<text variable="medium" text-case="capitalize-first"/>
</else-if>
<!-- Generic labels for specific types -->
<!-- TODO: Add terms for other types? -->
<else-if type="dataset">
<text term="dataset"/>
</else-if>
<else-if type="software">
<text term="software" text-case="capitalize-first"/>
</else-if>
<else-if type="interview personal_communication" match="any">
<choose>
<if variable="archive container-title DOI publisher URL" match="none">
<text term="personal-communication" text-case="capitalize-first"/>
</if>
<else-if type="interview">
<text term="interview" text-case="capitalize-first"/>
</else-if>
</choose>
</else-if>
<else-if type="map">
<text term="map"/>
</else-if>
</choose>
</macro>
<!-- APA 'source' element contains four parts:
container, event, publisher, access -->
<macro name="container">
<!-- TODO: Add new item types -->
<choose>
<if type="article-journal article-magazine article-newspaper post-weblog review review-book" match="any">
<!-- Periodical items -->
<text macro="container-periodical"/>
</if>
<else-if type="paper-conference">
<!-- Determine if paper-conference is a periodical or booklike -->
<choose>
<if variable="editor editorial-director collection-editor container-author" match="any">
<text macro="container-booklike"/>
</if>
<else>
<text macro="container-periodical"/>
</else>
</choose>
</else-if>
<else-if type="post webpage" match="none">
<!-- post and webpage treat container-title like publisher -->
<text macro="container-booklike"/>
</else-if>
</choose>
</macro>
<macro name="container-periodical">
<group delimiter=". ">
<group delimiter=", ">
<text variable="container-title" font-style="italic" text-case="title"/>
<choose>
<if variable="volume">
<group>
<text variable="volume" font-style="italic"/>
<text variable="issue" prefix="(" suffix=")"/>
</group>
</if>
<else>
<text variable="issue" font-style="italic"/>
</else>
</choose>
<choose>
<if variable="number">
<!-- Ex. 6: Journal article with article number or eLocator -->
<!-- This should be localized -->
<group delimiter=" ">
<text term="article-locator" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</if>
<else>
<text variable="page"/>
</else>
</choose>
</group>
<choose>
<if variable="issued">
<choose>
<if variable="issue page volume" match="none">
<!-- TODO: Should I print status as-is, or should I print the in-press term? -->
<text variable="status" text-case="capitalize-first"/>
</if>
</choose>
</if>
</choose>
</group>
</macro>
<macro name="container-booklike">
<!-- TODO: Add new item types -->
<choose>
<if variable="container-title" match="any">
<group delimiter=" ">
<text term="in" text-case="capitalize-first"/>
<group delimiter=", ">
<names variable="editor translator" delimiter=", & ">
<!-- TODO: Change to editortranslator and move editor to substitute -->
<name and="symbol" initialize-with=". " delimiter=", "/>
<label form="short" text-case="title" prefix=" (" suffix=")"/>
<substitute>
<names variable="editorial-director"/>
<names variable="collection-editor"/>
<names variable="container-author"/>
</substitute>
</names>
<group delimiter=": " font-style="italic">
<text variable="container-title"/>
<!-- TODO: Replace with volume-title -->
<choose>
<if is-numeric="volume" match="none">
<group delimiter=" ">
<label variable="volume" form="short" text-case="capitalize-first"/>
<text variable="volume"/>
</group>
</if>
</choose>
</group>
</group>
<text macro="parenthetical-container"/>
<text macro="bracketed-container"/>
</group>
</if>
</choose>
</macro>
<macro name="publisher">
<!-- TODO: Add new item types -->
<group delimiter="; ">
<choose>
<if type="thesis">
<choose>
<if variable="archive DOI URL" match="none">
<text variable="publisher"/>
</if>
</choose>
</if>
<else-if type="post webpage" match="any">
<!-- For websites, treat container title like publisher -->
<group delimiter="; ">
<text variable="container-title" text-case="title"/>
<text variable="publisher"/>
</group>
</else-if>
<else-if type="paper-conference">
<!-- For paper-conference, don't print publisher if in a journal-like proceedings -->
<choose>
<if variable="collection-editor editor editorial-director" match="any">
<text variable="publisher"/>
</if>
</choose>
</else-if>
<else-if type="article-journal article-magazine article-newspaper post-weblog" match="none">
<text variable="publisher"/>
</else-if>
</choose>
<group delimiter=", ">
<choose>
<if variable="archive-place">
<!-- With 'archive-place': physical archives. Without: online archives. -->
<!-- For physical archives, print the location before the archive name.
For electronic archives, these are printed in macro="description". -->
<!-- TODO: Split "archive_location" into "archive_collection" and "archive_location" -->
<!-- Must test for archive_collection:
With collection: archive_collection (archive_location), archive, archive-place
No collection: archive (archive_location), archive-place
-->
<text variable="archive_location"/>
</if>
</choose>
<text variable="archive"/>
<text variable="archive-place"/>
</group>
</group>
</macro>
<macro name="access">
<choose>
<if variable="DOI" match="any">
<text variable="DOI" prefix="https://doi.org/"/>
</if>
<else-if variable="URL">
<group delimiter=" ">
<choose>
<if variable="issued status" match="none">
<group delimiter=" ">
<text term="retrieved" text-case="capitalize-first"/>
<date variable="accessed" form="text" suffix=","/>
<text term="from"/>
</group>
</if>
</choose>
<text variable="URL"/>
</group>
</else-if>
</choose>
</macro>
<macro name="event">
<!-- TODO: Add new item types (e.g., event, collection, performance) -->
<choose>
<if variable="event event-title" match="any">
<!-- To prevent Zotero from printing event-place due to its double-mapping of all 'place' to
both publisher-place and event-place. Remove this 'choose' when that is changed. -->
<choose>
<if variable="collection-editor editor editorial-director issue page volume" match="none">
<!-- Don't print event info if published in a proceedings -->
<group delimiter=", ">
<text macro="event-title"/>
<text variable="event-place"/>
</group>
</if>
</choose>
</if>
</choose>
</macro>
<macro name="event-title">
<choose>
<!-- TODO: We expect "event-title" to be used,
but processors and applications may not be updated yet.
This macro ensures that either "event" or "event-title" can be accpeted.
Remove if procesor logic and application adoption can handle this. -->
<if variable="event-title">
<text variable="event-title"/>
</if>
<else>
<text variable="event"/>
</else>
</choose>
</macro>
<!-- After 'source', APA also prints publication history (original publication, reprint info, retraction info) -->
<macro name="publication-history">
<!-- TODO: Add new item types -->
<choose>
<if type="patent" match="none">
<group prefix="(" suffix=")">
<choose>
<if variable="references">
<!-- This provides the option for more elaborate description
of publication history, such as full "reprinted" references
(examples 11, 43, 44) or retracted references -->
<text variable="references"/>
</if>
<else>
<!-- TODO: Replace these with terms -->
<group delimiter=" ">
<text term="original-work-published" text-case="capitalize-first"/>
<choose>
<if is-uncertain-date="original-date">
<text term="circa" form="short"/>
</if>
</choose>
<date variable="original-date">
<date-part name="year"/>
</date>
</group>
</else>
</choose>
</group>
</if>
<else>
<text variable="references" prefix="(" suffix=")"/>
</else>
</choose>
</macro>
<!-- Legal citations have their own rules -->
<macro name="legal-cites">
<!-- TODO: Add new item types -->
<choose>
<if type="treaty">
<!-- APA generally defers to Bluebook for legal citations, but diverges without
explanation for treaty items. The Bluebook format that was used in APA 6th
ed. is used here. -->
<group delimiter=", ">
<text variable="title" text-case="title"/>
<names variable="author">
<name initialize-with="." form="short" delimiter="-"/>
</names>
<text macro="date-legal"/>
<text macro="container-legal"/>
<text macro="access"/>
</group>
</if>
<else>
<!-- For 'bill': currently designed to handle bills, resolutions, federal reports. -->
<!-- For 'legislation': currently designed to handle statutes, codified regulations, executive orders. -->
<group delimiter=". ">
<group delimiter=", ">
<choose>
<if type="bill legal_case legislation" match="any">
<text variable="title"/>
</if>
<else-if type="hearing">
<text variable="title" font-style="italic"/>
</else-if>
</choose>
<group delimiter=" ">
<text macro="container-legal"/>
<text macro="date-legal"/>
<choose>
<if type="hearing">
<names variable="author" prefix="(testimony of " suffix=")">
<!-- TODO: Localize this with the hearing term. -->
<name and="symbol" delimiter=", "/>
</names>
</if>
<else-if type="bill legislation" match="any">
<!-- 'legislation': For uncodified regulations, assume future code section is in status. -->
<text variable="status" prefix="(" suffix=")"/>
</else-if>
</choose>
</group>
<text variable="references"/>
</group>
<text macro="access"/>
</group>
</else>
</choose>
</macro>
<macro name="date-legal">
<!-- TODO: Add new item types -->
<choose>
<if type="legal_case">
<group prefix="(" suffix=")" delimiter=" ">
<text variable="authority"/>
<choose>
<if variable="container-title" match="any">
<!-- Print only year for cases published in reporters-->
<date variable="issued" form="numeric" date-parts="year"/>
</if>
<else>
<date variable="issued" form="text"/>
</else>
</choose>
</group>
</if>
<else-if type="bill legislation hearing" match="any">
<group prefix="(" suffix=")" delimiter=" ">
<group delimiter=" ">
<date variable="original-date">
<date-part name="year"/>
</date>
<text term="and" form="symbol"/>
</group>
<date variable="issued">
<date-part name="year"/>
</date>
</group>
</else-if>
<else-if type="treaty">
<date variable="issued" form="text"/>
</else-if>
</choose>
</macro>
<macro name="container-legal">
<!-- TODO: Add new item types -->
<!-- Expect legal item container-titles to be stored in short form -->
<choose>
<if type="legal_case">
<group delimiter=" ">
<choose>
<if variable="container-title">
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<group delimiter=" ">
<label variable="section" form="symbol"/>
<text variable="section"/>
</group>
<choose>
<if variable="page page-first" match="any">
<text variable="page-first"/>
</if>
<else>
<text value="___"/>
</else>
</choose>
</group>
</if>
<else>
<group delimiter=" ">
<choose>
<if is-numeric="number">
<label variable="number" form="short" text-case="capitalize-first"/>
</if>
</choose>
<text variable="number"/>
</group>
</else>
</choose>
</group>
</if>
<else-if type="bill">
<group delimiter=", ">
<group delimiter=" ">
<text variable="genre"/>
<group delimiter=" ">
<choose>
<if variable="chapter-number container-title" match="none">
<label variable="number" form="short"/>
</if>
</choose>
<text variable="number"/>
</group>
</group>
<text variable="authority"/>
<text variable="chapter-number"/>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<text variable="page-first"/>
</group>
</group>
</else-if>
<else-if type="legislation">
<choose>
<if variable="number">
<!--There's a public law number-->
<group delimiter=", ">
<text variable="number" prefix="Pub. L. No. "/>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<text variable="page-first"/>
</group>
</group>
</if>
<else>
<group delimiter=" ">
<text variable="volume"/>
<text variable="container-title"/>
<choose>
<if variable="section">
<group delimiter=" ">
<!-- TODO: Change to label variable="section" -->
<text term="section" form="symbol"/>
<text variable="section"/>
</group>
</if>
<else>
<text variable="page-first"/>
</else>
</choose>
</group>
</else>
</choose>
</else-if>
<else-if type="treaty">
<group delimiter=" ">
<number variable="volume"/>
<text variable="container-title"/>
<choose>
<if variable="page page-first" match="any">
<text variable="page-first"/>
</if>
<else>
<group delimiter=" ">
<label variable="number" form="short" text-case="capitalize-first"/>
<text variable="number"/>
</group>
</else>
</choose>
</group>
</else-if>
</choose>
</macro>
<macro name="citation-locator">
<!-- TODO: Add new locator types? -->
<group delimiter=" ">
<choose>
<if locator="chapter">
<label variable="locator" text-case="capitalize-first"/>
</if>
<else>
<label variable="locator" form="short"/>
</else>
</choose>
<text variable="locator"/>
</group>
</macro>
<citation et-al-min="3" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" collapse="year" givenname-disambiguation-rule="primary-name-with-initials">
<sort>
<key macro="author-bib" names-min="3" names-use-first="1"/>
<key macro="date-sort-group"/>
<key macro="date-bib" sort="ascending"/>
<key variable="status"/>
</sort>
<layout prefix="(" suffix=")" delimiter="; ">
<group delimiter=", ">
<text macro="author-intext"/>
<text macro="date-intext"/>
<text macro="citation-locator"/>
</group>
</layout>
</citation>
<bibliography hanging-indent="true" et-al-min="21" et-al-use-first="19" et-al-use-last="true" entry-spacing="0" line-spacing="2">
<sort>
<key macro="author-bib"/>
<key macro="date-sort-group"/>
<key macro="date-bib" sort="ascending"/>
<key variable="status"/>
<key macro="title"/>
</sort>
<layout>
<choose>
<!-- TODO: Add new item types -->
<if type="bill legal_case legislation treaty" match="any">
<!-- Legal items have different orders and delimiters -->
<choose>
<if variable="DOI URL" match="any">
<text macro="legal-cites"/>
</if>
<else>
<text macro="legal-cites" suffix="."/>
</else>
</choose>
</if>
<else>
<group delimiter=" ">
<group delimiter=". " suffix=".">
<text macro="author-bib"/>
<text macro="date-bib"/>
<text macro="title-and-descriptions"/>
<text macro="container"/>
<text macro="event"/>
<text macro="publisher"/>
</group>
<text macro="access"/>
<text macro="publication-history"/>
</group>
</else>
</choose>
</layout>
</bibliography>
</style>`;
GitHub Events
Total
- Create event: 10
- Release event: 6
- Issues event: 4
- Watch event: 31
- Delete event: 5
- Issue comment event: 9
- Push event: 8
- Pull request event: 10
- Fork event: 2
Last Year
- Create event: 10
- Release event: 6
- Issues event: 4
- Watch event: 31
- Delete event: 5
- Issue comment event: 9
- Push event: 8
- Pull request event: 10
- Fork event: 2
Dependencies
- actions/checkout v3 composite
- actions/setup-node v3 composite
- 408 dependencies
- @intlify/vite-plugin-vue-i18n ^3.3.1 development
- @quasar/app-vite ^1.3.0 development
- @quasar/quasar-app-extension-testing ^2.2.0 development
- @quasar/quasar-app-extension-testing-e2e-cypress ^5.1.1 development
- @quasar/quasar-app-extension-testing-unit-vitest ^0.4.0 development
- @tauri-apps/cli ^1.5.6 development
- @types/cytoscape ^3.19.10 development
- @types/lodash ^4.14.197 development
- @types/node ^12.20.21 development
- @types/react ^18.2.21 development
- @typescript-eslint/eslint-plugin ^5.10.0 development
- @typescript-eslint/parser ^5.10.0 development
- @vitejs/plugin-react ^4.0.4 development
- @vitejs/plugin-vue 2.3.3 development
- @vitest/ui ^0.34.6 development
- @vue/test-utils ^2.4.1 development
- autoprefixer ^10.4.2 development
- cypress ^12.17.4 development
- eslint ^8.10.0 development
- eslint-config-prettier ^8.1.0 development
- eslint-plugin-cypress ^2.14.0 development
- eslint-plugin-vue ^9.0.0 development
- fake-indexeddb ^5.0.1 development
- prettier ^2.5.1 development
- typescript ^5.1.6 development
- vitest ^0.34.0 development
- @citation-js/plugin-isbn ^0.4.0
- @excalidraw/excalidraw ^0.15.3
- @quasar/extras ^1.16.4
- @tauri-apps/api ^1.5.1
- citation-js ^0.6.8
- cytoscape ^3.26.0
- cytoscape-cola ^2.5.1
- golden-layout ^2.6.0
- idb ^7.1.1
- konva ^9.2.0
- lodash ^4.17.21
- nanoid ^5.0.3
- pdfjs-dist ^3.10.111
- pinia ^2.0.11
- quasar ^2.6.0
- react ^18.2.0
- react-dom ^18.2.0
- tauri-plugin-fs-extra-api https://github.com/tauri-apps/tauri-plugin-fs-extra#v1
- vditor ^3.9.4
- veaury ^2.3.12
- vue ^3.0.0
- vue-i18n ^9.2.2
- vue-router ^4.0.0
- 961 dependencies
- actions/checkout v4 composite
- actions/setup-node v4 composite
- dtolnay/rust-toolchain stable composite
- tauri-apps/tauri-action v0 composite