From 849d7983f66db5ad7a9f6f8ec294f993f64ae223 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Wed, 14 Aug 2019 12:40:06 +0200 Subject: [PATCH] Desktop: Added support for Fountain screenwriting language --- ElectronClient/app/gui/NoteText.jsx | 5 + README.md | 1 + ReactNativeClient/lib/models/Setting.js | 1 + ReactNativeClient/lib/renderers/MdToHtml.js | 6 +- .../lib/renderers/MdToHtml/rules/fountain.js | 134 ++++++++++++++++++ ReactNativeClient/lib/vendor/fountain.min.js | 14 ++ docs/index.html | 75 +++++----- package.json | 4 +- 8 files changed, 203 insertions(+), 37 deletions(-) create mode 100644 ReactNativeClient/lib/renderers/MdToHtml/rules/fountain.js create mode 100644 ReactNativeClient/lib/vendor/fountain.min.js diff --git a/ElectronClient/app/gui/NoteText.jsx b/ElectronClient/app/gui/NoteText.jsx index fd02d61458..12fff55536 100644 --- a/ElectronClient/app/gui/NoteText.jsx +++ b/ElectronClient/app/gui/NoteText.jsx @@ -413,6 +413,11 @@ class NoteTextComponent extends React.Component { } componentDidUpdate() { + if (Setting.value('env') === 'dev' && this.webviewRef()) { + this.webviewRef().openDevTools(); + return; + } + if (this.webviewRef() && this.props.noteDevToolsVisible !== this.webviewRef().isDevToolsOpened()) { if (this.props.noteDevToolsVisible) { this.webviewRef().openDevTools(); diff --git a/README.md b/README.md index 3ec6ab9f8b..f06615e893 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,7 @@ Joplin supports a number of plugins that can be toggled on top the standard mark | [Emoji](https://github.com/markdown-it/markdown-it-emoji) | `:smile:` :smile: | See [this list](https://gist.github.com/rxaviers/7360908) for more emoji | no | | [Insert](https://github.com/markdown-it/markdown-it-ins) | `++inserted++` | Transforms into `inserted` (inserted) | no | | [Multitable](https://github.com/RedBug312/markdown-it-multimd-table) | See [MultiMarkdown](https://fletcher.github.io/MultiMarkdown-6/syntax/tables.html) page | Adds more power and customization to markdown tables | no | +| [Fountain](https://fountain.io) | \`\`\`fountain
Your screenplay...
\`\`\` | Adds support for the Fountain markup language, a plain text markup language for screenwriting | no | ## Math notation diff --git a/ReactNativeClient/lib/models/Setting.js b/ReactNativeClient/lib/models/Setting.js index 157bfd4493..1a03a6f918 100644 --- a/ReactNativeClient/lib/models/Setting.js +++ b/ReactNativeClient/lib/models/Setting.js @@ -306,6 +306,7 @@ class Setting extends BaseModel { 'markdown.plugin.emoji': { value: false, type: Setting.TYPE_BOOL, section: 'plugins', public: true, appTypes: ['mobile', 'desktop'], label: () => _('Enable markdown emoji') }, 'markdown.plugin.insert': { value: false, type: Setting.TYPE_BOOL, section: 'plugins', public: true, appTypes: ['mobile', 'desktop'], label: () => _('Enable ++insert++ syntax') }, 'markdown.plugin.multitable': { value: false, type: Setting.TYPE_BOOL, section: 'plugins', public: true, appTypes: ['mobile', 'desktop'], label: () => _('Enable multimarkdown table extension') }, + 'markdown.plugin.fountain': { value: false, type: Setting.TYPE_BOOL, section: 'plugins', public: true, appTypes: ['mobile', 'desktop'], label: () => _('Enable Fountain syntax support') }, // Tray icon (called AppIndicator) doesn't work in Ubuntu // http://www.webupd8.org/2017/04/fix-appindicator-not-working-for.html diff --git a/ReactNativeClient/lib/renderers/MdToHtml.js b/ReactNativeClient/lib/renderers/MdToHtml.js index 0b3274a93b..459f8e447f 100644 --- a/ReactNativeClient/lib/renderers/MdToHtml.js +++ b/ReactNativeClient/lib/renderers/MdToHtml.js @@ -11,6 +11,7 @@ const rules = { html_image: require('./MdToHtml/rules/html_image'), highlight_keywords: require('./MdToHtml/rules/highlight_keywords'), code_inline: require('./MdToHtml/rules/code_inline'), + fountain: require('./MdToHtml/rules/fountain'), }; const setupLinkify = require('./MdToHtml/setupLinkify'); const hljs = require('highlight.js'); @@ -69,6 +70,8 @@ class MdToHtml { assetLoaders: {}, }; + const ruleOptions = Object.assign({}, options, { resourceBaseUrl: this.resourceBaseUrl_ }); + const markdownIt = new MarkdownIt({ breaks: breaks_, linkify: true, @@ -103,8 +106,6 @@ class MdToHtml { }, }); - const ruleOptions = Object.assign({}, options, { resourceBaseUrl: this.resourceBaseUrl_ }); - // To add a plugin, there are three options: // // 1. If the plugin does not need any application specific data, use the standard way: @@ -138,6 +139,7 @@ class MdToHtml { markdownIt.use(rules.link_open(context, ruleOptions)); markdownIt.use(rules.html_image(context, ruleOptions)); if (Setting.value('markdown.plugin.katex')) markdownIt.use(rules.katex(context, ruleOptions)); + if (Setting.value('markdown.plugin.fountain')) markdownIt.use(rules.fountain(context, ruleOptions)); markdownIt.use(rules.highlight_keywords(context, ruleOptions)); markdownIt.use(rules.code_inline(context, ruleOptions)); markdownIt.use(markdownItAnchor); diff --git a/ReactNativeClient/lib/renderers/MdToHtml/rules/fountain.js b/ReactNativeClient/lib/renderers/MdToHtml/rules/fountain.js new file mode 100644 index 0000000000..5eb3c5b2d8 --- /dev/null +++ b/ReactNativeClient/lib/renderers/MdToHtml/rules/fountain.js @@ -0,0 +1,134 @@ +const fountain = require('lib/vendor/fountain.min.js'); + +const fountainCss = ` +.fountain { + font-family: monospace; + line-height: 107%; + max-width: 1000px; + margin-left: auto; + margin-right: auto; +} + +.fountain .title-page, +.fountain .page { + box-shadow: 0 0 5px rgba(0,0,0,0.1); + border: 1px solid #d2d2d2; + padding: 10%; + margin-bottom: 2em; +} + +.fountain h1, +.fountain h2, +.fountain h3, +.fountain h4, +.fountain p { + font-weight: normal; + line-height: 107%; + margin: 1em 0; + border: none; + font-size: 1em; +} + +.fountain .bold { + font-weight: bold; +} + +.fountain .underline { + text-decoration: underline; +} + +.fountain .centered { + text-align: center; +} + +.fountain h2 { + text-align: right; +} + +.fountain .dialogue p.parenthetical { + margin-left: 11%; +} + +.fountain .title-page .credit, +.fountain .title-page .authors, +.fountain .title-page .source { + text-align: center; +} + +.fountain .title-page h1 { + margin-bottom: 1.5em; + text-align: center; +} + +.fountain .title-page .source { + margin-top: 1.5em; +} + +.fountain .title-page .notes { + text-align: right; + margin: 3em 0; +} + +.fountain .title-page h1 { + margin-bottom: 1.5em; + text-align: center; +} + +.fountain .dialogue { + margin-left: 3em; + margin-right: 3em; +} + +.fountain .dialogue p, +.fountain .dialogue h1, +.fountain .dialogue h2, +.fountain .dialogue h3, +.fountain .dialogue h4 { + margin: 0; +} + +.fountain .dialogue h1, +.fountain .dialogue h2, +.fountain .dialogue h3, +.fountain .dialogue h4 { + text-align: center; +} +`; + +function renderFountainScript(content) { + const result = fountain.parse(content); + return ` +
+
+ ${result.html.title_page} +
+
+ ${result.html.script} +
+
+ `; +} + +function addContextAssets(context) { + if ('fountain' in context.css) return; + context.css['fountain'] = fountainCss; +} + +function installRule(markdownIt, mdOptions, ruleOptions, context) { + const defaultRender = markdownIt.renderer.rules.fence || function(tokens, idx, options, env, self) { + return self.renderToken(tokens, idx, options); + }; + + markdownIt.renderer.rules.fence = function (tokens, idx, options, env, self) { + const token = tokens[idx]; + if (token.info !== 'fountain') return defaultRender(tokens, idx, options, env, self); + addContextAssets(context); + return renderFountainScript(token.content); + }; +} + +module.exports = function(context, ruleOptions) { + return function(md, mdOptions) { + installRule(md, mdOptions, ruleOptions, context); + }; +}; diff --git a/ReactNativeClient/lib/vendor/fountain.min.js b/ReactNativeClient/lib/vendor/fountain.min.js new file mode 100644 index 0000000000..0ddebd3bdd --- /dev/null +++ b/ReactNativeClient/lib/vendor/fountain.min.js @@ -0,0 +1,14 @@ +// https://github.com/mattdaly/Fountain.js/ + +(function(){var d={title_page:/^((?:title|credit|author[s]?|source|notes|draft date|date|contact|copyright)\:)/gim,scene_heading:/^((?:\*{0,3}_?)?(?:(?:int|ext|est|i\/e)[. ]).+)|^(?:\.(?!\.+))(.+)/i,scene_number:/( *#(.+)# *)/,transition:/^((?:FADE (?:TO BLACK|OUT)|CUT TO BLACK)\.|.+ TO\:)|^(?:> *)(.+)/,dialogue:/^([A-Z*_]+[0-9A-Z (._\-')]*)(\^?)?(?:\n(?!\n+))([\s\S]+)/,parenthetical:/^(\(.+\))$/,action:/^(.+)/g,centered:/^(?:> *)(.+)(?: *<)(\n.+)*/g,section:/^(#+)(?: *)(.*)/,synopsis:/^(?:\=(?!\=+) *)(.*)/, +note:/^(?:\[{2}(?!\[+))(.+)(?:\]{2}(?!\[+))$/,note_inline:/(?:\[{2}(?!\[+))([\s\S]+?)(?:\]{2}(?!\[+))/g,boneyard:/(^\/\*|^\*\/)$/g,page_break:/^\={3,}$/,line_break:/^ {2}$/,emphasis:/(_|\*{1,3}|_\*{1,3}|\*{1,3}_)(.+)(_|\*{1,3}|_\*{1,3}|\*{1,3}_)/g,bold_italic_underline:/(_{1}\*{3}(?=.+\*{3}_{1})|\*{3}_{1}(?=.+_{1}\*{3}))(.+?)(\*{3}_{1}|_{1}\*{3})/g,bold_underline:/(_{1}\*{2}(?=.+\*{2}_{1})|\*{2}_{1}(?=.+_{1}\*{2}))(.+?)(\*{2}_{1}|_{1}\*{2})/g,italic_underline:/(?:_{1}\*{1}(?=.+\*{1}_{1})|\*{1}_{1}(?=.+_{1}\*{1}))(.+?)(\*{1}_{1}|_{1}\*{1})/g, +bold_italic:/(\*{3}(?=.+\*{3}))(.+?)(\*{3})/g,bold:/(\*{2}(?=.+\*{2}))(.+?)(\*{2})/g,italic:/(\*{1}(?=.+\*{1}))(.+?)(\*{1})/g,underline:/(_{1}(?=.+_{1}))(.+?)(_{1})/g,splitter:/\n{2,}/g,cleaner:/^\n+|\n+$/,standardizer:/\r\n|\r/g,whitespacer:/^\t+|^ {3,}/gm},n={note:"<\!-- $1 --\>",line_break:"
",bold_italic_underline:'$2',bold_underline:'$2',italic_underline:'$2',bold_italic:'$2', +bold:'$2',italic:'$2',underline:'$2',lexer:function(c){if(c){for(var j="underline,italic,bold,bold_italic,italic_underline,bold_underline,bold_italic_underline".split(","),k=j.length,g,b,c=c.replace(d.note_inline,n.note).replace(/\\\*/g,"[star]").replace(/\\_/g,"[underline]").replace(/\n/g,n.line_break);k--;)g=j[k],b=d[g],b.test(c)&&(c=c.replace(b,n[g]));return c.replace(/\[star\]/g,"*").replace(/\[underline\]/g, +"_").trim()}}},h=function(c,d){return h.parse(c,d)};h.parse=function(c,j,k){var g;void 0===k&&"function"===typeof j&&(k=j,j=void 0);for(var b=c.replace(d.boneyard,"\n$1\n").replace(d.standardizer,"\n").replace(d.cleaner,"").replace(d.whitespacer,"").split(d.splitter),f=b.length,e,a,l,i,h,m,c=[];f--;)if(e=b[f],d.title_page.test(e)){a=e.replace(d.title_page,"\n$1").split(d.splitter).reverse();i=0;for(h=a.length;i|"+b.text+"");g=b.text.replace("
"," ").replace(/<(?:.|\n)*?>/g,"");break;case "credit":f.push('

'+b.text+"

");break;case "author":f.push('

'+ +b.text+"

");break;case "authors":f.push('

'+b.text+"

");break;case "source":f.push('

'+b.text+"

");break;case "notes":f.push('

'+b.text+"

");break;case "draft_date":f.push('

'+b.text+"

");break;case "date":f.push('

'+b.text+"

");break;case "contact":f.push('

'+b.text+"

");break;case "copyright":f.push('");break;case "scene_heading":a.push("':">")+b.text+"");break;case "transition":a.push("

"+b.text+"

");break;case "dual_dialogue_begin":a.push('
');break;case "dialogue_begin":a.push('
');break;case "character":a.push("

"+b.text+"

");break;case "parenthetical":a.push('

'+b.text+"

");break;case "dialogue":a.push("

"+b.text+"

");break;case "dialogue_end":a.push("
"); +break;case "dual_dialogue_end":a.push("
");break;case "section":a.push('

'+b.text+"

");break;case "synopsis":a.push('

'+b.text+"

");break;case "note":a.push("<\!-- "+b.text+"--\>");break;case "boneyard_begin":a.push("<\!-- ");break;case "boneyard_end":a.push(" --\>");break;case "action":a.push("

"+b.text+"

");break;case "centered":a.push('

'+b.text+"

");break;case "page_break":a.push("
");break; +case "line_break":a.push("
")}g={title:g,html:{title_page:f.join(""),script:a.join("")},tokens:j?c.reverse():void 0};g="function"===typeof k?k(g):g;return g};"undefined"!==typeof module?module.exports=h:this.fountain=h}).call(this); \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 5902fe7c8b..5023a225d6 100644 --- a/docs/index.html +++ b/docs/index.html @@ -317,7 +317,7 @@ Android Get it on Google Play -or Download APK File +or Download APK File iOS @@ -386,12 +386,12 @@

To import Evernote data, first export your Evernote notebooks to ENEX files as described here. Then follow these steps:

-

On the desktop application, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.

-

On the terminal application, in command-line mode, type import /path/to/file.enex. This will import the notes into a new notebook named after the filename.

+

In the desktop application, open File > Import > ENEX and select your file. The notes will be imported into a new separate notebook. If needed they can then be moved to a different notebook, or the notebook can be renamed, etc.

+

In the terminal application, in command-line mode, type import /path/to/file.enex. This will import the notes into a new notebook named after the filename.

🔗Importing from Markdown files

Joplin can import notes from plain Markdown file. You can either import a complete directory of Markdown files or individual files.

-

On the desktop application, open File > Import > MD and select your Markdown file or directory.

-

On the terminal application, in command-line mode, type import --format md /path/to/file.md or import --format md /path/to/directory/.

+

In the desktop application, open File > Import > MD and select your Markdown file or directory.

+

In the terminal application, in command-line mode, type import --format md /path/to/file.md or import --format md /path/to/directory/.

🔗Importing from other applications

In general the way to import notes from any application into Joplin is to convert the notes to ENEX files (Evernote format) and to import these ENEX files into Joplin using the method above. Most note-taking applications support ENEX files so it should be relatively straightforward. For help about specific applications, see below:

    @@ -407,8 +407,8 @@

    Currently, synchronisation is possible with Nextcloud, Dropbox (by default), OneDrive or the local filesystem. To setup synchronisation please follow the instructions below. After that, the application will synchronise in the background whenever it is running, or you can click on "Synchronise" to start a synchronisation manually.

    🔗Nextcloud synchronisation

    Nextcloud is a self-hosted, private cloud solution. It can store documents, images and videos but also calendars, passwords and countless other things and can sync them to your laptop or phone. As you can host your own Nextcloud server, you own both the data on your device and infrastructure used for synchronisation. As such it is a good fit for Joplin. The platform is also well supported and with a strong community, so it is likely to be around for a while - since it's open source anyway, it is not a service that can be closed, it can exist on a server for as long as one chooses.

    -

    On the desktop application or mobile application, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally https://example.com/nextcloud/remote.php/webdav/Joplin (make sure to create the "Joplin" directory in Nextcloud), and set the username and password. If it does not work, please see this explanation for more details.

    -

    On the terminal application, you will need to set the sync.target config variable and all the sync.5.path, sync.5.username and sync.5.password config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:

    +

    In the desktop application or mobile application, go to the config screen and select Nextcloud as the synchronisation target. Then input the WebDAV URL (to get it, click on Settings in the bottom left corner of the page, in Nextcloud), this is normally https://example.com/nextcloud/remote.php/webdav/Joplin (make sure to create the "Joplin" directory in Nextcloud), and set the username and password. If it does not work, please see this explanation for more details.

    +

    In the terminal application, you will need to set the sync.target config variable and all the sync.5.path, sync.5.username and sync.5.password config variables to, respectively the Nextcloud WebDAV URL, your username and your password. This can be done from the command line mode using:

    :config sync.5.path https://example.com/nextcloud/remote.php/webdav/Joplin
     :config sync.5.username YOUR_USERNAME
     :config sync.5.password YOUR_PASSWORD
    @@ -417,8 +417,8 @@
     

    If synchronisation does not work, please consult the logs in the app profile directory - it is often due to a misconfigured URL or password. The log should indicate what the exact issue is.

    🔗Dropbox synchronisation

    When syncing with Dropbox, Joplin creates a sub-directory in Dropbox, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.

    -

    On the desktop application or mobile application, select "Dropbox" as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.

    -

    On the terminal application, to initiate the synchronisation process, type :sync. You will be asked to follow a link to authorise the application. It is possible to also synchronise outside of the user interface by typing joplin sync from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:

    +

    In the desktop application or mobile application, select "Dropbox" as the synchronisation target in the config screen (it is selected by default). Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.

    +

    In the terminal application, to initiate the synchronisation process, type :sync. You will be asked to follow a link to authorise the application. It is possible to also synchronise outside of the user interface by typing joplin sync from the terminal. This can be used to setup a cron script to synchronise at regular interval. For example, this would do it every 30 minutes:

    */30 * * * * /path/to/joplin sync
     

    🔗WebDAV synchronisation

    @@ -440,8 +440,8 @@

🔗OneDrive synchronisation

When syncing with OneDrive, Joplin creates a sub-directory in OneDrive, in /Apps/Joplin and read/write the notes and notebooks from it. The application does not have access to anything outside this directory.

-

On the desktop application or mobile application, select "OneDrive" as the synchronisation target in the config screen. Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.

-

On the terminal application, to initiate the synchronisation process, type :sync. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).

+

In the desktop application or mobile application, select "OneDrive" as the synchronisation target in the config screen. Then, to initiate the synchronisation process, click on the "Synchronise" button in the sidebar and follow the instructions.

+

In the terminal application, to initiate the synchronisation process, type :sync. You will be asked to follow a link to authorise the application (simply input your Microsoft credentials - you do not need to register with OneDrive).

🔗Encryption

Joplin supports end-to-end encryption (E2EE) on all the applications. E2EE is a system where only the owner of the notes, notebooks, tags or resources can read them. It prevents potential eavesdroppers - including telecom providers, internet providers, and even the developers of Joplin from being able to access the data. Please see the End-To-End Encryption Tutorial for more information about this feature and how to enable it.

For a more technical description, mostly relevant for development or to review the method being used, please see the Encryption specification.

@@ -453,13 +453,14 @@

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

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.

+

In the desktop application, files can be attached either by clicking the "Attach file" icon in the editor or via drag and drop. If you prefer to create a link to a local file instead, hold the ALT key while performing the drag and drop operation.
+If the OS-clipboard contains an image you can directly paste it in the editor via Ctrl+V.

Resources that are not attached to any note will be automatically deleted after 10 days (see rationale).

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:

+

In 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:

  • Windows: >= 8. Make sure the Action Center is enabled on Windows. Task bar balloon for Windows < 8. Growl as fallback. Growl takes precedence over Windows balloons.
  • macOS: >= 10.8 or Growl if earlier.
  • @@ -472,7 +473,7 @@

    Sub-notebooks allow organising multiple notebooks into a tree of notebooks. For example it can be used to regroup all the notebooks related to work, to family or to a particular project under a parent notebook.

      -
    • On the desktop application, to create a subnotebook, drag and drop it onto another notebook. To move it back to the root, drag and drop it on the "Notebooks" header. Currently only the desktop app can be used to organise the notebooks.
    • +
    • In the desktop application, to create a subnotebook, drag and drop it onto another notebook. To move it back to the root, drag and drop it on the "Notebooks" header. Currently only the desktop app can be used to organise the notebooks.
    • The mobile application supports displaying and collapsing/expanding the tree of notebooks, however it does not currently support moving the subnotebooks to different notebooks.
    • The terminal app supports displaying the tree of subnotebooks but it does not support collapsing/expanding them or moving the subnotebooks around.
    @@ -561,6 +562,12 @@ Adds more power and customization to markdown tables no + +Fountain +```fountain
    Your screenplay...
    ``` +Add support for the Fountain markup language, a plain text markup language for screenwriting +no +

    🔗Math notation

    @@ -644,7 +651,7 @@ Details: Single word Returns all the notes that contain this term. -dog, cat +For example, searching for cat will return all the notes that contain this exact word. Note: it will not return the notes that contain the substring - thus, for "cat", notes that contain "cataclysmic" or "prevaricate" will not be returned. Multiples words @@ -712,14 +719,14 @@ Details: Arabic ar عبد الناصر سعيد (as@althobaity.com) -86% +85% Basque eu juan.abasolo@ehu.eus -48% +47% @@ -740,14 +747,14 @@ Details: Croatian hr_HR Hrvoje Mandić (trbuhom@net.hr) -39% +38% Czech cs_CZ Lukas Helebrandt (lukas@aiya.cz) -86% +85% @@ -761,7 +768,7 @@ Details: Deutsch de_DE Michael Sonntag (ms@editorei.de) -95% +99% @@ -782,14 +789,14 @@ Details: Español es_ES Andros Fenollosa (andros@fenollosa.email) -93% +92% Français fr_FR Laurent Cozic -100% +99% @@ -803,7 +810,7 @@ Details: Italiano it_IT -93% +92% @@ -817,7 +824,7 @@ Details: Nederlands nl_NL Heimen Stoffels (vistausss@outlook.com) -95% +94% @@ -831,21 +838,21 @@ Details: Persian fa Mehrad Mahmoudian (mehrad@mahmoudian.me) -47% +46% Polski pl_PL -93% +92% Português (Brasil) pt_BR Renato Nunes Bastos (rnbastos@gmail.com) -92% +91% @@ -866,35 +873,35 @@ Details: Svenska sv Jonatan Nyberg (jonatan@autistici.org) -83% +82% Türkçe tr_TR Zorbey Doğangüneş (zorbeyd@gmail.com) -81% +80% Русский ru_RU Artyom Karlov (artyom.karlov@gmail.com) -86% +85% српски језик sr_RS -93% +92% 中文 (简体) zh_CN -94% +93% @@ -908,14 +915,14 @@ Details: 日本語 ja_JP AWASHIRO Ikuya (ikunya@gmail.com) -81% +80% 한국말 ko -82% +98% diff --git a/package.json b/package.json index d12ca50760..9a9f4a59c4 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ } }, "lint-staged": { - "*.{js,jsx}": ["npm run linter", "git add"] + "*.{js,jsx}": [ + "npm run linter" + ] }, "repository": { "type": "git",