You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-12-23 23:33:01 +02:00
Compare commits
29 Commits
release-2.
...
table_edit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b519d55abf | ||
|
|
c7697b65ca | ||
|
|
3bb00956fe | ||
|
|
e3695c6a80 | ||
|
|
40bc63e7ea | ||
|
|
c320d2364e | ||
|
|
fb9e78d6c1 | ||
|
|
5a862443d8 | ||
|
|
27ef917350 | ||
|
|
2dedede5c3 | ||
|
|
443e049022 | ||
|
|
b4c3ba249d | ||
|
|
46f146309d | ||
|
|
541203f919 | ||
|
|
8495045ada | ||
|
|
64c3784a8b | ||
|
|
ff897236f7 | ||
|
|
53206d5488 | ||
|
|
1eeefb942d | ||
|
|
87296a616a | ||
|
|
6c0f3c3578 | ||
|
|
c1fb9fb3f5 | ||
|
|
466a534fcd | ||
|
|
30e191663d | ||
|
|
70cd2395fb | ||
|
|
2f1b6fbee1 | ||
|
|
8c0d4a0f71 | ||
|
|
bc08c6dcc3 | ||
|
|
a06365039d |
@@ -421,6 +421,9 @@ packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js.map
|
||||
@@ -688,6 +691,9 @@ packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js.map
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.d.ts
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.js
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.js.map
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.d.ts
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.js
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.js.map
|
||||
packages/app-desktop/gui/TagList.d.ts
|
||||
packages/app-desktop/gui/TagList.js
|
||||
packages/app-desktop/gui/TagList.js.map
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -411,6 +411,9 @@ packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/styles/index.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/index.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/tables.js.map
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.d.ts
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js
|
||||
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/utils/types.js.map
|
||||
@@ -678,6 +681,9 @@ packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js.map
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.d.ts
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.js
|
||||
packages/app-desktop/gui/SyncWizard/Dialog.js.map
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.d.ts
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.js
|
||||
packages/app-desktop/gui/TableEditorDialog/Dialog.js.map
|
||||
packages/app-desktop/gui/TagList.d.ts
|
||||
packages/app-desktop/gui/TagList.js
|
||||
packages/app-desktop/gui/TagList.js.map
|
||||
|
||||
@@ -1,4 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Joplin]]></title><description><![CDATA[Joplin, the open source note-taking application]]></description><link>https://joplinapp.org</link><generator>RSS for Node</generator><lastBuildDate>Sun, 22 May 2022 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Sun, 22 May 2022 00:00:00 GMT</pubDate><item><title><![CDATA[Joplin received 6 Contributor Projects for GSoC 2022!]]></title><description><![CDATA[<p>We are glad to announce that Google allocated us six projects this year for Google Summer of Code! So this is six contributors who will be working on various parts of the apps, both desktop and mobile, over the summer.</p>
|
||||
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Joplin]]></title><description><![CDATA[Joplin, the open source note-taking application]]></description><link>https://joplinapp.org</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Jun 2022 00:00:00 GMT</lastBuildDate><atom:link href="https://joplinapp.org/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jun 2022 00:00:00 GMT</pubDate><item><title><![CDATA[Joplin 2.8 is available!]]></title><description><![CDATA[<p>As always a lot of changes and new features in this new version available on both desktop and mobile.</p>
|
||||
<h1>Multiple profile support<a name="multiple-profile-support" href="#multiple-profile-support" class="heading-anchor">🔗</a></h1>
|
||||
<p>Perhaps the most visible change in this version is the support for multiple profiles. You can now create as many application profile as you wish, each with their own settings, and easily switch from one to another. The main use case is to support for example a "work" profile and a "personal" profile, to allow you to keep things independent, and each profile can sync with a different sync target.</p>
|
||||
<p>To create a new profile, open <strong>File > Switch profile</strong> and select <strong>Create new profile</strong>, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.</p>
|
||||
<p>To switch back to the previous profile, again open <strong>File > Switch profile</strong> and select <strong>Default</strong>.</p>
|
||||
<p>Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.</p>
|
||||
<p>The feature is available on desktop only for now, and should be ported to mobile relatively soon.</p>
|
||||
<h1>Save Mermaid graph as PNG/SVG<a name="save-mermaid-graph-as-png-svg" href="#save-mermaid-graph-as-png-svg" class="heading-anchor">🔗</a></h1>
|
||||
<p>This convenient feature allows exporting a Mermaid graph as a PNG or SVG image, or allows copying the image as a DataUrl, which can then be pasted in any compatible text editor. Thanks Asrient for implementing this!</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220606-mermaid-as-png.png" alt=""></p>
|
||||
<h1>Publish a mini-website using Joplin Cloud<a name="publish-a-mini-website-using-joplin-cloud" href="#publish-a-mini-website-using-joplin-cloud" class="heading-anchor">🔗</a></h1>
|
||||
<p>Joplin Cloud now supports publishing a note "recursively", which means the notes and all the notes it is linked to. This allows easily publishing a simple website made of multiples and images.</p>
|
||||
<p>To make use of this feature, simply select <strong>Also publish linked notes</strong> when publishing a note.</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20220606-publish-website.png" alt=""></p>
|
||||
<h1>And more!<a name="and-more" href="#and-more" class="heading-anchor">🔗</a></h1>
|
||||
<p>In total there are 38 changes to improve the app reliability, security and usability. Full changelog is at <a href="https://joplinapp.org/changelog/">https://joplinapp.org/changelog/</a></p>
|
||||
]]></description><link>https://joplinapp.org/news/20220606-release-2-8/</link><guid isPermaLink="false">20220606-release-2-8</guid><pubDate>Mon, 06 Jun 2022 00:00:00 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Joplin received 6 Contributor Projects for GSoC 2022!]]></title><description><![CDATA[<p>We are glad to announce that Google allocated us six projects this year for Google Summer of Code! So this is six contributors who will be working on various parts of the apps, both desktop and mobile, over the summer.</p>
|
||||
<p>Over the next few weeks, till 13 June, will be the Community Bonding Period during which GSoC contributors get to know mentors, read documentation, and get up to speed to begin working on their projects.</p>
|
||||
<p>Here's the full list of projects, contributors and mentors.</p>
|
||||
<table class="table">
|
||||
@@ -242,38 +258,4 @@
|
||||
<p>So far I have "Your notes, anywhere you are" but I'm not certain that's particularly inspiring. Any other idea about what tagline could be used?</p>
|
||||
]]></description><link>https://joplinapp.org/news/20210705-094247/</link><guid isPermaLink="false">20210705-094247</guid><pubDate>Mon, 05 Jul 2021 09:42:47 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Poll: What's the size of your note collection?]]></title><description><![CDATA[<p>Poll is on the forum:</p>
|
||||
<p><a href="https://discourse.joplinapp.org/t/poll-whats-the-size-of-your-note-collection/18191">https://discourse.joplinapp.org/t/poll-whats-the-size-of-your-note-collection/18191</a></p>
|
||||
]]></description><link>https://joplinapp.org/news/20210624-171844/</link><guid isPermaLink="false">20210624-171844</guid><pubDate>Thu, 24 Jun 2021 17:18:44 GMT</pubDate><twitter-text></twitter-text></item><item><title><![CDATA[Share notebooks and collaborate on them using Joplin Server 2.0]]></title><description><![CDATA[<p>Since a few versions Joplin Server includes a way to share notebooks between users and collaborate on them - i.e. any participant can view or modify notes in the shared notebook. It's been present since version 2.x and the feature is getting close to be stable.</p>
|
||||
<p><strong>How does it work?</strong></p>
|
||||
<p>When connected to Joplin Server (or the upcoming Joplin Cloud service), a new "Share notebook" menu item is available when right-clicking on a notebook.</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_0.png" alt=""></p>
|
||||
<p>Click on it, and it will display a new dialog where you can add any number of recipients. Those recipients also need to be on the same Joplin Server instance. From this dialog you can also remove a recipient or unshare the whole notebook, in which case it will be removed from everybody's note collection, except yours.</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_1.png" alt=""></p>
|
||||
<p>Once this is done, the recipient(s) will receive a notification in Joplin the next time they synchronise their data:</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_2.png" alt=""></p>
|
||||
<p>Then, finally, once the invitation is accepted, Joplin will download all the shared notebooks and notes. A shared notebook is denoted by the usual Share icon. Now the invited user can read or modify the shared notes, add attachments, etc. and the changes will be visible to everyone with access to the notebook.</p>
|
||||
<p><img src="https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/news/20210621-104753_3.png" alt=""></p>
|
||||
<p><strong>What's the availability of the notebook sharing feature?</strong></p>
|
||||
<p>The notebook sharing feature is available on Joplin Server and Joplin Cloud.</p>
|
||||
<p>On desktop, you can share notebooks and of course view or modify any notebook that has been shared with you.</p>
|
||||
<p>On mobile and CLI, you cannot currently share notebooks, but you can view or modify any notebook that has been shared with you.</p>
|
||||
<p><strong>If I share a notebook with someone, what access do they have?</strong></p>
|
||||
<p>Currently they have full access to the data, including reading, writing and deleting notebooks or notes. In a future version, access control might be implemented. For example, to only give read-only access to the shared notebook.</p>
|
||||
<p><strong>What can actually be shared?</strong></p>
|
||||
<p>All the sub-notebooks, notes and resources within the shared notebook are shared.</p>
|
||||
<p><strong>Does it work with End-To-End-Encryption?</strong></p>
|
||||
<p>Yes and no. It is possible to use the share notebook feature even with E2EE enabled, however any shared notebook or note will not be encrypted, otherwise you would have had to give your master key password to the people you share with, which you'd probably not want to do.</p>
|
||||
<p>In a future version, this might be supported. For example by automatically creating a new master key for the shared notebook. You would then provide the recipients with that master key password.</p>
|
||||
<p><strong>What can it be used for?</strong></p>
|
||||
<p>Some ideas:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Plan a trip with friends or within a small organisation. For example, the notes could contain the maps, hotel and flight reservations, etc. or any document or note relevant to the trip. And all participants would have access to them.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Work on a project with colleagues. Everybody can access various work-related documents, add to them, modify them, etc. That could serve as a knowledge base for a project.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Another possible use, which has been requested many times, is to support multiple profiles. You could create a main profile that have access to all notes, and in there create a Work and Personal notebook. Then you would create a separate account for work. You can then share your Work notebook with that other account. That way the work account will only have access to the Work notebooks. You can use this technique in various ways to split your notebooks between multiple accounts and ensure strict separation between datasets.</p>
|
||||
</li>
|
||||
</ul>
|
||||
]]></description><link>https://joplinapp.org/news/20210621-104753/</link><guid isPermaLink="false">20210621-104753</guid><pubDate>Mon, 21 Jun 2021 10:47:53 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>
|
||||
]]></description><link>https://joplinapp.org/news/20210624-171844/</link><guid isPermaLink="false">20210624-171844</guid><pubDate>Thu, 24 Jun 2021 17:18:44 GMT</pubDate><twitter-text></twitter-text></item></channel></rss>
|
||||
25
README.md
25
README.md
@@ -28,11 +28,11 @@ Three types of applications are available: for **desktop** (Windows, macOS and L
|
||||
|
||||
Operating System | Download
|
||||
---|---
|
||||
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-Setup-2.7.15.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a>
|
||||
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a>
|
||||
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a>
|
||||
Windows (32 and 64-bit) | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-Setup-2.8.8.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a>
|
||||
macOS | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a>
|
||||
Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a>
|
||||
|
||||
**On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
|
||||
**On Windows**, you may also use the <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/JoplinPortable.exe'>Portable version</a>. The [portable application](https://en.wikipedia.org/wiki/Portable_application) allows installing the software on a portable device such as a USB key. Simply copy the file JoplinPortable.exe in any directory on that USB key ; the application will then create a directory called "JoplinProfile" next to the executable file.
|
||||
|
||||
**On Linux**, the recommended way is to use the following installation script as it will handle the desktop icon too:
|
||||
|
||||
@@ -42,7 +42,7 @@ Linux | <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/J
|
||||
|
||||
Operating System | Download | Alt. Download
|
||||
---|---|---
|
||||
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.7.2/joplin-v2.7.2.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.7.2/joplin-v2.7.2-32bit.apk)
|
||||
Android | <a href='https://play.google.com/store/apps/details?id=net.cozic.joplin&utm_source=GitHub&utm_campaign=README&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeAndroid.png'/></a> | or download the APK file: [64-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.8.1/joplin-v2.8.1.apk) [32-bit](https://github.com/laurent22/joplin-android/releases/download/android-v2.8.1/joplin-v2.8.1-32bit.apk)
|
||||
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeIOS.png'/></a> | -
|
||||
|
||||
## Terminal application
|
||||
@@ -153,6 +153,8 @@ A community maintained list of these distributions can be found here: [Unofficia
|
||||
- About
|
||||
|
||||
- [Changelog (Desktop App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog.md)
|
||||
- [Changelog (Android)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_android.md)
|
||||
- [Changelog (iOS)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_ios.md)
|
||||
- [Changelog (CLI App)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_cli.md)
|
||||
- [Changelog (Server)](https://github.com/laurent22/joplin/blob/dev/readme/changelog_server.md)
|
||||
- [Stats](https://github.com/laurent22/joplin/blob/dev/readme/stats.md)
|
||||
@@ -185,6 +187,7 @@ A community maintained list of these distributions can be found here: [Unofficia
|
||||
- Custom CSS support for customisation of both the rendered markdown and overall user interface.
|
||||
- Customisable layout allows toggling, movement and sizing of various elements.
|
||||
- Keyboard shortcuts are editable and allow binding of most Joplin commands with export/import functionality.
|
||||
- Multiple profile support.
|
||||
|
||||
# Importing
|
||||
|
||||
@@ -450,7 +453,7 @@ You can also use search filters to further restrict the search.
|
||||
|
||||
| Operator | Description | Example |
|
||||
| --- | --- | --- |
|
||||
|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`.<br>`office -trash` searches for all notes with the word`office` and without the word `trash`.|
|
||||
|**-**|If placed before a text term, it excludes the notes that contain that term. You can also place it before a filter to negate it. |`-spam` searches for all notes without the word `spam`.<br>`office -trash` searches for all notes with the word `office` and without the word `trash`.|
|
||||
|**any:**|Return notes that satisfy any/all of the required conditions. `any:0` is the default, which means all conditions must be satisfied.|`any:1 cat dog` will return notes that have the word `cat` or `dog`.<br>`any:0 cat dog` will return notes with both the words `cat` and `dog`. |
|
||||
| **title:** <br> **body:**|Restrict your search to just the title or the body field.|`title:"hello world"` searches for notes whose title contains `hello` and `world`.<br>`title:hello -body:world` searches for notes whose title contains `hello` and body does not contain `world`.
|
||||
| **tag:** |Restrict the search to the notes with the specified tags.|`tag:office` searches for all notes having tag office.<br>`tag:office tag:important` searches for all notes having both office and important tags.<br>`tag:office -tag:spam` searches for notes having tag `office` which do not have tag `spam`.<br>`any:1 tag:office tag:spam` searches for notes having tag `office` or tag `spam`.<br>`tag:be*ful` does a search with wildcards.<br>`tag:*` returns all notes with tags.<br>`-tag:*` returns all notes without tags.|
|
||||
@@ -482,6 +485,16 @@ Notes are sorted by "relevance". Currently it means the notes that contain the r
|
||||
|
||||
In the desktop application, press <kbd>Ctrl+P</kbd> or <kbd>Cmd+P</kbd> and type a note title or part of its content to jump to it. Or type <kbd>#</kbd> followed by a tag name, or <kbd>@</kbd> followed by a notebook name.
|
||||
|
||||
# Multiple profile support
|
||||
|
||||
To create a new profile, open File > Switch profile and select Create new profile, enter the profile name and press OK. The app will automatically switch to this new profile, which you can now configure.
|
||||
|
||||
To switch back to the previous profile, again open File > Switch profile and select Default.
|
||||
|
||||
Note that profiles all share certain settings, such as language, font size, theme, etc. This is done so that you don't have reconfigure every details when switching profiles. Other settings such as sync configuration is per profile.
|
||||
|
||||
The feature is available on desktop only for now, and should be ported to mobile relatively soon.
|
||||
|
||||
# Donations
|
||||
|
||||
Donations to Joplin support the development of the project. Developing quality applications mostly takes time, but there are also some expenses, such as digital certificates to sign the applications, app store fees, hosting, etc. Most of all, your donation will make it possible to keep up the current development standard.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "Joplin Web Clipper [DEV]",
|
||||
"version": "2.8.0",
|
||||
"version": "2.8.1",
|
||||
"description": "Capture and save web pages and screenshots from your browser to Joplin.",
|
||||
"homepage_url": "https://joplinapp.org",
|
||||
"content_security_policy": "script-src 'self'; object-src 'self'",
|
||||
|
||||
@@ -538,6 +538,7 @@ class Application extends BaseApplication {
|
||||
pluginService: PluginService.instance(),
|
||||
bridge: bridge(),
|
||||
debug: new DebugService(reg.db()),
|
||||
resourceService: ResourceService.instance(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -70,7 +70,6 @@ interface Props {
|
||||
showNeedUpgradingMasterKeyMessage: boolean;
|
||||
showShouldReencryptMessage: boolean;
|
||||
showInstallTemplatesPlugin: boolean;
|
||||
focusedField: string;
|
||||
themeId: number;
|
||||
settingEditorCodeView: boolean;
|
||||
pluginsLegacy: any;
|
||||
@@ -698,7 +697,6 @@ class MainScreenComponent extends React.Component<Props, State> {
|
||||
key={key}
|
||||
resizableLayoutEventEmitter={eventEmitter}
|
||||
visible={event.visible}
|
||||
focusedField={this.props.focusedField}
|
||||
size={event.size}
|
||||
themeId={this.props.themeId}
|
||||
/>;
|
||||
@@ -861,23 +859,18 @@ const mapStateToProps = (state: AppState) => {
|
||||
return {
|
||||
themeId: state.settings.theme,
|
||||
settingEditorCodeView: state.settings['editor.codeView'],
|
||||
folders: state.folders,
|
||||
notes: state.notes,
|
||||
hasDisabledSyncItems: state.hasDisabledSyncItems,
|
||||
hasDisabledEncryptionItems: state.hasDisabledEncryptionItems,
|
||||
showMissingMasterKeyMessage: showMissingMasterKeyMessage(syncInfo, state.notLoadedMasterKeys),
|
||||
showNeedUpgradingMasterKeyMessage: !!EncryptionService.instance().masterKeysThatNeedUpgrading(syncInfo.masterKeys).length,
|
||||
showShouldReencryptMessage: state.settings['encryption.shouldReencrypt'] >= Setting.SHOULD_REENCRYPT_YES,
|
||||
shouldUpgradeSyncTarget: state.settings['sync.upgradeState'] === Setting.SYNC_UPGRADE_STATE_SHOULD_DO,
|
||||
selectedFolderId: state.selectedFolderId,
|
||||
selectedNoteId: state.selectedNoteIds.length === 1 ? state.selectedNoteIds[0] : null,
|
||||
pluginsLegacy: state.pluginsLegacy,
|
||||
plugins: state.pluginService.plugins,
|
||||
pluginHtmlContents: state.pluginService.pluginHtmlContents,
|
||||
customCss: state.customCss,
|
||||
editorNoteStatuses: state.editorNoteStatuses,
|
||||
hasNotesBeingSaved: stateUtils.hasNotesBeingSaved(state),
|
||||
focusedField: state.focusedField,
|
||||
layoutMoveMode: state.layoutMoveMode,
|
||||
mainLayout: state.mainLayout,
|
||||
startupPluginsLoaded: state.startupPluginsLoaded,
|
||||
|
||||
@@ -38,6 +38,7 @@ import ErrorBoundary from '../../../ErrorBoundary';
|
||||
import { MarkupToHtmlOptions } from '../../utils/useMarkupToHtml';
|
||||
import eventManager from '@joplin/lib/eventManager';
|
||||
import { EditContextMenuFilterObject } from '@joplin/lib/services/plugins/api/JoplinWorkspace';
|
||||
import { checkTableIsUnderCursor, readTableAroundCursor } from './utils/tables';
|
||||
|
||||
const menuUtils = new MenuUtils(CommandService.instance());
|
||||
|
||||
@@ -259,7 +260,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
|
||||
return commandOutput;
|
||||
},
|
||||
};
|
||||
}, [props.content, props.visiblePanes, addListItem, wrapSelectionWithStrings, setEditorPercentScroll, setViewerPercentScroll, resetScroll, renderedBody]);
|
||||
}, [props.content, props.visiblePanes, addListItem, wrapSelectionWithStrings, setEditorPercentScroll, setViewerPercentScroll, resetScroll]);
|
||||
|
||||
const onEditorPaste = useCallback(async (event: any = null) => {
|
||||
const resourceMds = await handlePasteEvent(event);
|
||||
@@ -672,7 +673,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
|
||||
// props.content has been updated).
|
||||
const textChanged = props.searchMarkers.keywords.length > 0 && (props.content !== previousContent || renderedBody !== previousRenderedBody);
|
||||
|
||||
if (props.searchMarkers !== previousSearchMarkers || textChanged) {
|
||||
if (webviewRef.current?.wrappedInstance && (props.searchMarkers !== previousSearchMarkers || textChanged)) {
|
||||
webviewRef.current.wrappedInstance.send('setMarkers', props.searchMarkers.keywords, props.searchMarkers.options);
|
||||
|
||||
if (editorRef.current) {
|
||||
@@ -753,7 +754,14 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
|
||||
|
||||
const menu = new Menu();
|
||||
|
||||
const hasSelectedText = editorRef.current && !!editorRef.current.getSelection() ;
|
||||
const cm = editorRef.current;
|
||||
|
||||
const hasSelectedText = cm && !!cm.getSelection() ;
|
||||
|
||||
const tableIsUnderCursor = checkTableIsUnderCursor(cm);
|
||||
let tableUnderCursor: string = null;
|
||||
|
||||
if (tableIsUnderCursor) tableUnderCursor = readTableAroundCursor(cm);
|
||||
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
@@ -785,6 +793,27 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
|
||||
})
|
||||
);
|
||||
|
||||
if (tableUnderCursor) {
|
||||
menu.append(
|
||||
new MenuItem({ type: 'separator' })
|
||||
);
|
||||
|
||||
menu.append(
|
||||
new MenuItem({
|
||||
label: _('Edit table...'),
|
||||
click: async () => {
|
||||
props.dispatch({
|
||||
type: 'DIALOG_OPEN',
|
||||
name: 'tableEditor',
|
||||
props: {
|
||||
markdownTable: tableUnderCursor,
|
||||
},
|
||||
});
|
||||
},
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
const spellCheckerMenuItems = SpellCheckerService.instance().contextMenuItems(params.misspelledWord, params.dictionarySuggestions);
|
||||
|
||||
for (const item of spellCheckerMenuItems) {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
function findElementWithClass(element: any, className: string): any {
|
||||
if (element.classList && element.classList.contains(className)) return element;
|
||||
|
||||
for (const child of element.childNodes) {
|
||||
const hasClass = findElementWithClass(child, className);
|
||||
if (hasClass) return hasClass;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export const checkTableIsUnderCursor = (cm: any) => {
|
||||
if (!cm) return false;
|
||||
|
||||
const coords = cm.cursorCoords(cm.getCursor());
|
||||
const element = document.elementFromPoint(coords.left, coords.top);
|
||||
if (!element) return false;
|
||||
return !!findElementWithClass(element, 'cm-jn-table-item');
|
||||
};
|
||||
|
||||
export const readTableAroundCursor = (cm: any) => {
|
||||
const idxAtCursor = cm.doc.getCursor().line;
|
||||
const lineCount = cm.lineCount();
|
||||
|
||||
const lines: string[] = [];
|
||||
|
||||
for (let i = idxAtCursor - 1; i >= 0; i--) {
|
||||
const line: string = cm.doc.getLine(i);
|
||||
if (line.startsWith('|')) {
|
||||
lines.splice(0, 0, line);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
lines.push(cm.doc.getLine(idxAtCursor));
|
||||
|
||||
for (let i = idxAtCursor + 1; i < lineCount; i++) {
|
||||
const line: string = cm.doc.getLine(i);
|
||||
if (line.startsWith('|')) {
|
||||
lines.push(line);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return lines.join('\n');
|
||||
};
|
||||
@@ -165,6 +165,7 @@ export default function useJoplinMode(CodeMirror: any) {
|
||||
}
|
||||
|
||||
if (isMonospace) { token = `${token} jn-monospace`; }
|
||||
if (state.inTable) { token = `${token} jn-table-item`; }
|
||||
// //////// End Monospace //////////
|
||||
|
||||
return token;
|
||||
|
||||
@@ -585,7 +585,6 @@ const mapStateToProps = (state: AppState) => {
|
||||
return {
|
||||
noteId: noteId,
|
||||
notes: state.notes,
|
||||
folders: state.folders,
|
||||
selectedNoteIds: state.selectedNoteIds,
|
||||
selectedFolderId: state.selectedFolderId,
|
||||
isProvisional: state.provisionalNoteIds.includes(noteId),
|
||||
|
||||
@@ -27,7 +27,6 @@ export interface NoteEditorProps {
|
||||
editorNoteStatuses: any;
|
||||
syncStarted: boolean;
|
||||
bodyEditor: string;
|
||||
folders: any[];
|
||||
notesParentType: string;
|
||||
selectedNoteTags: any[];
|
||||
lastEditorScrollPercents: any;
|
||||
|
||||
@@ -55,7 +55,7 @@ const NoteListComponent = (props: Props) => {
|
||||
};
|
||||
}, []);
|
||||
|
||||
const itemHeight = 34;
|
||||
const [itemHeight, setItemHeight] = useState(34);
|
||||
|
||||
const focusItemIID_ = useRef<any>(null);
|
||||
const noteListRef = useRef(null);
|
||||
@@ -453,6 +453,16 @@ const NoteListComponent = (props: Props) => {
|
||||
};
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
// When a note list item is styled by userchrome.css, its height is reflected.
|
||||
// Ref. https://github.com/laurent22/joplin/pull/6542
|
||||
const noteItem = Object.values<any>(itemAnchorRefs_.current)[0]?.current;
|
||||
const actualItemHeight = noteItem?.getHeight() ?? 0;
|
||||
if (actualItemHeight >= 8) { // To avoid generating too many narrow items
|
||||
setItemHeight(actualItemHeight);
|
||||
}
|
||||
});
|
||||
|
||||
const renderEmptyList = () => {
|
||||
if (props.notes.length) return null;
|
||||
|
||||
|
||||
@@ -167,6 +167,7 @@ function NoteListControls(props: Props) {
|
||||
|
||||
const mapStateToProps = (state: AppState) => {
|
||||
return {
|
||||
showNewNoteButtons: state.focusedField !== 'globalSearch',
|
||||
sortOrderButtonsVisible: state.settings['notes.sortOrder.buttonsVisible'],
|
||||
sortOrderField: state.settings['notes.sortOrder.field'],
|
||||
sortOrderReverse: state.settings['notes.sortOrder.reverse'],
|
||||
|
||||
@@ -73,6 +73,7 @@ function NoteListItem(props: NoteListItemProps, ref: any) {
|
||||
focus: function() {
|
||||
if (anchorRef.current) anchorRef.current.focus();
|
||||
},
|
||||
getHeight: () => anchorRef.current?.clientHeight,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ interface Props {
|
||||
resizableLayoutEventEmitter: any;
|
||||
size: Size;
|
||||
visible: boolean;
|
||||
focusedField: string;
|
||||
themeId: number;
|
||||
}
|
||||
|
||||
@@ -34,7 +33,7 @@ export default function NoteListWrapper(props: Props) {
|
||||
|
||||
return (
|
||||
<StyledRoot>
|
||||
<NoteListControls showNewNoteButtons={props.focusedField !== 'globalSearch'} height={controlHeight} />
|
||||
<NoteListControls height={controlHeight} />
|
||||
<NoteList resizableLayoutEventEmitter={props.resizableLayoutEventEmitter} size={noteListSize} visible={props.visible}/>
|
||||
</StyledRoot>
|
||||
);
|
||||
|
||||
@@ -22,6 +22,7 @@ import Dialog from './Dialog';
|
||||
import SyncWizardDialog from './SyncWizard/Dialog';
|
||||
import MasterPasswordDialog from './MasterPasswordDialog/Dialog';
|
||||
import EditFolderDialog from './EditFolderDialog/Dialog';
|
||||
import TableEditorDialog from './TableEditorDialog/Dialog';
|
||||
import StyleSheetContainer from './StyleSheets/StyleSheetContainer';
|
||||
const { ImportScreen } = require('./ImportScreen.min.js');
|
||||
const { ResourceScreen } = require('./ResourceScreen.js');
|
||||
@@ -38,6 +39,7 @@ interface Props {
|
||||
zoomFactor: number;
|
||||
needApiAuth: boolean;
|
||||
dialogs: AppStateDialog[];
|
||||
dialogContentMaxSize: Size;
|
||||
}
|
||||
|
||||
interface ModalDialogProps {
|
||||
@@ -51,6 +53,7 @@ interface RegisteredDialogProps {
|
||||
themeId: number;
|
||||
key: string;
|
||||
dispatch: Function;
|
||||
dialogContentMaxSize: Size;
|
||||
}
|
||||
|
||||
interface RegisteredDialog {
|
||||
@@ -60,19 +63,25 @@ interface RegisteredDialog {
|
||||
const registeredDialogs: Record<string, RegisteredDialog> = {
|
||||
syncWizard: {
|
||||
render: (props: RegisteredDialogProps, customProps: any) => {
|
||||
return <SyncWizardDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
|
||||
return <SyncWizardDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
|
||||
},
|
||||
},
|
||||
|
||||
masterPassword: {
|
||||
render: (props: RegisteredDialogProps, customProps: any) => {
|
||||
return <MasterPasswordDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
|
||||
return <MasterPasswordDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
|
||||
},
|
||||
},
|
||||
|
||||
editFolder: {
|
||||
render: (props: RegisteredDialogProps, customProps: any) => {
|
||||
return <EditFolderDialog key={props.key} dispatch={props.dispatch} themeId={props.themeId} {...customProps}/>;
|
||||
return <EditFolderDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
|
||||
},
|
||||
},
|
||||
|
||||
tableEditor: {
|
||||
render: (props: RegisteredDialogProps, customProps: any) => {
|
||||
return <TableEditorDialog key={props.key} dispatch={props.dispatch} dialogContentMaxSize={props.dialogContentMaxSize} themeId={props.themeId} {...customProps}/>;
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -195,10 +204,12 @@ class RootComponent extends React.Component<Props, any> {
|
||||
for (const dialog of props.dialogs) {
|
||||
const md = registeredDialogs[dialog.name];
|
||||
if (!md) throw new Error(`Unknown dialog: ${dialog.name}`);
|
||||
|
||||
output.push(md.render({
|
||||
key: dialog.name,
|
||||
themeId: props.themeId,
|
||||
dispatch: props.dispatch,
|
||||
dialogContentMaxSize: props.dialogContentMaxSize,
|
||||
}, dialog.props));
|
||||
}
|
||||
return output;
|
||||
@@ -245,6 +256,11 @@ const mapStateToProps = (state: AppState) => {
|
||||
themeId: state.settings.theme,
|
||||
needApiAuth: state.needApiAuth,
|
||||
dialogs: state.dialogs,
|
||||
dialogContentMaxSize: {
|
||||
// Minus padding, margins and dialog header and button bar.
|
||||
width: state.windowContentSize.width - 36 * 2,
|
||||
height: state.windowContentSize.height - 36 * 2 - 28 - 30 - 20,
|
||||
},
|
||||
profileConfigCurrentProfileId: state.profileConfig.currentProfileId,
|
||||
};
|
||||
};
|
||||
|
||||
101
packages/app-desktop/gui/TableEditorDialog/Dialog.tsx
Normal file
101
packages/app-desktop/gui/TableEditorDialog/Dialog.tsx
Normal file
@@ -0,0 +1,101 @@
|
||||
import * as React from 'react';
|
||||
import { useCallback, useEffect } from 'react';
|
||||
import { _ } from '@joplin/lib/locale';
|
||||
import DialogButtonRow, { ClickEvent } from '../DialogButtonRow';
|
||||
import Dialog from '../Dialog';
|
||||
import DialogTitle from '../DialogTitle';
|
||||
import { parseMarkdownTable } from '../../../lib/markdownUtils';
|
||||
import { Size } from '../ResizableLayout/utils/types';
|
||||
|
||||
interface Props {
|
||||
themeId: number;
|
||||
dispatch: Function;
|
||||
markdownTable: string;
|
||||
dialogContentMaxSize: Size;
|
||||
}
|
||||
|
||||
const markdownTableToObject = (markdownTable: string): any => {
|
||||
const table = parseMarkdownTable(markdownTable);
|
||||
|
||||
return {
|
||||
columns: table.headers.map(h => {
|
||||
return {
|
||||
title: h.label,
|
||||
field: h.name,
|
||||
hozAlign: h.justify,
|
||||
editor: 'input',
|
||||
};
|
||||
}),
|
||||
|
||||
data: table.rows.map(row => {
|
||||
return {
|
||||
...row,
|
||||
};
|
||||
}),
|
||||
};
|
||||
};
|
||||
|
||||
export default function(props: Props) {
|
||||
const elementId = `tabulator_${Math.floor(Math.random() * 1000000)}`;
|
||||
|
||||
const onClose = useCallback(() => {
|
||||
props.dispatch({
|
||||
type: 'DIALOG_CLOSE',
|
||||
name: 'tableEditor',
|
||||
});
|
||||
}, [props.dispatch]);
|
||||
|
||||
const onButtonRowClick = useCallback(async (event: ClickEvent) => {
|
||||
if (event.buttonName === 'cancel') {
|
||||
onClose();
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.buttonName === 'ok') {
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}, [onClose]);
|
||||
|
||||
useEffect(() => {
|
||||
const table = markdownTableToObject(props.markdownTable);
|
||||
const Tabulator = (window as any).Tabulator;
|
||||
|
||||
// TODO: probably doesn't need to be called every time
|
||||
// TODO: Load CSS/JS dynamically?
|
||||
// TODO: Clean up on exit
|
||||
Tabulator.extendModule('edit', 'editors', {});
|
||||
|
||||
new Tabulator(`#${elementId}`, {
|
||||
...table,
|
||||
height: props.dialogContentMaxSize.height,
|
||||
});
|
||||
}, []);
|
||||
|
||||
function renderContent() {
|
||||
return (
|
||||
<div className="dialog-content">
|
||||
<div id={elementId}></div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function renderDialogWrapper() {
|
||||
return (
|
||||
<div className="dialog-root">
|
||||
<DialogTitle title={_('Edit table')}/>
|
||||
{renderContent()}
|
||||
<DialogButtonRow
|
||||
themeId={props.themeId}
|
||||
onClick={onButtonRowClick}
|
||||
okButtonLabel={_('Save')}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Dialog onClose={onClose} renderContent={renderDialogWrapper}/>
|
||||
);
|
||||
}
|
||||
@@ -7,6 +7,10 @@
|
||||
uses 'eval'.
|
||||
<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval'">
|
||||
-->
|
||||
|
||||
<!--
|
||||
To add files below, then need to be in the "vendor" directory. To make this happen, use copyApplicationAssets.js
|
||||
-->
|
||||
<title>Joplin</title>
|
||||
<link rel="stylesheet" href="style.min.css">
|
||||
<link rel="stylesheet" href="style/icons/style.css">
|
||||
@@ -15,6 +19,9 @@
|
||||
<link rel="stylesheet" href="vendor/lib/smalltalk/css/smalltalk.css">
|
||||
<link rel="stylesheet" href="vendor/lib/roboto-fontface/css/roboto/roboto-fontface.css">
|
||||
<link rel="stylesheet" href="vendor/lib/codemirror/lib/codemirror.css">
|
||||
<link rel="stylesheet" href="vendor/lib/tabulator-tables/dist/css/tabulator.min.css">
|
||||
|
||||
<script type="text/javascript" src="vendor/lib/tabulator-tables/dist/js/tabulator.min.js"></script>
|
||||
|
||||
<style>
|
||||
.smalltalk {
|
||||
|
||||
@@ -116,10 +116,10 @@
|
||||
"app-builder-bin": "^1.9.11",
|
||||
"babel-cli": "^6.26.0",
|
||||
"babel-preset-react": "^6.24.1",
|
||||
"electron": "14.1.0",
|
||||
"electron-builder": "^22.11.7",
|
||||
"electron-notarize": "^1.0.0",
|
||||
"electron-rebuild": "^3.2.3",
|
||||
"electron": "18.2.0",
|
||||
"electron-builder": "^23.0.3",
|
||||
"electron-notarize": "^1.2.1",
|
||||
"electron-rebuild": "^3.2.7",
|
||||
"glob": "^7.1.6",
|
||||
"gulp": "^4.0.2",
|
||||
"jest": "^26.6.3",
|
||||
@@ -174,6 +174,7 @@
|
||||
"styled-components": "5.1.1",
|
||||
"styled-system": "5.1.5",
|
||||
"taboverride": "^4.0.3",
|
||||
"tabulator-tables": "^5.1.4",
|
||||
"tinymce": "^5.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,6 +83,8 @@ async function main() {
|
||||
'codemirror/addon/dialog/dialog.css',
|
||||
'@joeattardi/emoji-button/dist/index.js',
|
||||
'mark.js/dist/mark.min.js',
|
||||
'tabulator-tables/dist/css/tabulator.min.css',
|
||||
'tabulator-tables/dist/js/tabulator.min.js',
|
||||
{
|
||||
src: resolve(__dirname, '../../lib/services/plugins/sandboxProxy.js'),
|
||||
dest: `${buildLibDir}/@joplin/lib/services/plugins/sandboxProxy.js`,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import markdownUtils from './markdownUtils';
|
||||
import markdownUtils, { parseMarkdownTable } from './markdownUtils';
|
||||
|
||||
describe('Should detect list items', () => {
|
||||
test('should detect `- lorem ipsum` as list item ', () => {
|
||||
@@ -91,4 +91,51 @@ describe('Should detect list items', () => {
|
||||
expect(markdownUtils.isEmptyListItem('+ [x]')).toBe(false);
|
||||
});
|
||||
|
||||
test('should parse a Markdown table', () => {
|
||||
const table = parseMarkdownTable(`
|
||||
| Name | Town | Comment |
|
||||
|----------:|:-------:|----|
|
||||
| John | London | None |
|
||||
| Paul | Liverpool | **test bold** |
|
||||
| Ringo | Sheffield | <a href="#">link</a>  |
|
||||
`.trim().split('\n').map(l => l.trim()).join('\n'));
|
||||
|
||||
expect(table).toEqual({
|
||||
'headers': [
|
||||
{
|
||||
'label': 'Name',
|
||||
'name': 'c0',
|
||||
'justify': 'right',
|
||||
},
|
||||
{
|
||||
'label': 'Town',
|
||||
'name': 'c1',
|
||||
'justify': 'center',
|
||||
},
|
||||
{
|
||||
'label': 'Comment',
|
||||
'name': 'c2',
|
||||
'justify': 'left',
|
||||
},
|
||||
],
|
||||
'rows': [
|
||||
{
|
||||
'c0': 'John',
|
||||
'c1': 'London',
|
||||
'c2': 'None',
|
||||
},
|
||||
{
|
||||
'c0': 'Paul',
|
||||
'c1': 'Liverpool',
|
||||
'c2': '**test bold**',
|
||||
},
|
||||
{
|
||||
'c0': 'Ringo',
|
||||
'c1': 'Sheffield',
|
||||
'c2': '<a href="#">link</a> ',
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -10,7 +10,7 @@ const emptyListRegex = /^(\s*)([*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s+)$/;
|
||||
export enum MarkdownTableJustify {
|
||||
Left = 'left',
|
||||
Center = 'center',
|
||||
Right = 'right,',
|
||||
Right = 'right',
|
||||
}
|
||||
|
||||
export interface MarkdownTableHeader {
|
||||
@@ -25,6 +25,11 @@ export interface MarkdownTableRow {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
export interface MarkdownTable {
|
||||
headers: MarkdownTableHeader[];
|
||||
rows: MarkdownTableRow[];
|
||||
}
|
||||
|
||||
const markdownUtils = {
|
||||
// Titles for markdown links only need escaping for [ and ]
|
||||
escapeTitleText(text: string) {
|
||||
@@ -206,4 +211,95 @@ const markdownUtils = {
|
||||
},
|
||||
};
|
||||
|
||||
export const parseMarkdownTable = (tableMarkdown: string): MarkdownTable => {
|
||||
interface Token {
|
||||
type: string;
|
||||
content: string;
|
||||
attrGet: (name: string)=> string;
|
||||
}
|
||||
|
||||
const getJustifyFromStyle = (token: Token): MarkdownTableJustify => {
|
||||
const style = token.attrGet('style');
|
||||
if (!style) return MarkdownTableJustify.Left;
|
||||
if (style.includes('text-align:right')) return MarkdownTableJustify.Right;
|
||||
if (style.includes('text-align:left')) return MarkdownTableJustify.Left;
|
||||
if (style.includes('text-align:center')) return MarkdownTableJustify.Center;
|
||||
return MarkdownTableJustify.Left;
|
||||
};
|
||||
|
||||
const env = {};
|
||||
const markdownIt = new MarkdownIt();
|
||||
const tokens: Token[] = markdownIt.parse(tableMarkdown, env);
|
||||
const headers: MarkdownTableHeader[] = [];
|
||||
const rows: MarkdownTableRow[] = [];
|
||||
|
||||
let state = 'start';
|
||||
let headerIndex = 0;
|
||||
let rowIndex = -1;
|
||||
|
||||
for (const token of tokens) {
|
||||
if (state === 'start') {
|
||||
if (token.type !== 'table_open') {
|
||||
throw new Error('Expected table_open token');
|
||||
} else {
|
||||
state = 'open';
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (token.type === 'thead_open') {
|
||||
state = 'header';
|
||||
continue;
|
||||
}
|
||||
|
||||
if (state === 'header') {
|
||||
if (token.type === 'th_open') {
|
||||
headers.push({
|
||||
label: '',
|
||||
name: `c${headerIndex}`,
|
||||
justify: getJustifyFromStyle(token),
|
||||
});
|
||||
}
|
||||
|
||||
if (token.type === 'inline') {
|
||||
headers[headerIndex].label += token.content;
|
||||
}
|
||||
|
||||
if (token.type === 'th_close') {
|
||||
headerIndex++;
|
||||
}
|
||||
|
||||
if (token.type === 'thead_close') {
|
||||
state = 'content';
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (state === 'content') {
|
||||
if (token.type === 'tr_open') {
|
||||
state = 'row';
|
||||
rows.push({});
|
||||
rowIndex++;
|
||||
headerIndex = 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (state === 'row') {
|
||||
if (token.type === 'inline') {
|
||||
rows[rowIndex][`c${headerIndex}`] = token.content;
|
||||
headerIndex++;
|
||||
}
|
||||
|
||||
if (token.type === 'tr_close') {
|
||||
state = 'content';
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return { headers, rows };
|
||||
};
|
||||
|
||||
export default markdownUtils;
|
||||
|
||||
@@ -610,4 +610,26 @@ describe('reducer', function() {
|
||||
expect(state.selectedNoteIds).toBe(expected);
|
||||
}
|
||||
});
|
||||
|
||||
// tests for TAG_UPDATE_ALL about PR #6451
|
||||
it('should not change tags when a new value is deep equal to the old value', async () => {
|
||||
const tags = await createNTestTags(6);
|
||||
const oldTags = tags.slice(0, 5);
|
||||
{
|
||||
// Case 1. The input which is deep equal to the current state.tags doesn't change state.tags.
|
||||
const oldState = initTestState(null, null, null, null, oldTags, [2]);
|
||||
const newTags = oldTags.slice();
|
||||
// test action
|
||||
const newState = reducer(oldState, { type: 'TAG_UPDATE_ALL', items: newTags });
|
||||
expect(newState.tags).toBe(oldState.tags);
|
||||
}
|
||||
{
|
||||
// Case 2. A different input changes state.tags.
|
||||
const oldState = initTestState(null, null, null, null, oldTags, [2]);
|
||||
const newTags = oldTags.slice().splice(3, 1, tags[5]);
|
||||
// test action
|
||||
const newState = reducer(oldState, { type: 'TAG_UPDATE_ALL', items: newTags });
|
||||
expect(newState.tags).not.toBe(oldState.tags);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import produce, { Draft } from 'immer';
|
||||
import produce, { Draft, original } from 'immer';
|
||||
import pluginServiceReducer, { stateRootKey as pluginServiceStateRootKey, defaultState as pluginServiceDefaultState, State as PluginServiceState } from './services/plugins/reducer';
|
||||
import shareServiceReducer, { stateRootKey as shareServiceStateRootKey, defaultState as shareServiceDefaultState, State as ShareServiceState } from './services/share/reducer';
|
||||
import Note from './models/Note';
|
||||
@@ -7,6 +7,7 @@ import BaseModel from './BaseModel';
|
||||
import { Store } from 'redux';
|
||||
import { ProfileConfig } from './services/profileConfig/types';
|
||||
import * as ArrayUtils from './ArrayUtils';
|
||||
const fastDeepEqual = require('fast-deep-equal');
|
||||
const { ALL_NOTES_FILTER_ID } = require('./reserved-ids');
|
||||
const { createSelectorCreator, defaultMemoize } = require('reselect');
|
||||
const { createCachedSelector } = require('re-reselect');
|
||||
@@ -924,7 +925,9 @@ const reducer = produce((draft: Draft<State> = defaultState, action: any) => {
|
||||
break;
|
||||
|
||||
case 'TAG_UPDATE_ALL':
|
||||
draft.tags = action.items;
|
||||
if (!fastDeepEqual(original(draft.tags), action.items)) {
|
||||
draft.tags = action.items;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'TAG_SELECT':
|
||||
@@ -1122,7 +1125,9 @@ const reducer = produce((draft: Draft<State> = defaultState, action: any) => {
|
||||
break;
|
||||
|
||||
case 'SET_NOTE_TAGS':
|
||||
draft.selectedNoteTags = action.items;
|
||||
if (!fastDeepEqual(original(draft.selectedNoteTags), action.items)) {
|
||||
draft.selectedNoteTags = action.items;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'PLUGINLEGACY_DIALOG_SET':
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
# Translators:
|
||||
# Josep Maria Planell <planell.josep@gmail.com>, 2019
|
||||
# Joan Montané <jmontane@softcatala.org>, 2019
|
||||
# Xavi Ivars <xavi.ivars@gmail.com>, 2021
|
||||
# Xavi Ivars <xavi.ivars@gmail.com>, 2021-2022
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -302,9 +302,8 @@ msgid "Also displays unset and hidden config variables."
|
||||
msgstr "També mostra variables de configuració ocultes o sense definir."
|
||||
|
||||
#: packages/app-desktop/gui/ShareNoteDialog.tsx:203
|
||||
#, fuzzy
|
||||
msgid "Also publish linked notes"
|
||||
msgstr "Deixa de publicar la nota"
|
||||
msgstr "Publica també les notes enllaçades"
|
||||
|
||||
#: packages/lib/models/Setting.ts:713
|
||||
msgid "Always"
|
||||
@@ -870,18 +869,16 @@ msgstr ""
|
||||
"s'està avortant. Torneu a provar quan tingueu connexió a Internet."
|
||||
|
||||
#: packages/app-desktop/gui/PromptDialog.min.js:235
|
||||
#, fuzzy
|
||||
msgid "Create"
|
||||
msgstr "Creació"
|
||||
msgstr "Crea"
|
||||
|
||||
#: packages/app-mobile/components/note-list.js:101
|
||||
msgid "Create a notebook"
|
||||
msgstr "Crea un bloc de notes nou"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:9
|
||||
#, fuzzy
|
||||
msgid "Create new profile..."
|
||||
msgstr "Crea una nota nova."
|
||||
msgstr "Crea un perfil nou..."
|
||||
|
||||
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:161
|
||||
msgid "Create notebook"
|
||||
@@ -1330,7 +1327,7 @@ msgstr "Edita el bloc de notes"
|
||||
|
||||
#: packages/app-desktop/commands/editProfileConfig.ts:9
|
||||
msgid "Edit profile configuration..."
|
||||
msgstr ""
|
||||
msgstr "Edita la configuració del perfil"
|
||||
|
||||
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:138
|
||||
#: packages/lib/models/Setting.ts:876 packages/lib/models/Setting.ts:877
|
||||
@@ -1360,9 +1357,8 @@ msgstr "Lletra d'amplada fixa de l'editor"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:100
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:96
|
||||
#, fuzzy
|
||||
msgid "Editor: %s"
|
||||
msgstr "Editor"
|
||||
msgstr "Editor: %s"
|
||||
|
||||
#: packages/app-cli/app/command-ls.js:31
|
||||
msgid "Either \"text\" or \"json\""
|
||||
@@ -1677,9 +1673,8 @@ msgid "File system"
|
||||
msgstr "Sistema de fitxers"
|
||||
|
||||
#: packages/app-mobile/components/screens/NoteTagsDialog.js:190
|
||||
#, fuzzy
|
||||
msgid "Filter tags"
|
||||
msgstr "Etiquetes noves:"
|
||||
msgstr "Filtra les etiquetes"
|
||||
|
||||
#: packages/app-desktop/gui/ExtensionBadge.min.js:10
|
||||
msgid "Firefox Extension"
|
||||
@@ -2806,6 +2801,8 @@ msgid ""
|
||||
"Please click on \"%s\" to proceed, or set the passwords in the \"%s\" list "
|
||||
"below."
|
||||
msgstr ""
|
||||
"Feu clic a \"%s\" per a continuar, o definiu les contrasenyes a la llista "
|
||||
"\"%s\" inferior."
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
|
||||
msgid ""
|
||||
@@ -2965,9 +2962,8 @@ msgid "Profile"
|
||||
msgstr "Perfil"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:17
|
||||
#, fuzzy
|
||||
msgid "Profile name:"
|
||||
msgstr "Perfil"
|
||||
msgstr "Nom del perfil:"
|
||||
|
||||
#: packages/lib/versionInfo.ts:26
|
||||
msgid "Profile Version: %s"
|
||||
@@ -3195,9 +3191,8 @@ msgstr "Desa l'alarma"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:100
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:93
|
||||
#, fuzzy
|
||||
msgid "Save as %s"
|
||||
msgstr "Anomena i desa..."
|
||||
msgstr "Desa-ho com a %s"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:80
|
||||
msgid "Save as..."
|
||||
@@ -3565,9 +3560,8 @@ msgid "Switch between note and to-do type"
|
||||
msgstr "Alterna entre el tipus nota i tasques pendents"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:437
|
||||
#, fuzzy
|
||||
msgid "Switch profile"
|
||||
msgstr "Exporta el perfil"
|
||||
msgstr "Canvia el perfil"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:105
|
||||
msgid "Switch to note type"
|
||||
@@ -3576,9 +3570,8 @@ msgstr "Canvia el tipus a nota"
|
||||
#: packages/app-desktop/commands/switchProfile1.ts:7
|
||||
#: packages/app-desktop/commands/switchProfile2.ts:7
|
||||
#: packages/app-desktop/commands/switchProfile3.ts:7
|
||||
#, fuzzy
|
||||
msgid "Switch to profile %d"
|
||||
msgstr "Canvia el tipus a nota"
|
||||
msgstr "Canvia al perfil %d"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:114
|
||||
msgid "Switch to to-do type"
|
||||
@@ -3677,7 +3670,7 @@ msgstr "Tabloide"
|
||||
|
||||
#: packages/app-mobile/components/screens/NoteTagsDialog.js:179
|
||||
msgid "tag1, tag2, ..."
|
||||
msgstr ""
|
||||
msgstr "etiqueta1, etiqueta2, ..."
|
||||
|
||||
#: packages/app-cli/app/command-import.js:52
|
||||
#: packages/app-desktop/gui/ImportScreen.min.js:73
|
||||
@@ -3719,8 +3712,9 @@ msgstr ""
|
||||
|
||||
#: packages/app-desktop/app.ts:332
|
||||
msgid ""
|
||||
"The application did not close properly. Would you like to start in safe mode?"
|
||||
msgstr ""
|
||||
"The application did not close properly. Would you like to start in safe "
|
||||
"mode?"
|
||||
msgstr "L'aplicació no s'ha tancat correctament. Voleu iniciar en mode segur?"
|
||||
|
||||
#: packages/lib/onedrive-api-node-utils.js:86
|
||||
msgid ""
|
||||
@@ -4576,9 +4570,8 @@ msgid "Your data is going to be re-encrypted and synced again."
|
||||
msgstr "Les vostres dades es tornaran a xifrar i sincronitzar."
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
|
||||
#, fuzzy
|
||||
msgid "Your password is needed to decrypt some of your data."
|
||||
msgstr "La contrasenya mestra és necessària per a desxifrar algunes dades."
|
||||
msgstr "Fa falta la contrasenya per a desxifrar part de les dades."
|
||||
|
||||
#: packages/app-cli/app/command-sync.ts:242
|
||||
msgid ""
|
||||
|
||||
@@ -7,6 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Türkçe\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Arda Kılıçdağı <arda@kilicdagi.com>\n"
|
||||
"Language-Team: Turkish (Turkey)\n"
|
||||
"Language: tr_TR\n"
|
||||
@@ -14,7 +16,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 3.0.1\n"
|
||||
"X-Generator: Poedit 3.1\n"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:560
|
||||
msgid "- Camera: to allow taking a picture and attaching it to a note."
|
||||
@@ -298,9 +300,8 @@ msgstr ""
|
||||
"Ayrıca ayarlanmamış ve gizlenmiş yapılandırma değişkenlerini de görüntüler."
|
||||
|
||||
#: packages/app-desktop/gui/ShareNoteDialog.tsx:203
|
||||
#, fuzzy
|
||||
msgid "Also publish linked notes"
|
||||
msgstr "Notu paylaşmayı bırak"
|
||||
msgstr "Ayrıca linklenmiş notları paylaş"
|
||||
|
||||
#: packages/lib/models/Setting.ts:713
|
||||
msgid "Always"
|
||||
@@ -402,7 +403,7 @@ msgstr "Otomatik"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:39
|
||||
msgid "Auto-add disabled accounts for deletion"
|
||||
msgstr ""
|
||||
msgstr "Silmek için devre dışı bırakılmış hesapları otomatik olarak ekle"
|
||||
|
||||
#: packages/lib/models/Setting.ts:912
|
||||
msgid "Auto-pair braces, parenthesis, quotations, etc."
|
||||
@@ -715,7 +716,7 @@ msgstr "Tamamlandı: %s (%s)"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:37
|
||||
msgid "Compress old changes"
|
||||
msgstr ""
|
||||
msgstr "Eski değişiklikleri sıkıştır"
|
||||
|
||||
#: packages/app-mobile/components/screens/ConfigScreen.tsx:632
|
||||
#: packages/app-mobile/components/side-menu-content.js:332
|
||||
@@ -867,18 +868,16 @@ msgstr ""
|
||||
"ediliyor. Lütfen internet bağlantınız varken bu işlemi yeniden deneyin."
|
||||
|
||||
#: packages/app-desktop/gui/PromptDialog.min.js:235
|
||||
#, fuzzy
|
||||
msgid "Create"
|
||||
msgstr "Oluşturuldu"
|
||||
msgstr "Oluştur"
|
||||
|
||||
#: packages/app-mobile/components/note-list.js:101
|
||||
msgid "Create a notebook"
|
||||
msgstr "Yeni bir not defteri oluşturur"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:9
|
||||
#, fuzzy
|
||||
msgid "Create new profile..."
|
||||
msgstr "Yeni bir not oluşturur."
|
||||
msgstr "Yeni bir profil oluşturur..."
|
||||
|
||||
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:161
|
||||
msgid "Create notebook"
|
||||
@@ -1035,14 +1034,12 @@ msgid "Delete attachment \"%s\"?"
|
||||
msgstr "\"%s\" eki silinsin mi?"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:36
|
||||
#, fuzzy
|
||||
msgid "Delete expired sessions"
|
||||
msgstr "Matematik ifadelerini etkinleştir"
|
||||
msgstr "Süresi geçmiş oturumları sil"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:31
|
||||
#, fuzzy
|
||||
msgid "Delete expired tokens"
|
||||
msgstr "Bu %d not silinsin mi?"
|
||||
msgstr "Süresi geçmiş jetonları sil"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:88
|
||||
msgid "Delete line"
|
||||
@@ -1325,7 +1322,7 @@ msgstr "Not defterini düzenle"
|
||||
|
||||
#: packages/app-desktop/commands/editProfileConfig.ts:9
|
||||
msgid "Edit profile configuration..."
|
||||
msgstr ""
|
||||
msgstr "Profil ayarlarını düzenle…"
|
||||
|
||||
#: packages/app-desktop/gui/NoteContentPropertiesDialog.tsx:138
|
||||
#: packages/lib/models/Setting.ts:876 packages/lib/models/Setting.ts:877
|
||||
@@ -1355,9 +1352,8 @@ msgstr "Metin düzenleyici monospace (sabit genişlikteki) yazı tipi"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:100
|
||||
#: packages/app-desktop/gui/NoteEditor/editorCommandDeclarations.ts:96
|
||||
#, fuzzy
|
||||
msgid "Editor: %s"
|
||||
msgstr "Düzenleyici"
|
||||
msgstr "Düzenleyici: %s"
|
||||
|
||||
#: packages/app-cli/app/command-ls.js:31
|
||||
msgid "Either \"text\" or \"json\""
|
||||
@@ -1370,12 +1366,12 @@ msgstr "Emacs"
|
||||
#: packages/app-desktop/gui/SyncWizard/Dialog.tsx:236
|
||||
#: packages/server/src/routes/admin/emails.ts:128
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "E-posta"
|
||||
|
||||
#: packages/server/src/routes/admin/emails.ts:112
|
||||
#: packages/server/src/services/MustacheService.ts:127
|
||||
msgid "Emails"
|
||||
msgstr ""
|
||||
msgstr "E-posta"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.tsx:194
|
||||
msgid "emphasised text"
|
||||
@@ -1672,9 +1668,8 @@ msgid "File system"
|
||||
msgstr "Dosya sistemi"
|
||||
|
||||
#: packages/app-mobile/components/screens/NoteTagsDialog.js:190
|
||||
#, fuzzy
|
||||
msgid "Filter tags"
|
||||
msgstr "Yeni etiketler:"
|
||||
msgstr "Etikerleri filtrele"
|
||||
|
||||
#: packages/app-desktop/gui/ExtensionBadge.min.js:10
|
||||
msgid "Firefox Extension"
|
||||
@@ -1872,7 +1867,7 @@ msgstr "TLS sertifikası hatalarını yoksay"
|
||||
|
||||
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:102
|
||||
msgid "Images"
|
||||
msgstr ""
|
||||
msgstr "Resim"
|
||||
|
||||
#: packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.tsx:170
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:536
|
||||
@@ -2201,7 +2196,7 @@ msgstr "Düzen butonu sıralaması"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/leaveSharedFolder.ts:10
|
||||
msgid "Leave notebook..."
|
||||
msgstr "Not defterinden ayrıl"
|
||||
msgstr "Not defterinden ayrıl..."
|
||||
|
||||
#: packages/lib/models/Setting.ts:1307
|
||||
msgid "Legal"
|
||||
@@ -2739,9 +2734,8 @@ msgid "Or create an account."
|
||||
msgstr "Ya da yeni bir hesap oluştur."
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:400
|
||||
#, fuzzy
|
||||
msgid "Other applications..."
|
||||
msgstr "Uygulamadan çıkar."
|
||||
msgstr "Diğer uygulamalar..."
|
||||
|
||||
#: packages/app-cli/app/command-import.js:27
|
||||
msgid "Output format: %s"
|
||||
@@ -2802,6 +2796,8 @@ msgid ""
|
||||
"Please click on \"%s\" to proceed, or set the passwords in the \"%s\" list "
|
||||
"below."
|
||||
msgstr ""
|
||||
"Devam etmek için lütfen \"%s\" butonuna basın, ya da aşağıdaki \"%s\" "
|
||||
"listesinden parola belirleyin."
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:65
|
||||
msgid ""
|
||||
@@ -2945,25 +2941,23 @@ msgstr "Gizlilik Politikası"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:35
|
||||
msgid "Process failed payment subscriptions"
|
||||
msgstr ""
|
||||
msgstr "Ödeme hatası almış abonelikleri işle"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:33
|
||||
msgid "Process oversized accounts"
|
||||
msgstr ""
|
||||
msgstr "Fazla büyük, şişmiş hesapları işle"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:38
|
||||
#, fuzzy
|
||||
msgid "Process user deletions"
|
||||
msgstr "Kullancı silmeleri"
|
||||
msgstr "Kullancı silmelerini yönet"
|
||||
|
||||
#: packages/server/src/routes/admin/users.ts:168
|
||||
msgid "Profile"
|
||||
msgstr "Profil"
|
||||
|
||||
#: packages/app-desktop/gui/MainScreen/commands/addProfile.ts:17
|
||||
#, fuzzy
|
||||
msgid "Profile name:"
|
||||
msgstr "Profil"
|
||||
msgstr "Profil adı:"
|
||||
|
||||
#: packages/lib/versionInfo.ts:26
|
||||
msgid "Profile Version: %s"
|
||||
@@ -3191,9 +3185,8 @@ msgstr "Alarm kurun"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:100
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:93
|
||||
#, fuzzy
|
||||
msgid "Save as %s"
|
||||
msgstr "Farklı kaydet..."
|
||||
msgstr "\"%s\" olarak farklı kaydet"
|
||||
|
||||
#: packages/app-desktop/gui/NoteEditor/utils/contextMenu.ts:80
|
||||
msgid "Save as..."
|
||||
@@ -3250,14 +3243,12 @@ msgid "Select all"
|
||||
msgstr "Tümünü seç"
|
||||
|
||||
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:140
|
||||
#, fuzzy
|
||||
msgid "Select emoji..."
|
||||
msgstr "Tarih seç"
|
||||
msgstr "Emoji seç..."
|
||||
|
||||
#: packages/app-desktop/gui/EditFolderDialog/Dialog.tsx:144
|
||||
#, fuzzy
|
||||
msgid "Select file..."
|
||||
msgstr "Tümünü seç"
|
||||
msgstr "Dosya seç..."
|
||||
|
||||
#: packages/app-cli/app/command-server.js:38
|
||||
msgid "Server is already running on port %d"
|
||||
@@ -3565,9 +3556,8 @@ msgid "Switch between note and to-do type"
|
||||
msgstr "Not ve yapılacaklar tipi arasında değişim yap"
|
||||
|
||||
#: packages/app-desktop/gui/MenuBar.tsx:437
|
||||
#, fuzzy
|
||||
msgid "Switch profile"
|
||||
msgstr "Profili dışarı aktar"
|
||||
msgstr "Profili değiştir"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:105
|
||||
msgid "Switch to note type"
|
||||
@@ -3576,9 +3566,8 @@ msgstr "Not tipine dönüştür"
|
||||
#: packages/app-desktop/commands/switchProfile1.ts:7
|
||||
#: packages/app-desktop/commands/switchProfile2.ts:7
|
||||
#: packages/app-desktop/commands/switchProfile3.ts:7
|
||||
#, fuzzy
|
||||
msgid "Switch to profile %d"
|
||||
msgstr "Not tipine dönüştür"
|
||||
msgstr "%d profiline geç"
|
||||
|
||||
#: packages/app-desktop/gui/utils/NoteListUtils.ts:114
|
||||
msgid "Switch to to-do type"
|
||||
@@ -3677,7 +3666,7 @@ msgstr "Tablo"
|
||||
|
||||
#: packages/app-mobile/components/screens/NoteTagsDialog.js:179
|
||||
msgid "tag1, tag2, ..."
|
||||
msgstr ""
|
||||
msgstr "etiket1, etiket2, ..."
|
||||
|
||||
#: packages/app-cli/app/command-import.js:52
|
||||
#: packages/app-desktop/gui/ImportScreen.min.js:73
|
||||
@@ -3721,7 +3710,7 @@ msgstr ""
|
||||
#: packages/app-desktop/app.ts:332
|
||||
msgid ""
|
||||
"The application did not close properly. Would you like to start in safe mode?"
|
||||
msgstr ""
|
||||
msgstr "Uygulama düzgün kapanmadı. Güvenli modda başlatmak ister misiniz?"
|
||||
|
||||
#: packages/lib/onedrive-api-node-utils.js:86
|
||||
msgid ""
|
||||
@@ -3889,7 +3878,7 @@ msgstr ""
|
||||
msgid "The sync target needs to be upgraded. Press this banner to proceed."
|
||||
msgstr ""
|
||||
"Senkronizasyon hedefinin güncellenmesi gerekmekte. Devam etmek için bu "
|
||||
"butona basın"
|
||||
"butona basın."
|
||||
|
||||
#: packages/lib/models/Tag.ts:204
|
||||
msgid "The tag \"%s\" already exists. Please choose a different name."
|
||||
@@ -4105,7 +4094,7 @@ msgstr ""
|
||||
|
||||
#: packages/lib/components/EncryptionConfigScreen/utils.ts:54
|
||||
msgid "To continue, please enter your master password below."
|
||||
msgstr "Devam etmek için lütfen aşağıya ana parolanızı girin"
|
||||
msgstr "Devam etmek için lütfen aşağıya ana parolanızı girin."
|
||||
|
||||
#: packages/app-cli/app/app-gui.js:452
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -4305,9 +4294,8 @@ msgid "Update profile"
|
||||
msgstr "Profili güncelle"
|
||||
|
||||
#: packages/server/src/services/TaskService.ts:32
|
||||
#, fuzzy
|
||||
msgid "Update total sizes"
|
||||
msgstr "Güncellenen yerel öğeler: %d."
|
||||
msgstr "Toplam ebatı güncelle"
|
||||
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.tsx:208
|
||||
#: packages/app-desktop/gui/ConfigScreen/controls/plugins/PluginBox.tsx:209
|
||||
@@ -4571,10 +4559,9 @@ msgid "Your data is going to be re-encrypted and synced again."
|
||||
msgstr "Veriniz yeniden şifrelenecek ve senkron edilecek."
|
||||
|
||||
#: packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.tsx:271
|
||||
#, fuzzy
|
||||
msgid "Your password is needed to decrypt some of your data."
|
||||
msgstr ""
|
||||
"Verilerinizin bir kısmının şifrelemesinin çözülmesi için ana parolanız "
|
||||
"Verilerinizin bir kısmının şifrelemesinin çözülmesi için parolanız "
|
||||
"gerekmektedir."
|
||||
|
||||
#: packages/app-cli/app/command-sync.ts:242
|
||||
|
||||
@@ -118,7 +118,7 @@ async function checkSourceZip(sourceZip, compiledZip) {
|
||||
console.info(await execCommand(`cp "${sourceZip}" .`));
|
||||
console.info(await execCommand(`unzip "${sourceZip}"`));
|
||||
process.chdir(`${sourceDir}/Clipper-source/popup`);
|
||||
console.info(await execCommand('yarn install'));
|
||||
console.info(await execCommand('npm install'));
|
||||
|
||||
process.chdir(compiledDir);
|
||||
console.info(await execCommand(`cp "${compiledZip}" .`));
|
||||
@@ -143,7 +143,7 @@ async function main() {
|
||||
// installed by CRA and 6.1.0 by us. It doesn't affect anything though, and the behaviour of the preflight
|
||||
// check is buggy so we can ignore it.
|
||||
console.info(await execCommand(`rm -rf ${clipperDir}/popup/build`));
|
||||
console.info(await execCommand('yarn run build'));
|
||||
console.info(await execCommand('npm run build'));
|
||||
|
||||
const dists = {
|
||||
chrome: {
|
||||
|
||||
@@ -48,7 +48,7 @@ yarn run updateNews $DISCOURSE_API_KEY $DISCOURSE_USERNAME
|
||||
|
||||
git add -A
|
||||
|
||||
git commit -m "Doc: Updated Markdown files
|
||||
git commit -m "Doc: Auto-update documentation
|
||||
|
||||
Auto-updated using $SCRIPT_NAME" || true
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Joplin changelog
|
||||
|
||||
## [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) (Pre-release) - 2022-05-17T14:48:06Z
|
||||
## [v2.8.8](https://github.com/laurent22/joplin/releases/tag/v2.8.8) - 2022-05-17T14:48:06Z
|
||||
|
||||
- Improved: Remove plugin backoff handler for now ([7ec3a7b](https://github.com/laurent22/joplin/commit/7ec3a7b))
|
||||
- Fixed: Dropbox login button is not visible in dark mode ([#6513](https://github.com/laurent22/joplin/issues/6513)) ([#6503](https://github.com/laurent22/joplin/issues/6503) by [@Retrove](https://github.com/Retrove))
|
||||
|
||||
@@ -10,7 +10,7 @@ Your download of <span class="downloaded-filename">Joplin</span> is in progress.
|
||||
|
||||
Access your notes on Windows, macOS or Linux.
|
||||
|
||||
<!-- DESKTOP-DOWNLOAD-LINKS --><a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-Setup-2.7.15.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.7.15/Joplin-2.7.15.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a><!-- DESKTOP-DOWNLOAD-LINKS -->
|
||||
<!-- DESKTOP-DOWNLOAD-LINKS --><a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-Setup-2.8.8.exe'><img alt='Get it on Windows' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeWindows.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.dmg'><img alt='Get it on macOS' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeMacOS.png'/></a> <a href='https://github.com/laurent22/joplin/releases/download/v2.8.8/Joplin-2.8.8.AppImage'><img alt='Get it on Linux' width="134px" src='https://raw.githubusercontent.com/laurent22/joplin/dev/Assets/WebsiteAssets/images/BadgeLinux.png'/></a><!-- DESKTOP-DOWNLOAD-LINKS -->
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
---
|
||||
forum_url: https://discourse.joplinapp.org/t/25943
|
||||
---
|
||||
|
||||
# Joplin 2.8 is available!
|
||||
|
||||
As always a lot of changes and new features in this new version available on both desktop and mobile.
|
||||
|
||||
293
yarn.lock
293
yarn.lock
@@ -2638,9 +2638,9 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@electron/get@npm:^1.0.1":
|
||||
version: 1.13.1
|
||||
resolution: "@electron/get@npm:1.13.1"
|
||||
"@electron/get@npm:^1.13.0":
|
||||
version: 1.14.1
|
||||
resolution: "@electron/get@npm:1.14.1"
|
||||
dependencies:
|
||||
debug: ^4.1.1
|
||||
env-paths: ^2.2.0
|
||||
@@ -2656,7 +2656,7 @@ __metadata:
|
||||
optional: true
|
||||
global-tunnel-ng:
|
||||
optional: true
|
||||
checksum: ea9863b73e8aedefb19cfe9b849c585b8bda29e11b90189b115680da4e9ab0167405efe63e5d141da2d13cde24eacacfde62f730f2730d047e58819fe69352f8
|
||||
checksum: 21fec5e82bbee8f9fa183b46e05675b137c3130c7999d3b2b34a0047d1a06ec3c76347b9bbdb9911ba9b2123697804e360a15dda9db614c0226d5d4dcc4d6d15
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2669,16 +2669,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@electron/universal@npm:1.0.5":
|
||||
version: 1.0.5
|
||||
resolution: "@electron/universal@npm:1.0.5"
|
||||
"@electron/universal@npm:1.2.1":
|
||||
version: 1.2.1
|
||||
resolution: "@electron/universal@npm:1.2.1"
|
||||
dependencies:
|
||||
"@malept/cross-spawn-promise": ^1.1.0
|
||||
asar: ^3.0.3
|
||||
asar: ^3.1.0
|
||||
debug: ^4.3.1
|
||||
dir-compare: ^2.4.0
|
||||
fs-extra: ^9.0.1
|
||||
checksum: 64eae3bbbfa422f28dbc1e92d12d954059cec7dac9ecc3ecad2c7895bb6cd10d30e8b3848092bfba8815bc71b60393a42f792751e50b9b5f643d6f1d03826b86
|
||||
minimatch: ^3.0.4
|
||||
plist: ^3.0.4
|
||||
checksum: 9a7d98cf2b8414ff0274384fef1b72b5a545a0feb7ce03163d2e2ee1b13e4f7064dfe7147cdd652708a1314d1b5e68acdd907847a1747866ec8d2d3e757ec1f7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3257,10 +3259,10 @@ __metadata:
|
||||
compare-versions: ^3.2.1
|
||||
countable: ^3.0.1
|
||||
debounce: ^1.2.0
|
||||
electron: 14.1.0
|
||||
electron-builder: ^22.11.7
|
||||
electron-notarize: ^1.0.0
|
||||
electron-rebuild: ^3.2.3
|
||||
electron: 18.2.0
|
||||
electron-builder: ^23.0.3
|
||||
electron-notarize: ^1.2.1
|
||||
electron-rebuild: ^3.2.7
|
||||
electron-window-state: ^4.1.1
|
||||
formatcoords: ^1.1.3
|
||||
fs-extra: 10.0.0
|
||||
@@ -3296,6 +3298,7 @@ __metadata:
|
||||
styled-components: 5.1.1
|
||||
styled-system: 5.1.5
|
||||
taboverride: ^4.0.3
|
||||
tabulator-tables: ^5.1.4
|
||||
tinymce: ^5.2.0
|
||||
typescript: 4.0.5
|
||||
dependenciesMeta:
|
||||
@@ -5815,13 +5818,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^14.14.6, @types/node@npm:^14.6.2":
|
||||
"@types/node@npm:^14.14.6":
|
||||
version: 14.18.0
|
||||
resolution: "@types/node@npm:14.18.0"
|
||||
checksum: b120c26fe5f30bc358e861db8d7e401e419d14bd9dd25c022f3c2ea8b0b429d4c9efd77ad5d6d2a8bde61702a6786fb74d409f1b2cbb61c79133e2a65aab4fb1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/node@npm:^16.11.26":
|
||||
version: 16.11.33
|
||||
resolution: "@types/node@npm:16.11.33"
|
||||
checksum: 5c86d3f1e3b996607b41405d368d2e19d410eee0054595cef73d230368a609a2863926e75ad19f5091f0fd742cd018b667d54c51292018dd8020a202a5b29fa9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/nodemailer@npm:^6.4.1":
|
||||
version: 6.4.4
|
||||
resolution: "@types/nodemailer@npm:6.4.4"
|
||||
@@ -6944,10 +6954,10 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"app-builder-bin@npm:3.7.1":
|
||||
version: 3.7.1
|
||||
resolution: "app-builder-bin@npm:3.7.1"
|
||||
checksum: aae6152d7e7e6eabe35e5430f8b4733cc713bd3f80fdb861c5b675ebc8951aa26b520821d27c5ee31f05e850cdfd9b923b58064307f1ae583fb4e7434d380209
|
||||
"app-builder-bin@npm:4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "app-builder-bin@npm:4.0.0"
|
||||
checksum: c3c8fd85c371b7a396c1bb1160ab2e3231ba4309abea5b36a5b366e42511e347c65a33ff50d56f4960b337833d539c263137b0ba131e2fa268c32edeb6c9f683
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -6958,36 +6968,37 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"app-builder-lib@npm:22.14.10":
|
||||
version: 22.14.10
|
||||
resolution: "app-builder-lib@npm:22.14.10"
|
||||
"app-builder-lib@npm:23.0.8":
|
||||
version: 23.0.8
|
||||
resolution: "app-builder-lib@npm:23.0.8"
|
||||
dependencies:
|
||||
7zip-bin: ~5.1.1
|
||||
"@develar/schema-utils": ~2.6.5
|
||||
"@electron/universal": 1.0.5
|
||||
"@electron/universal": 1.2.1
|
||||
"@malept/flatpak-bundler": ^0.4.0
|
||||
async-exit-hook: ^2.0.1
|
||||
bluebird-lst: ^1.0.9
|
||||
builder-util: 22.14.7
|
||||
builder-util-runtime: 8.9.2
|
||||
builder-util: 23.0.8
|
||||
builder-util-runtime: 9.0.2
|
||||
chromium-pickle-js: ^0.2.0
|
||||
debug: ^4.3.2
|
||||
ejs: ^3.1.6
|
||||
electron-osx-sign: ^0.5.0
|
||||
electron-publish: 22.14.7
|
||||
debug: ^4.3.4
|
||||
ejs: ^3.1.7
|
||||
electron-osx-sign: ^0.6.0
|
||||
electron-publish: 23.0.8
|
||||
form-data: ^4.0.0
|
||||
fs-extra: ^10.0.0
|
||||
hosted-git-info: ^4.0.2
|
||||
fs-extra: ^10.1.0
|
||||
hosted-git-info: ^4.1.0
|
||||
is-ci: ^3.0.0
|
||||
isbinaryfile: ^4.0.8
|
||||
isbinaryfile: ^4.0.10
|
||||
js-yaml: ^4.1.0
|
||||
lazy-val: ^1.0.5
|
||||
minimatch: ^3.0.4
|
||||
minimatch: ^3.1.2
|
||||
read-config-file: 6.2.0
|
||||
sanitize-filename: ^1.6.3
|
||||
semver: ^7.3.5
|
||||
semver: ^7.3.7
|
||||
tar: ^6.1.11
|
||||
temp-file: ^3.4.0
|
||||
checksum: 8e5021dab87b78cc52188cba15cb19bb28abf39e4d80c6c8f2fc0df69938d1a379b4c27d7229921d83a9c87f136115b7e8d8cd91676ed9711704c68533c85153
|
||||
checksum: c1f72f86ffa0f69ef91e43ba9792e0b3f90d844ac620dbc64a320e067a172b8b55b276fe3d2174e177ee347fe4cba9bfc12e830792be91893f414bea7fead6a7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -7369,7 +7380,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"asar@npm:^3.0.3":
|
||||
"asar@npm:^3.1.0":
|
||||
version: 3.1.0
|
||||
resolution: "asar@npm:3.1.0"
|
||||
dependencies:
|
||||
@@ -7553,6 +7564,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"async@npm:^3.2.3":
|
||||
version: 3.2.3
|
||||
resolution: "async@npm:3.2.3"
|
||||
checksum: c4bee57ab2249af3dc83ca3ef9acfa8e822c0d5e5aa41bae3eaf7f673648343cd64ecd7d26091ffd357f3f044428b17b5f00098494b6cf8b6b3e9681f0636ca1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"asynckit@npm:^0.4.0":
|
||||
version: 0.4.0
|
||||
resolution: "asynckit@npm:0.4.0"
|
||||
@@ -8761,29 +8779,29 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"builder-util-runtime@npm:8.9.2":
|
||||
version: 8.9.2
|
||||
resolution: "builder-util-runtime@npm:8.9.2"
|
||||
"builder-util-runtime@npm:9.0.2":
|
||||
version: 9.0.2
|
||||
resolution: "builder-util-runtime@npm:9.0.2"
|
||||
dependencies:
|
||||
debug: ^4.3.2
|
||||
debug: ^4.3.4
|
||||
sax: ^1.2.4
|
||||
checksum: 35adcd6162e2ed16635ff7b7ecc353e400dcbbb3e7cd01823bfefc7256cefca8c820f62d15a0f7dbee1c7495a5f1fba4e0e238857a79b48d5f6bd35064f27208
|
||||
checksum: 867768865f55ed0f326f542fd0cfb10bb3619a952ef691bf9896b5dc84271639d177cf8c1ec28aba36d467743ba77886573c6c8bb7af90740e7ea18f81ef5daf
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"builder-util@npm:22.14.7":
|
||||
version: 22.14.7
|
||||
resolution: "builder-util@npm:22.14.7"
|
||||
"builder-util@npm:23.0.8":
|
||||
version: 23.0.8
|
||||
resolution: "builder-util@npm:23.0.8"
|
||||
dependencies:
|
||||
7zip-bin: ~5.1.1
|
||||
"@types/debug": ^4.1.6
|
||||
"@types/fs-extra": ^9.0.11
|
||||
app-builder-bin: 3.7.1
|
||||
app-builder-bin: 4.0.0
|
||||
bluebird-lst: ^1.0.9
|
||||
builder-util-runtime: 8.9.2
|
||||
builder-util-runtime: 9.0.2
|
||||
chalk: ^4.1.1
|
||||
cross-spawn: ^7.0.3
|
||||
debug: ^4.3.2
|
||||
debug: ^4.3.4
|
||||
fs-extra: ^10.0.0
|
||||
http-proxy-agent: ^5.0.0
|
||||
https-proxy-agent: ^5.0.0
|
||||
@@ -8792,7 +8810,7 @@ __metadata:
|
||||
source-map-support: ^0.5.19
|
||||
stat-mode: ^1.0.0
|
||||
temp-file: ^3.4.0
|
||||
checksum: 4f850a8d1bbf12823b6ca712aeaf99474a4799107b92f3aad64910935fe5b01ca1c6cc29e0c2344a03249ba88f654be3bd6775c2ef634977de44510dd36bb37d
|
||||
checksum: 926c09a3962f56aad5483be1258c49ed4935c90ec4ea7c342e5998fbb5652cbee0e18a047e0c644786a63c9b4cecfa6de1e64b1c49fb2961109c892c11941b0e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9252,7 +9270,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2":
|
||||
"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2":
|
||||
version: 4.1.2
|
||||
resolution: "chalk@npm:4.1.2"
|
||||
dependencies:
|
||||
@@ -9873,7 +9891,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"colors@npm:^1.1.2, colors@npm:^1.3.3, colors@npm:^1.4.0":
|
||||
"colors@npm:^1.1.2, colors@npm:^1.4.0":
|
||||
version: 1.4.0
|
||||
resolution: "colors@npm:1.4.0"
|
||||
checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec
|
||||
@@ -11695,7 +11713,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2":
|
||||
"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1":
|
||||
version: 4.3.3
|
||||
resolution: "debug@npm:4.3.3"
|
||||
dependencies:
|
||||
@@ -11740,6 +11758,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"debug@npm:^4.3.4":
|
||||
version: 4.3.4
|
||||
resolution: "debug@npm:4.3.4"
|
||||
dependencies:
|
||||
ms: 2.1.2
|
||||
peerDependenciesMeta:
|
||||
supports-color:
|
||||
optional: true
|
||||
checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"debuglog@npm:^1.0.1":
|
||||
version: 1.0.1
|
||||
resolution: "debuglog@npm:1.0.1"
|
||||
@@ -12380,27 +12410,27 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dmg-builder@npm:22.14.10":
|
||||
version: 22.14.10
|
||||
resolution: "dmg-builder@npm:22.14.10"
|
||||
"dmg-builder@npm:23.0.8":
|
||||
version: 23.0.8
|
||||
resolution: "dmg-builder@npm:23.0.8"
|
||||
dependencies:
|
||||
app-builder-lib: 22.14.10
|
||||
builder-util: 22.14.7
|
||||
builder-util-runtime: 8.9.2
|
||||
dmg-license: ^1.0.9
|
||||
app-builder-lib: 23.0.8
|
||||
builder-util: 23.0.8
|
||||
builder-util-runtime: 9.0.2
|
||||
dmg-license: ^1.0.11
|
||||
fs-extra: ^10.0.0
|
||||
iconv-lite: ^0.6.2
|
||||
js-yaml: ^4.1.0
|
||||
dependenciesMeta:
|
||||
dmg-license:
|
||||
optional: true
|
||||
checksum: f48280f7a14791d94378f8d9b00f19705cafb3d26d1a86a6c2fd698f2ad25cb887b4f437f883f5df62406754bdcdf1203e7199baaf8ae606d7b570c285fbfb2d
|
||||
checksum: 8a36e199e1739cc9b3a242136e6ffb6cd7971417c2a14866097b4b348fab0ae5b96509ca946bb5e22e1359590d7c7b93b7cbff0997cbd1c3a6c8cc5bec1d17a6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"dmg-license@npm:^1.0.9":
|
||||
version: 1.0.10
|
||||
resolution: "dmg-license@npm:1.0.10"
|
||||
"dmg-license@npm:^1.0.11":
|
||||
version: 1.0.11
|
||||
resolution: "dmg-license@npm:1.0.11"
|
||||
dependencies:
|
||||
"@types/plist": ^3.0.1
|
||||
"@types/verror": ^1.10.3
|
||||
@@ -12737,7 +12767,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ejs@npm:^3.1.5, ejs@npm:^3.1.6":
|
||||
"ejs@npm:^3.1.5":
|
||||
version: 3.1.6
|
||||
resolution: "ejs@npm:3.1.6"
|
||||
dependencies:
|
||||
@@ -12748,16 +12778,27 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-builder@npm:^22.11.7":
|
||||
version: 22.14.10
|
||||
resolution: "electron-builder@npm:22.14.10"
|
||||
"ejs@npm:^3.1.7":
|
||||
version: 3.1.7
|
||||
resolution: "ejs@npm:3.1.7"
|
||||
dependencies:
|
||||
jake: ^10.8.5
|
||||
bin:
|
||||
ejs: bin/cli.js
|
||||
checksum: fe40764af39955ce8f8b116716fc8b911959946698edb49ecab85df597746c07aa65d5b74ead28a1e2ffa75b0f92d9bedd752f1c29437da6137b3518271e988c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-builder@npm:^23.0.3":
|
||||
version: 23.0.8
|
||||
resolution: "electron-builder@npm:23.0.8"
|
||||
dependencies:
|
||||
"@types/yargs": ^17.0.1
|
||||
app-builder-lib: 22.14.10
|
||||
builder-util: 22.14.7
|
||||
builder-util-runtime: 8.9.2
|
||||
app-builder-lib: 23.0.8
|
||||
builder-util: 23.0.8
|
||||
builder-util-runtime: 9.0.2
|
||||
chalk: ^4.1.1
|
||||
dmg-builder: 22.14.10
|
||||
dmg-builder: 23.0.8
|
||||
fs-extra: ^10.0.0
|
||||
is-ci: ^3.0.0
|
||||
lazy-val: ^1.0.5
|
||||
@@ -12767,23 +12808,23 @@ __metadata:
|
||||
bin:
|
||||
electron-builder: cli.js
|
||||
install-app-deps: install-app-deps.js
|
||||
checksum: 353cbeb2e5f1d670d7315b2ba4b1ada5c03b553641fb4ce0c06c3e7443ca037536bdbf07c18951b8a899ff7c59b5ebcc6cbdad9e9789f6eddef2703b8b1d83ad
|
||||
checksum: 56da948ce639b3a24b7a746bb9598bcabffb948d0494cc410b927d5e623a6b16e3ea1a9ef567b4c8a3f121b44e90200defde2289e8ef7f5942e0946a43e9ffae
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-notarize@npm:^1.0.0":
|
||||
version: 1.1.1
|
||||
resolution: "electron-notarize@npm:1.1.1"
|
||||
"electron-notarize@npm:^1.2.1":
|
||||
version: 1.2.1
|
||||
resolution: "electron-notarize@npm:1.2.1"
|
||||
dependencies:
|
||||
debug: ^4.1.1
|
||||
fs-extra: ^9.0.1
|
||||
checksum: c1f822761277c817c3b7b5ed1ef2a2aabf70733f79e670b2f0b5bac31b9d63fb9ef4d9fae2051192727d811c6b6007de846e39844ab51d13986c1771d5d04d28
|
||||
checksum: d109136a855b31020cb833a51dcf5a3aa6c0ee5b95ca8f6aa5d6296a299aa8fe46bb15cc2fa9189ab97da8c4402c675af7c592c46d7940f0e2662c59a9e499fd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-osx-sign@npm:^0.5.0":
|
||||
version: 0.5.0
|
||||
resolution: "electron-osx-sign@npm:0.5.0"
|
||||
"electron-osx-sign@npm:^0.6.0":
|
||||
version: 0.6.0
|
||||
resolution: "electron-osx-sign@npm:0.6.0"
|
||||
dependencies:
|
||||
bluebird: ^3.5.0
|
||||
compare-version: ^0.1.2
|
||||
@@ -12794,36 +12835,36 @@ __metadata:
|
||||
bin:
|
||||
electron-osx-flat: bin/electron-osx-flat.js
|
||||
electron-osx-sign: bin/electron-osx-sign.js
|
||||
checksum: ca1e55d8cb0987b78bfaf197860e73f7e6266cb219f3d6fd32f25665a8393efb284115db9e2246b42f75cdf6163c148060aff8a02960f4f810c6502d6f7d447c
|
||||
checksum: b688f9efb013670b4226cff7c38101e7b1384ea44e1ab203259995f1eefc019c63aa18e936217a76d33b5a5a452b987ab3d86a56a961294582ce42acbb950de6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-publish@npm:22.14.7":
|
||||
version: 22.14.7
|
||||
resolution: "electron-publish@npm:22.14.7"
|
||||
"electron-publish@npm:23.0.8":
|
||||
version: 23.0.8
|
||||
resolution: "electron-publish@npm:23.0.8"
|
||||
dependencies:
|
||||
"@types/fs-extra": ^9.0.11
|
||||
builder-util: 22.14.7
|
||||
builder-util-runtime: 8.9.2
|
||||
builder-util: 23.0.8
|
||||
builder-util-runtime: 9.0.2
|
||||
chalk: ^4.1.1
|
||||
fs-extra: ^10.0.0
|
||||
lazy-val: ^1.0.5
|
||||
mime: ^2.5.2
|
||||
checksum: a1584c23dc34e4c19f0a7418706715b0e39caf6516195cd6426bdbf432164a4af5993851b7c0a4eda72883ba0b24ab711483772fa85fc97b88de93d817c90f0c
|
||||
checksum: 511ea2a71aa48e6990c2fb8b38684c31e7026f6dd82eebeacf9822e13160474382a91233a280e92e160717f250ebcc81be92f61b92bb231d815d99e52300ba16
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron-rebuild@npm:^3.2.3":
|
||||
version: 3.2.5
|
||||
resolution: "electron-rebuild@npm:3.2.5"
|
||||
"electron-rebuild@npm:^3.2.7":
|
||||
version: 3.2.7
|
||||
resolution: "electron-rebuild@npm:3.2.7"
|
||||
dependencies:
|
||||
"@malept/cross-spawn-promise": ^2.0.0
|
||||
colors: ^1.3.3
|
||||
chalk: ^4.0.0
|
||||
debug: ^4.1.1
|
||||
detect-libc: ^1.0.3
|
||||
fs-extra: ^10.0.0
|
||||
got: ^11.7.0
|
||||
lzma-native: ^8.0.1
|
||||
lzma-native: ^8.0.5
|
||||
node-abi: ^3.0.0
|
||||
node-api-version: ^0.1.4
|
||||
node-gyp: ^8.4.0
|
||||
@@ -12833,7 +12874,7 @@ __metadata:
|
||||
yargs: ^17.0.1
|
||||
bin:
|
||||
electron-rebuild: lib/src/cli.js
|
||||
checksum: 544ec1f1297c88166a1bcb34173f8144f7de147c10be62cbb3e4503cfe67cd562870c0d8713257a5b6433e0ac5f97d465621c85c92dce3378d597db0dff244ed
|
||||
checksum: cb466366910d020c4e6d36a42f87dfd616e5dbf4c2636244575873400be2ec2b76ab916c73f441fdcf90baa17afec8cb45a4ff42c7e0291aa0b7a7fca91d5ad2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -12862,16 +12903,16 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"electron@npm:14.1.0":
|
||||
version: 14.1.0
|
||||
resolution: "electron@npm:14.1.0"
|
||||
"electron@npm:18.2.0":
|
||||
version: 18.2.0
|
||||
resolution: "electron@npm:18.2.0"
|
||||
dependencies:
|
||||
"@electron/get": ^1.0.1
|
||||
"@types/node": ^14.6.2
|
||||
"@electron/get": ^1.13.0
|
||||
"@types/node": ^16.11.26
|
||||
extract-zip: ^1.0.3
|
||||
bin:
|
||||
electron: cli.js
|
||||
checksum: 8b17f8cabba2b6842e71e11a8889f366712f32219d35c49f093d69939ff78c22b0e0870ec1a4ab851270015e43f00f9d759b0283998fd2d3065c8c20eca8b597
|
||||
checksum: 242169d6e22854248e427326a03910b96311333d5dd57aa0e4cd9cef733aa8c2e893b16269c32514ad325468cdc08c41736d6f1f6791770cad236652fe06662c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -16601,7 +16642,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hosted-git-info@npm:^4.0.1, hosted-git-info@npm:^4.0.2":
|
||||
"hosted-git-info@npm:^4.0.1":
|
||||
version: 4.0.2
|
||||
resolution: "hosted-git-info@npm:4.0.2"
|
||||
dependencies:
|
||||
@@ -16610,6 +16651,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hosted-git-info@npm:^4.1.0":
|
||||
version: 4.1.0
|
||||
resolution: "hosted-git-info@npm:4.1.0"
|
||||
dependencies:
|
||||
lru-cache: ^6.0.0
|
||||
checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"html-encoding-sniffer@npm:^1.0.2":
|
||||
version: 1.0.2
|
||||
resolution: "html-encoding-sniffer@npm:1.0.2"
|
||||
@@ -18280,13 +18330,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"isbinaryfile@npm:^4.0.0, isbinaryfile@npm:^4.0.8":
|
||||
"isbinaryfile@npm:^4.0.0":
|
||||
version: 4.0.8
|
||||
resolution: "isbinaryfile@npm:4.0.8"
|
||||
checksum: 606e3bb648d1a0dee23459d1d937bb2560e66a5281ec7c9ff50e585402d73321ac268d0f34cb7393125b3ebc4c7962d39e50a01cdb8904b52fce08b7ccd2bf9f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"isbinaryfile@npm:^4.0.10":
|
||||
version: 4.0.10
|
||||
resolution: "isbinaryfile@npm:4.0.10"
|
||||
checksum: a6b28db7e23ac7a77d3707567cac81356ea18bd602a4f21f424f862a31d0e7ab4f250759c98a559ece35ffe4d99f0d339f1ab884ffa9795172f632ab8f88e686
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"isexe@npm:^2.0.0":
|
||||
version: 2.0.0
|
||||
resolution: "isexe@npm:2.0.0"
|
||||
@@ -18491,6 +18548,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"jake@npm:^10.8.5":
|
||||
version: 10.8.5
|
||||
resolution: "jake@npm:10.8.5"
|
||||
dependencies:
|
||||
async: ^3.2.3
|
||||
chalk: ^4.0.2
|
||||
filelist: ^1.0.1
|
||||
minimatch: ^3.0.4
|
||||
bin:
|
||||
jake: ./bin/cli.js
|
||||
checksum: 56c913ecf5a8d74325d0af9bc17a233bad50977438d44864d925bb6c45c946e0fee8c4c1f5fe2225471ef40df5222e943047982717ebff0d624770564d3c46ba
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"jest-changed-files@npm:^26.6.2":
|
||||
version: 26.6.2
|
||||
resolution: "jest-changed-files@npm:26.6.2"
|
||||
@@ -20586,9 +20657,9 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"lzma-native@npm:^8.0.1":
|
||||
version: 8.0.1
|
||||
resolution: "lzma-native@npm:8.0.1"
|
||||
"lzma-native@npm:^8.0.5":
|
||||
version: 8.0.6
|
||||
resolution: "lzma-native@npm:8.0.6"
|
||||
dependencies:
|
||||
node-addon-api: ^3.1.0
|
||||
node-gyp: latest
|
||||
@@ -20596,7 +20667,7 @@ __metadata:
|
||||
readable-stream: ^3.6.0
|
||||
bin:
|
||||
lzmajs: bin/lzmajs
|
||||
checksum: abf2c527101060ab450d49c28693226ab175aeb2b56d976fb4ce49985ddba1e8251bd0e5af13fa225dac80faa805b71f0bba984c0ac1f7db5fbbc65e9f8d7b62
|
||||
checksum: cbe782fd53309163a9362d0b5a960051936268a891779d26fdfe42085ce7fa309dc96e91414fe64ddd2bde2e2c25fc18e1d89aa6a2691557dd89b6582840a979
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -21771,6 +21842,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^3.1.2":
|
||||
version: 3.1.2
|
||||
resolution: "minimatch@npm:3.1.2"
|
||||
dependencies:
|
||||
brace-expansion: ^1.1.7
|
||||
checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"minimatch@npm:^5.0.1":
|
||||
version: 5.0.1
|
||||
resolution: "minimatch@npm:5.0.1"
|
||||
@@ -29017,6 +29097,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tabulator-tables@npm:^5.1.4":
|
||||
version: 5.1.4
|
||||
resolution: "tabulator-tables@npm:5.1.4"
|
||||
checksum: f77f9e975502253ec945d66d5d2f1fb615743824a05c6e8b67013c8f53976edb3c734ef1286c24253d85dd3990e596e3f04ecc1fbd0682541b5ed1a5a6c0d762
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"taketalk@npm:^1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "taketalk@npm:1.0.0"
|
||||
@@ -29184,7 +29271,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.2":
|
||||
"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2":
|
||||
version: 6.1.11
|
||||
resolution: "tar@npm:6.1.11"
|
||||
dependencies:
|
||||
|
||||
Reference in New Issue
Block a user