You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-08-27 20:29:45 +02:00
Compare commits
13 Commits
ios-v10.0.
...
android-v1
Author | SHA1 | Date | |
---|---|---|---|
|
de1bfa5c34 | ||
|
478b8f00d8 | ||
|
860d2fd7f5 | ||
|
6ce091f4d8 | ||
|
ce595ac5e4 | ||
|
267436a00d | ||
|
97e0f4258a | ||
|
faa6ccc150 | ||
|
349cade946 | ||
|
0200aa92de | ||
|
60ed2cbee5 | ||
|
0e7b2f36c8 | ||
|
4083221b21 |
2023
CliClient/locales/bg_BG.po
Normal file
2023
CliClient/locales/bg_BG.po
Normal file
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
"X-Generator: Poedit 2.2.3\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
msgid "To delete a tag, untag the associated notes."
|
||||
@@ -1318,7 +1318,7 @@ msgid "WebDAV password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Attachment download behaviour"
|
||||
msgstr ""
|
||||
msgstr "Attachment download behavior"
|
||||
|
||||
msgid ""
|
||||
"In \"Manual\" mode, attachments are downloaded only when you click on them. "
|
||||
@@ -1603,9 +1603,8 @@ msgstr ""
|
||||
msgid "Item \"%s\" could not be downloaded: %s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Items that cannot be decrypted"
|
||||
msgstr "Items that cannot be synchronized"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Joplin failed to decrypt these items multiple times, possibly because they "
|
||||
|
14
README.md
14
README.md
@@ -8,13 +8,13 @@ Notes exported from Evernote via .enex files [can be imported](#importing) into
|
||||
|
||||
The notes can be [synchronised](#synchronisation) with various cloud services including [Nextcloud](https://nextcloud.com/), Dropbox, OneDrive, WebDAV or the file system (for example with a network directory). When synchronising the notes, notebooks, tags and other metadata are saved to plain text files which can be easily inspected, backed up and moved around.
|
||||
|
||||
The application is available for Windows, Linux, macOS, Android and iOS. A [Web Clipper](https://github.com/laurent22/joplin/blob/master/readme/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB).
|
||||
The application is available for Windows, Linux, macOS, Android and iOS (the terminal app also work on FreeBSD). A [Web Clipper](https://github.com/laurent22/joplin/blob/master/readme/clipper.md), to save web pages and screenshots from your browser, is also available for [Firefox](https://addons.mozilla.org/en-US/firefox/addon/joplin-web-clipper/) and [Chrome](https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB).
|
||||
|
||||
<div class="top-screenshot"><img src="https://joplinapp.org/images/AllClients.jpg" style="max-width: 100%; max-height: 35em;"></div>
|
||||
|
||||
# Installation
|
||||
|
||||
Three types of applications are available: for the **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS and Linux). All applications have similar user interfaces and can synchronise with each other.
|
||||
Three types of applications are available: for the **desktop** (Windows, macOS and Linux), for **mobile** (Android and iOS) and for **terminal** (Windows, macOS, Linux and FreeBSD). All applications have similar user interfaces and can synchronise with each other.
|
||||
|
||||
## Desktop applications
|
||||
|
||||
@@ -28,7 +28,7 @@ Linux | <a href='https://github.com/laurent22/joplin/releases/download/
|
||||
|
||||
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://joplinapp.org/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.271/joplin-v1.0.271.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://joplinapp.org/images/BadgeAndroid.png'/></a> | or [Download APK File](https://github.com/laurent22/joplin-android/releases/download/android-v1.0.276/joplin-v1.0.276.apk)
|
||||
iOS | <a href='https://itunes.apple.com/us/app/joplin/id1315599797'><img alt='Get it on the App Store' height="40px" src='https://joplinapp.org/images/BadgeIOS.png'/></a> | -
|
||||
|
||||
## Terminal application
|
||||
@@ -207,9 +207,9 @@ More information about this feature in the [announcement post](https://www.patre
|
||||
|
||||
Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under "Text editor command".
|
||||
|
||||
# Attachments / Resources
|
||||
# Attachments
|
||||
|
||||
Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the resource. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.
|
||||
Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.
|
||||
|
||||
On the **desktop application**, images can be attached either by clicking on "Attach file" or by pasting (with Ctrl+V) an image directly in the editor, or by drag and dropping an image.
|
||||
|
||||
@@ -217,6 +217,10 @@ Resources that are not attached to any note will be automatically deleted after
|
||||
|
||||
**Important:** Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.
|
||||
|
||||
## Downloading attachments
|
||||
|
||||
The way the attachments are downloaded during synchronisation can be customised in the Configuration screen, under "Attachment download behaviour". The default option ("Always") is to download all the attachments, all the time, so that the data is available even when the device is offline. There is also the option to download the attachments manually (option "Manual"), by clicking on it, or automatically (Option "Auto"), in which case the attachments are downloaded only when a note is opened. These options should help saving disk space and network bandwidth, especially on mobile.
|
||||
|
||||
# Notifications
|
||||
|
||||
On the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:
|
||||
|
@@ -94,10 +94,10 @@ android {
|
||||
applicationId "net.cozic.joplin"
|
||||
minSdkVersion rootProject.ext.minSdkVersion
|
||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||
versionCode 2097507
|
||||
versionName "1.0.271"
|
||||
versionCode 2097512
|
||||
versionName "1.0.276"
|
||||
ndk {
|
||||
abiFilters "armeabi-v7a", "x86"
|
||||
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
||||
}
|
||||
missingDimensionStrategy 'react-native-camera', 'general'
|
||||
}
|
||||
|
@@ -19,5 +19,5 @@
|
||||
|
||||
# Required for react-native-webview
|
||||
# https://github.com/react-native-community/react-native-webview/blob/master/docs/Getting-Started.md
|
||||
# android.useAndroidX=true
|
||||
# android.enableJetifier=true
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
@@ -1,5 +1,5 @@
|
||||
const React = require('react'); const Component = React.Component;
|
||||
const { Platform, TouchableOpacity, Linking, View, Switch, StyleSheet, Text, Button, ScrollView, TextInput } = require('react-native');
|
||||
const { Platform, TouchableOpacity, Linking, View, Switch, StyleSheet, Text, Button, ScrollView, TextInput, Alert } = require('react-native');
|
||||
const { connect } = require('react-redux');
|
||||
const { ScreenHeader } = require('lib/components/screen-header.js');
|
||||
const { _, setLocale } = require('lib/locale.js');
|
||||
@@ -7,6 +7,7 @@ const { BaseScreenComponent } = require('lib/components/base-screen.js');
|
||||
const { Dropdown } = require('lib/components/Dropdown.js');
|
||||
const { themeStyle } = require('lib/components/global-style.js');
|
||||
const Setting = require('lib/models/Setting.js');
|
||||
const BaseItem = require('lib/models/BaseItem.js');
|
||||
const shared = require('lib/components/shared/config-shared.js');
|
||||
const SyncTargetRegistry = require('lib/SyncTargetRegistry');
|
||||
const { reg } = require('lib/registry.js');
|
||||
@@ -33,6 +34,35 @@ class ConfigScreenComponent extends BaseScreenComponent {
|
||||
this.saveButton_press = () => {
|
||||
return shared.saveSettings(this);
|
||||
};
|
||||
|
||||
this.clearSyncStateButton_click = () => {
|
||||
Alert.alert(
|
||||
'',
|
||||
_('WARNING: This will clear the local synchronisation state. It means the entire data will be synced again with the sync target. DO NOT USE if you have not been advised to do so, or if you do not understand the consequences.'),
|
||||
[
|
||||
{
|
||||
text: _('Help'),
|
||||
onPress: () => {
|
||||
Linking.openURL('https://joplinapp.org/faq/#how-to-clear-local-sync-data');
|
||||
},
|
||||
},
|
||||
{
|
||||
text: _('Cancel'),
|
||||
onPress: () => {},
|
||||
style: 'cancel',
|
||||
},
|
||||
{
|
||||
text: _('OK'),
|
||||
onPress: async () => {
|
||||
const syncTarget = this.props.settings['sync.target'];
|
||||
await BaseItem.clearLocalSyncState(syncTarget);
|
||||
alert(_('The local sync data has been cleared.'));
|
||||
},
|
||||
},
|
||||
],
|
||||
{ cancelable: false },
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
UNSAFE_componentWillMount() {
|
||||
@@ -273,6 +303,18 @@ class ConfigScreenComponent extends BaseScreenComponent {
|
||||
|
||||
const settingComps = shared.settingsToComponents2(this, 'mobile', settings);
|
||||
|
||||
settingComps.push(this.renderHeader('advanced', _('Advanced')));
|
||||
|
||||
settingComps.push(
|
||||
<View key="advanced_clear_sync_state" style={this.styles().settingContainer}>
|
||||
<View style={{flex:1, flexDirection: 'column'}}>
|
||||
<View style={{flex:1}}>
|
||||
<Button title={_('Clear synchronisation state')} onPress={this.clearSyncStateButton_click}/>
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
);
|
||||
|
||||
settingComps.push(this.renderHeader('moreInfo', _('More information')));
|
||||
|
||||
if (Platform.OS === 'android' && Platform.Version >= 23) {
|
||||
|
@@ -446,13 +446,15 @@ class NoteScreenComponent extends BaseScreenComponent {
|
||||
const fileStat = await shim.fsDriver().stat(targetPath);
|
||||
resource.size = fileStat.size;
|
||||
|
||||
await Resource.save(resource, { isNew: true });
|
||||
resource = await Resource.save(resource, { isNew: true });
|
||||
|
||||
const resourceTag = Resource.markdownTag(resource);
|
||||
|
||||
const newNote = Object.assign({}, this.state.note);
|
||||
newNote.body += "\n" + resourceTag;
|
||||
this.setState({ note: newNote });
|
||||
|
||||
this.refreshResource(resource);
|
||||
}
|
||||
|
||||
async attachPhoto_onPress() {
|
||||
|
@@ -694,6 +694,11 @@ class BaseItem extends BaseModel {
|
||||
}
|
||||
}
|
||||
|
||||
static async clearLocalSyncState(syncTarget) {
|
||||
await this.db().exec('DELETE FROM sync_items WHERE sync_target = ?', [syncTarget]);
|
||||
await this.db().exec('DELETE FROM deleted_items WHERE sync_target = ?', [syncTarget]);
|
||||
}
|
||||
|
||||
static async forceSync(itemId) {
|
||||
await this.db().exec('UPDATE sync_items SET force_sync = 1 WHERE item_id = ?', [itemId]);
|
||||
}
|
||||
|
@@ -32,6 +32,11 @@ class Resource extends BaseItem {
|
||||
return imageMimeTypes.indexOf(type.toLowerCase()) >= 0;
|
||||
}
|
||||
|
||||
static fetchStatuses(resourceIds) {
|
||||
if (!resourceIds.length) return [];
|
||||
return this.db().selectAll('SELECT resource_id, fetch_status FROM resource_local_states WHERE resource_id IN ("' + resourceIds.join('","') + '")');
|
||||
}
|
||||
|
||||
static needToBeFetched(resourceDownloadMode = null, limit = null) {
|
||||
let sql = ['SELECT * FROM resources WHERE encryption_applied = 0 AND id IN (SELECT resource_id FROM resource_local_states WHERE fetch_status = ?)'];
|
||||
if (resourceDownloadMode !== 'always') {
|
||||
|
@@ -75,11 +75,19 @@ class ResourceFetcher extends BaseService {
|
||||
async markForDownload(resourceIds) {
|
||||
if (!Array.isArray(resourceIds)) resourceIds = [resourceIds];
|
||||
|
||||
for (const id of resourceIds) {
|
||||
const fetchStatuses = await Resource.fetchStatuses(resourceIds);
|
||||
|
||||
const idsToKeep = [];
|
||||
for (const status of fetchStatuses) {
|
||||
if (status.fetch_status !== Resource.FETCH_STATUS_IDLE) continue;
|
||||
idsToKeep.push(status.resource_id);
|
||||
}
|
||||
|
||||
for (const id of idsToKeep) {
|
||||
await Resource.markForDownload(id);
|
||||
}
|
||||
|
||||
for (const id of resourceIds) {
|
||||
for (const id of idsToKeep) {
|
||||
this.queueDownload_(id, 'high');
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
const fs = require('fs-extra');
|
||||
const { execCommand, githubRelease, githubOauthToken, isWindows, fileExists } = require('./tool-utils.js');
|
||||
const { execCommand, githubRelease, githubOauthToken, isWindows, fileExists, readline } = require('./tool-utils.js');
|
||||
const path = require('path');
|
||||
const fetch = require('node-fetch');
|
||||
const uriTemplate = require('uri-template');
|
||||
@@ -8,6 +8,17 @@ const rnDir = __dirname + '/../ReactNativeClient';
|
||||
const rootDir = path.dirname(__dirname);
|
||||
const releaseDir = rootDir + '/_releases';
|
||||
|
||||
function wslToWinPath(wslPath) {
|
||||
const s = wslPath.split('/');
|
||||
if (s.length < 3) return s.join('\\');
|
||||
s.splice(0, 1);
|
||||
if (s[0] !== 'mnt' || s[1].length !== 1) return s.join('\\');
|
||||
s.splice(0, 1);
|
||||
s[0] = s[0].toUpperCase() + ':';
|
||||
while (s.length && !s[s.length - 1]) s.pop();
|
||||
return s.join('\\');
|
||||
}
|
||||
|
||||
function increaseGradleVersionCode(content) {
|
||||
const newContent = content.replace(/versionCode\s+(\d+)/, function(a, versionCode, c) {
|
||||
const n = Number(versionCode);
|
||||
@@ -64,19 +75,38 @@ async function main() {
|
||||
console.info('Building APK file v' + version + '...');
|
||||
|
||||
let restoreDir = null;
|
||||
let apkBuildCmd = 'assembleRelease -PbuildDir=build'; // --console plain
|
||||
let apkBuildCmd = 'assembleRelease -PbuildDir=build';
|
||||
if (await fileExists('/mnt/c/Windows/System32/cmd.exe')) {
|
||||
apkBuildCmd = '/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat ' + apkBuildCmd + '"';
|
||||
// In recent versions (of Gradle? React Native?), running gradlew.bat from WSL throws the following error:
|
||||
|
||||
// Error: Command failed: /mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\android && gradlew.bat assembleRelease -PbuildDir=build"
|
||||
|
||||
// FAILURE: Build failed with an exception.
|
||||
|
||||
// * What went wrong:
|
||||
// Could not determine if Stdout is a console: could not get handle file information (errno 1)
|
||||
|
||||
// So we need to manually run the command from DOS, and then coming back here to finish the process once it's done.
|
||||
|
||||
console.info('Run this command from DOS:');
|
||||
console.info('');
|
||||
console.info('cd "' + wslToWinPath(rootDir) + '\\ReactNativeClient\\android" && gradlew.bat ' + apkBuildCmd + '"');
|
||||
console.info('');
|
||||
await readline('Press Enter when done:');
|
||||
apkBuildCmd = ''; // Clear the command because we've already ran it
|
||||
|
||||
// apkBuildCmd = '/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat ' + apkBuildCmd + '"';
|
||||
} else {
|
||||
process.chdir(rnDir + '/android');
|
||||
apkBuildCmd = './gradlew ' + apkBuildCmd;
|
||||
restoreDir = rootDir;
|
||||
}
|
||||
|
||||
// const output = await execCommand('/mnt/c/Windows/System32/cmd.exe /c "cd ReactNativeClient\\android && gradlew.bat assembleRelease -PbuildDir=build --console plain"');
|
||||
console.info(apkBuildCmd);
|
||||
const output = await execCommand(apkBuildCmd);
|
||||
console.info(output);
|
||||
if (apkBuildCmd) {
|
||||
console.info(apkBuildCmd);
|
||||
const output = await execCommand(apkBuildCmd);
|
||||
console.info(output);
|
||||
}
|
||||
|
||||
if (restoreDir) process.chdir(restoreDir);
|
||||
|
||||
|
@@ -123,6 +123,22 @@ toolUtils.githubRelease = async function(project, tagName, options = null) {
|
||||
return responseJson;
|
||||
}
|
||||
|
||||
toolUtils.readline = question => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const readline = require('readline');
|
||||
|
||||
const rl = readline.createInterface({
|
||||
input: process.stdin,
|
||||
output: process.stdout
|
||||
});
|
||||
|
||||
rl.question(question + ' ', answer => {
|
||||
resolve(answer);
|
||||
rl.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
toolUtils.isLinux = () => {
|
||||
return process && process.platform === 'linux';
|
||||
}
|
||||
|
@@ -273,10 +273,10 @@
|
||||
<p>Joplin is a free, open source note taking and to-do application, which can handle a large number of notes organised into notebooks. The notes are searchable, can be copied, tagged and modified either from the applications directly or from your own text editor. The notes are in <a href="#markdown">Markdown format</a>.</p>
|
||||
<p>Notes exported from Evernote via .enex files <a href="#importing">can be imported</a> into Joplin, including the formatted content (which is converted to Markdown), resources (images, attachments, etc.) and complete metadata (geolocation, updated time, created time, etc.). Plain Markdown files can also be imported.</p>
|
||||
<p>The notes can be <a href="#synchronisation">synchronised</a> with various cloud services including <a href="https://nextcloud.com/">Nextcloud</a>, Dropbox, OneDrive, WebDAV or the file system (for example with a network directory). When synchronising the notes, notebooks, tags and other metadata are saved to plain text files which can be easily inspected, backed up and moved around.</p>
|
||||
<p>The application is available for Windows, Linux, macOS, Android and iOS. A <a href="https://github.com/laurent22/joplin/blob/master/readme/clipper.md">Web Clipper</a>, to save web pages and screenshots from your browser, is also available for <a href="https://addons.mozilla.org/en-US/firefox/addon/joplin-web-clipper/">Firefox</a> and <a href="https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB">Chrome</a>.</p>
|
||||
<p>The application is available for Windows, Linux, macOS, Android and iOS (the terminal app also work on FreeBSD). A <a href="https://github.com/laurent22/joplin/blob/master/readme/clipper.md">Web Clipper</a>, to save web pages and screenshots from your browser, is also available for <a href="https://addons.mozilla.org/en-US/firefox/addon/joplin-web-clipper/">Firefox</a> and <a href="https://chrome.google.com/webstore/detail/joplin-web-clipper/alofnhikmmkdbbbgpnglcpdollgjjfek?hl=en-GB">Chrome</a>.</p>
|
||||
<div class="top-screenshot"><img src="https://joplinapp.org/images/AllClients.jpg" style="max-width: 100%; max-height: 35em;"></div>
|
||||
<h1><a name="installation" href="#installation" class="heading-anchor">🔗</a>Installation</h1>
|
||||
<p>Three types of applications are available: for the <strong>desktop</strong> (Windows, macOS and Linux), for <strong>mobile</strong> (Android and iOS) and for <strong>terminal</strong> (Windows, macOS and Linux). All applications have similar user interfaces and can synchronise with each other.</p>
|
||||
<p>Three types of applications are available: for the <strong>desktop</strong> (Windows, macOS and Linux), for <strong>mobile</strong> (Android and iOS) and for <strong>terminal</strong> (Windows, macOS, Linux and FreeBSD). All applications have similar user interfaces and can synchronise with each other.</p>
|
||||
<h2><a name="desktop-applications" href="#desktop-applications" class="heading-anchor">🔗</a>Desktop applications</h2>
|
||||
<table>
|
||||
<thead>
|
||||
@@ -317,7 +317,7 @@
|
||||
<tr>
|
||||
<td>Android</td>
|
||||
<td><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://joplinapp.org/images/BadgeAndroid.png'/></a></td>
|
||||
<td>or <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.0.271/joplin-v1.0.271.apk">Download APK File</a></td>
|
||||
<td>or <a href="https://github.com/laurent22/joplin-android/releases/download/android-v1.0.276/joplin-v1.0.276.apk">Download APK File</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>iOS</td>
|
||||
@@ -450,11 +450,13 @@
|
||||
<p>More information about this feature in the <a href="https://www.patreon.com/posts/note-history-now-27083082">announcement post</a>.</p>
|
||||
<h1><a name="external-text-editor" href="#external-text-editor" class="heading-anchor">🔗</a>External text editor</h1>
|
||||
<p>Joplin notes can be opened and edited using an external editor of your choice. It can be a simple text editor like Notepad++ or Sublime Text or an actual Markdown editor like Typora. In that case, images will also be displayed within the editor. To open the note in an external editor, click on the icon in the toolbar or press Ctrl+E (or Cmd+E). Your default text editor will be used to open the note. If needed, you can also specify the editor directly in the General Options, under "Text editor command".</p>
|
||||
<h1><a name="attachments-resources" href="#attachments-resources" class="heading-anchor">🔗</a>Attachments / Resources</h1>
|
||||
<p>Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the resource. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.</p>
|
||||
<h1><a name="attachments" href="#attachments" class="heading-anchor">🔗</a>Attachments</h1>
|
||||
<p>Any kind of file can be attached to a note. In Markdown, links to these files are represented as a simple ID to the attachment. In the note viewer, these files, if they are images, will be displayed or, if they are other files (PDF, text files, etc.) they will be displayed as links. Clicking on this link will open the file in the default application.</p>
|
||||
<p>On the <strong>desktop application</strong>, images can be attached either by clicking on "Attach file" or by pasting (with Ctrl+V) an image directly in the editor, or by drag and dropping an image.</p>
|
||||
<p>Resources that are not attached to any note will be automatically deleted after 10 days (see <a href="https://github.com/laurent22/joplin/issues/154#issuecomment-356582366">rationale</a>).</p>
|
||||
<p><strong>Important:</strong> Resources larger than 10 MB are not currently supported on mobile. They will crash the application when synchronising so it is recommended not to attach such resources at the moment. The issue is being looked at.</p>
|
||||
<h2><a name="downloading-attachments" href="#downloading-attachments" class="heading-anchor">🔗</a>Downloading attachments</h2>
|
||||
<p>The way the attachments are downloaded during synchronisation can be customised in the Configuration screen, under "Attachment download behaviour". The default option ("Always") is to download all the attachments, all the time, so that the data is available even when the device is offline. There is also the option to download the attachments manually (option "Manual"), by clicking on it, or automatically (Option "Auto"), in which case the attachments are downloaded only when a note is opened. These options should help saving disk space and network bandwidth, especially on mobile.</p>
|
||||
<h1><a name="notifications" href="#notifications" class="heading-anchor">🔗</a>Notifications</h1>
|
||||
<p>On the desktop and mobile apps, an alarm can be associated with any to-do. It will be triggered at the given time by displaying a notification. How the notification will be displayed depends on the operating system since each has a different way to handle this. Please see below for the requirements for the desktop applications:</p>
|
||||
<ul>
|
||||
|
Reference in New Issue
Block a user