+```
+
+### Use meaningful name
+This is actually not a "code style" but rather a requirement in every projects. Please name your variables carefully.
+
+**Example**: Naming callback function for event
+
+```js
+// BAD
+
Name
+
+// GOOD
+
Name
+```
+
+### Don't write long conditional statement
+When writing a conditional statement, if it's too long, cut it into small meaningful variables.
+
+```js
+// BAD
+if (note.type == 'markdown' && note.index == 2 && note.content.indexOf('string') != -1)
+
+// GOOD
+const isSecondMarkdownNote = note.type == 'markdown' && note.index == 2
+const isNoteHasString = note.content.indexOf('string') != -1
+if (isSecondMarkdownNote && isNoteHasString)
+```
+
+### Use class property instead of class methods
+When writing React components, try to use class property instead of class methods. The reason for this is explained perfectly here:
+https://codeburst.io/use-class-properties-to-clean-up-your-classes-and-react-components-93185879f688
+
+**Example**:
+
+```js
+// BAD
+class MyComponent extends React.Component {
+ myMethod () {
+ // code goes here...
+ }
+}
+
+// GOOD
+class MyComponent extends React.Component {
+ myMethod = () => {
+ // code goes here...
+ }
+}
+```
\ No newline at end of file
diff --git a/docs/debug.md b/docs/debug.md
index 78a71137..a84a6bba 100644
--- a/docs/debug.md
+++ b/docs/debug.md
@@ -1,6 +1,8 @@
# How to debug Boostnote (Electron app)
+
This page is also available in [Japanese](https://github.com/BoostIO/Boostnote/blob/master/docs/jp/debug.md), [Korean](https://github.com/BoostIO/Boostnote/blob/master/docs/ko/debug.md), [Russain](https://github.com/BoostIO/Boostnote/blob/master/docs/ru/debug.md), [Simplified Chinese](https://github.com/BoostIO/Boostnote/blob/master/docs/zh_CN/debug.md), [French](https://github.com/BoostIO/Boostnote/blob/master/docs/fr/debug.md) and [German](https://github.com/BoostIO/Boostnote/blob/master/docs/de/debug.md).
+## Debug with Google Chrome developer Tools
Boostnote is an Electron app so it's based on Chromium; developers can use `Developer Tools` just like Google Chrome.
You can toggle the `Developer Tools` like this:
@@ -11,12 +13,24 @@ The `Developer Tools` will look like this:
When errors occur, the error messages are displayed at the `console`.
-## Debugging
+### Debugging
For example, you can use the `debugger` to set a breakpoint in the code like this:

This is just an illustrative example, you should find a way to debug which fits your style.
-## References
+### References
* [Official document of Google Chrome about debugging](https://developer.chrome.com/devtools)
+
+## Debug with Visual Studio Code
+
+1. Install **[Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome "Install Debugger for Chrome")** plugin for Visual Studio Code. Then restart it.
+2. Pressing **Shift+Command+B** or running **Run Build Task** from the global **Terminal** menu, then pick the task named **Build Boostnote**. Or run `yarn run watch` from the terminal.
+3. When above task is running, open **Debug view** in **Activity Bar** on the side of VS Code or use shortcut **Shift+Command+D**.
+4. Select the configuration named **Boostnote All** from the **Debug configuration**, then click the green arrow button or press **F5** to start debugging.
+5. Now you should find **Boostnote** is running. You will see two processes running, one named **Boostnote Main** and the other named **Boostnote Renderer**. Now you can set **debug breakpoints** in vscode. If you find your **breakpoints** is unverified, you need to switch to the appropriate process between **Boostnote Renderer** and **Boostnote Main**.
+
+ ### References
+ * [Electron application debugging](https://electronjs.org/docs/tutorial/application-debugging)
+ * [Debugger for Chrome](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)
\ No newline at end of file
diff --git a/lib/main-menu.js b/lib/main-menu.js
index fed5eb15..05921347 100644
--- a/lib/main-menu.js
+++ b/lib/main-menu.js
@@ -85,39 +85,24 @@ const file = {
},
{
label: 'Focus Note',
- accelerator: 'Control+E',
+ accelerator: macOS ? 'Command+E' : 'Control+E',
click () {
mainWindow.webContents.send('detail:focus')
}
},
{
- type: 'separator'
+ label: 'Delete Note',
+ accelerator: macOS ? 'Command+Shift+Backspace' : 'Control+Shift+Backspace',
+ click () {
+ mainWindow.webContents.send('detail:delete')
+ }
},
{
- label: 'Export as',
- submenu: [
- {
- label: 'Plain Text (.txt)',
- click () {
- mainWindow.webContents.send('list:isMarkdownNote')
- mainWindow.webContents.send('export:save-text')
- }
- },
- {
- label: 'MarkDown (.md)',
- click () {
- mainWindow.webContents.send('list:isMarkdownNote')
- mainWindow.webContents.send('export:save-md')
- }
- },
- {
- label: 'HTML (.html)',
- click () {
- mainWindow.webContents.send('list:isMarkdownNote')
- mainWindow.webContents.send('export:save-html')
- }
- }
- ]
+ label: 'Clone Note',
+ accelerator: macOS ? 'Command+D' : 'Control+D',
+ click () {
+ mainWindow.webContents.send('list:clone')
+ }
},
{
type: 'separator'
@@ -134,13 +119,30 @@ const file = {
]
},
{
- type: 'separator'
- },
- {
- label: 'Format Table',
- click () {
- mainWindow.webContents.send('code:format-table')
- }
+ label: 'Export as',
+ submenu: [
+ {
+ label: 'Plain Text (.txt)',
+ click () {
+ mainWindow.webContents.send('list:isMarkdownNote', 'export-txt')
+ mainWindow.webContents.send('export:save-text')
+ }
+ },
+ {
+ label: 'MarkDown (.md)',
+ click () {
+ mainWindow.webContents.send('list:isMarkdownNote', 'export-md')
+ mainWindow.webContents.send('export:save-md')
+ }
+ },
+ {
+ label: 'HTML (.html)',
+ click () {
+ mainWindow.webContents.send('list:isMarkdownNote', 'export-html')
+ mainWindow.webContents.send('export:save-html')
+ }
+ }
+ ]
},
{
type: 'separator'
@@ -153,24 +155,20 @@ const file = {
}
},
{
- type: 'separator'
- },
- {
- label: 'Print',
- accelerator: 'CommandOrControl+P',
+ label: 'Format Table',
click () {
- mainWindow.webContents.send('list:isMarkdownNote')
- mainWindow.webContents.send('print')
+ mainWindow.webContents.send('code:format-table')
}
},
{
type: 'separator'
},
{
- label: 'Delete Note',
- accelerator: macOS ? 'Control+Backspace' : 'Control+Delete',
+ label: 'Print',
+ accelerator: 'CommandOrControl+P',
click () {
- mainWindow.webContents.send('detail:delete')
+ mainWindow.webContents.send('list:isMarkdownNote', 'print')
+ mainWindow.webContents.send('print')
}
}
]
@@ -296,9 +294,6 @@ const view = {
mainWindow.setFullScreen(!mainWindow.isFullScreen())
}
},
- {
- type: 'separator'
- },
{
label: 'Toggle Side Bar',
accelerator: 'CommandOrControl+B',
@@ -310,11 +305,25 @@ const view = {
type: 'separator'
},
{
- role: 'zoomin',
- accelerator: macOS ? 'CommandOrControl+Plus' : 'Control+='
+ label: 'Actual Size',
+ accelerator: macOS ? 'CommandOrControl+0' : 'Control+0',
+ click () {
+ mainWindow.webContents.send('status:zoomreset')
+ }
},
{
- role: 'zoomout'
+ label: 'Zoom In',
+ accelerator: macOS ? 'CommandOrControl+=' : 'Control+=',
+ click () {
+ mainWindow.webContents.send('status:zoomin')
+ }
+ },
+ {
+ label: 'Zoom Out',
+ accelerator: macOS ? 'CommandOrControl+-' : 'Control+-',
+ click () {
+ mainWindow.webContents.send('status:zoomout')
+ }
}
]
}
diff --git a/lib/main.html b/lib/main.html
index 64add406..a1ea3610 100644
--- a/lib/main.html
+++ b/lib/main.html
@@ -95,6 +95,7 @@
+
@@ -117,6 +118,7 @@
+
diff --git a/locales/da.json b/locales/da.json
index 68036b0b..da5843f3 100644
--- a/locales/da.json
+++ b/locales/da.json
@@ -152,5 +152,6 @@
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/de.json b/locales/de.json
index 8b1d3179..1b90ab63 100644
--- a/locales/de.json
+++ b/locales/de.json
@@ -208,5 +208,6 @@
"Folder Name": "Ordnername",
"No tags": "Keine Tags",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/en.json b/locales/en.json
index 6a3b1e48..fe7931da 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -179,9 +179,10 @@
"Allow dangerous html tags": "Allow dangerous html tags",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
"⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled",
"Save tags of a note in alphabetical order": "Save tags of a note in alphabetical order",
- "Show tags of a note in alphabetical order": "Show tags of a note in alphabetical order",
"Enable live count of notes": "Enable live count of notes",
"Enable smart table editor": "Enable smart table editor",
- "Snippet Default Language": "Snippet Default Language"
+ "Snippet Default Language": "Snippet Default Language",
+ "New notes are tagged with the filtering tags": "New notes are tagged with the filtering tags"
}
diff --git a/locales/es-ES.json b/locales/es-ES.json
index ea4dd92b..8b2da1b7 100644
--- a/locales/es-ES.json
+++ b/locales/es-ES.json
@@ -154,5 +154,6 @@
"Allow dangerous html tags": "Permitir etiquetas html peligrosas",
"⚠ You have pasted a link referring an attachment that could not be found in the location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ Ha pegado un enlace a un archivo adjunto que no se puede encontrar en el almacenamiento de esta nota. Pegar enlaces a archivos adjuntos solo está soportado si el origen y el destino son el mismo almacenamiento. ¡Por favor, mejor arrastre el archivo! ⚠",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convertir flechas textuales a símbolos bonitos. ⚠ Esto interferirá cuando use comentarios HTML en Markdown.",
- "Snippet Default Language": "Lenguaje por defecto de los fragmentos de código"
+ "Disabled": "Disabled",
+ "Snippet Default Language": "Lenguaje por defecto de los fragmentos de código"
}
diff --git a/locales/fa.json b/locales/fa.json
index 5f6ec902..18bef679 100644
--- a/locales/fa.json
+++ b/locales/fa.json
@@ -156,5 +156,6 @@
"Allow styles": "حالت های مجاز",
"Allow dangerous html tags": "تگ های خطرناک اچ تی ام ال مجاز اند",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/fr.json b/locales/fr.json
index ca04e0ee..ea5a1c05 100644
--- a/locales/fr.json
+++ b/locales/fr.json
@@ -163,9 +163,11 @@
"Enable live count of notes": "Activer le comptage live des notes",
"Enable smart table editor": "Activer l'intelligent éditeur de tableaux",
"Snippet Default Language": "Langage par défaut d'un snippet",
+ "Disabled": "Disabled",
"New Snippet": "Nouveau snippet",
"Custom CSS": "CSS personnalisé",
"Snippet name": "Nom du snippet",
- "Snippet prefix": "Préfixe du snippet"
- "Delete Note": "Supprimer la note"
+ "Snippet prefix": "Préfixe du snippet",
+ "Delete Note": "Supprimer la note",
+ "New notes are tagged with the filtering tags": "Les nouvelles notes sont taggées avec les tags de filtrage"
}
diff --git a/locales/hu.json b/locales/hu.json
index 8680ace9..77bdb2ab 100644
--- a/locales/hu.json
+++ b/locales/hu.json
@@ -177,5 +177,6 @@
"Allow styles": "Stílusok engedélyezése",
"Allow dangerous html tags": "Veszélyes html tag-ek engedélyezése",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/it.json b/locales/it.json
index 9418c4dc..05f454f3 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -156,5 +156,6 @@
"Allow styles": "Consenti stili",
"Allow dangerous html tags": "Consenti tag HTML pericolosi",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/ja.json b/locales/ja.json
index c5f8c11b..9cfc2986 100644
--- a/locales/ja.json
+++ b/locales/ja.json
@@ -37,9 +37,15 @@
"White": "白",
"Solarized Dark": "明灰",
"Dark": "暗灰",
+ "Default New Note": "新規ノートの形式",
+ "Always Ask": "作成時に聞く",
"Show a confirmation dialog when deleting notes": "ノートを削除する時に確認ダイアログを表示する",
"Disable Direct Write (It will be applied after restarting)": "Disable Direct Write (It will be applied after restarting)",
+ "Save tags of a note in alphabetical order": "ノートのタグをアルファベット順に保存する",
+ "Show tags of a note in alphabetical order": "ノートのタグをアルファベット順に表示する",
"Show only related tags": "関連するタグのみ表示する",
+ "Enable live count of notes": "タグ選択時にノート数を再計算して表示する",
+ "New notes are tagged with the filtering tags": "新規ノートに選択中のタグを付与する",
"Editor Theme": "エディタのテーマ",
"Editor Font Size": "エディタのフォントサイズ",
"Editor Font Family": "エディタのフォント",
@@ -55,21 +61,28 @@
"vim": "vim",
"emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ キーマップ変更後は Boostnote を再起動してください",
+ "Snippet Default Language": "スニペットのデフォルト言語",
+ "Extract title from front matter": "Front matterからタイトルを抽出する",
"Show line numbers in the editor": "エディタ内に行番号を表示",
"Allow editor to scroll past the last line": "エディタが最終行以降にスクロールできるようにする",
"Enable smart quotes": "スマートクォートを有効にする",
"Bring in web page title when pasting URL on editor": "URLを貼り付けた時にWebページのタイトルを取得する",
+ "Enable smart table editor": "スマートテーブルエディタを有効にする",
"Preview": "プレビュー",
"Preview Font Size": "プレビュー時フォントサイズ",
"Preview Font Family": "プレビュー時フォント",
"Code Block Theme": "コードブロックのテーマ",
+ "Allow line through checkbox": "チェック済みチェックボックスのテキストに取り消し線を付与する",
"Allow preview to scroll past the last line": "プレビュー時に最終行以降にスクロールできるようにする",
+ "When scrolling, synchronize preview with editor": "エディタとプレビューのスクロールを同期する",
"Show line numbers for preview code blocks": "プレビュー時のコードブロック内に行番号を表示する",
"LaTeX Inline Open Delimiter": "LaTeX 開始デリミタ(インライン)",
"LaTeX Inline Close Delimiter": "LaTeX 終了デリミタ(インライン)",
"LaTeX Block Open Delimiter": "LaTeX 開始デリミタ(ブロック)",
"LaTeX Block Close Delimiter": "LaTeX 終了デリミタ(ブロック)",
"PlantUML Server": "PlantUML サーバー",
+ "Custom CSS": "カスタムCSS",
+ "Allow custom CSS for preview": "プレビュー用のカスタムCSSを許可する",
"Community": "コミュニティ",
"Subscribe to Newsletter": "ニュースレターを購読する",
"GitHub": "GitHub",
@@ -135,6 +148,7 @@
"Hotkeys": "ホットキー",
"Show/Hide Boostnote": "Boostnote の表示/非表示",
"Toggle Editor Mode": "エディタモードの切替",
+ "Delete Note": "ノート削除",
"Restore": "リストア",
"Permanent Delete": "永久に削除",
"Confirm note deletion": "ノート削除確認",
@@ -176,5 +190,6 @@
"Allow styles": "スタイルを許可する",
"Allow dangerous html tags": "安全でないHTMLタグの利用を許可する",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "テキストの矢印を綺麗な記号に変換する ⚠ この設定はMarkdown内でのHTMLコメントに干渉します。",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ このノートのストレージに存在しない添付ファイルへのリンクを貼り付けました。添付ファイルへのリンクの貼り付けは同一ストレージ内でのみサポートされています。代わりに添付ファイルをドラッグアンドドロップしてください! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ このノートのストレージに存在しない添付ファイルへのリンクを貼り付けました。添付ファイルへのリンクの貼り付けは同一ストレージ内でのみサポートされています。代わりに添付ファイルをドラッグアンドドロップしてください! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/ko.json b/locales/ko.json
index 8a73be04..9a8bf8c7 100644
--- a/locales/ko.json
+++ b/locales/ko.json
@@ -159,5 +159,6 @@
"Allow styles": "style 태그, 속성까지 허용",
"Allow dangerous html tags": "모든 위험한 태그 허용",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/no.json b/locales/no.json
index d3c47560..2d6c92f5 100644
--- a/locales/no.json
+++ b/locales/no.json
@@ -152,5 +152,6 @@
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/pl.json b/locales/pl.json
index e6e98c60..68719aef 100644
--- a/locales/pl.json
+++ b/locales/pl.json
@@ -161,5 +161,6 @@
"⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ Wkleiłes link odnoszący się do załącznika, ktory nie może zostać znaleziony. Wklejanie linków do załączników jest możliwe tylko gdy notatka i załącznik są w tym samym folderze. Używaj opcji 'Przeciągaj i upuść' załącznik! ⚠",
"Star": "Oznacz",
"Fullscreen": "Pełen ekran",
- "Add tag...": "Dodaj tag..."
+ "Add tag...": "Dodaj tag...",
+ "Disabled": "Disabled"
}
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
index 24b325e9..6b3126cc 100644
--- a/locales/pt-BR.json
+++ b/locales/pt-BR.json
@@ -152,5 +152,6 @@
"Allow styles": "Permitir estilos",
"Allow dangerous html tags": "Permitir tags html perigosas",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/pt-PT.json b/locales/pt-PT.json
index d3c47560..774919a2 100644
--- a/locales/pt-PT.json
+++ b/locales/pt-PT.json
@@ -1,156 +1,156 @@
{
- "Notes": "Notes",
- "Tags": "Tags",
- "Preferences": "Preferences",
- "Make a note": "Make a note",
+ "Notes": "Notas",
+ "Tags": "Etiquetas",
+ "Preferences": "Definiçōes",
+ "Make a note": "Criar nota",
"Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl",
- "to create a new note": "to create a new note",
- "Toggle Mode": "Toggle Mode",
- "Trash": "Trash",
- "MODIFICATION DATE": "MODIFICATION DATE",
- "Words": "Words",
- "Letters": "Letters",
- "STORAGE": "STORAGE",
- "FOLDER": "FOLDER",
- "CREATION DATE": "CREATION DATE",
- "NOTE LINK": "NOTE LINK",
+ "to create a new note": "para criar uma nova nota",
+ "Toggle Mode": "Alternar Modo",
+ "Trash": "Lixo",
+ "MODIFICATION DATE": "DATA DE MODIFICAÇÃO",
+ "Words": "Palavras",
+ "Letters": "Letras",
+ "STORAGE": "ARMAZENAMENTO",
+ "FOLDER": "PASTA",
+ "CREATION DATE": "DATA DE CRIAÇÃO",
+ "NOTE LINK": "ATALHO DE NOTA",
".md": ".md",
".txt": ".txt",
".html": ".html",
- "Print": "Print",
- "Your preferences for Boostnote": "Your preferences for Boostnote",
- "Storage Locations": "Storage Locations",
- "Add Storage Location": "Add Storage Location",
- "Add Folder": "Add Folder",
- "Open Storage folder": "Open Storage folder",
- "Unlink": "Unlink",
- "Edit": "Edit",
- "Delete": "Delete",
+ "Print": "Imprimir",
+ "Your preferences for Boostnote": "As tuas definiçōes para Boostnote",
+ "Storage Locations": "Locais de Armazenamento",
+ "Add Storage Location": "Adicionar Local de Armazenamento",
+ "Add Folder": "Adicionar Pasta",
+ "Open Storage folder": "Abrir Local de Armazenamento",
+ "Unlink": "Remover a ligação",
+ "Edit": "Editar",
+ "Delete": "Apagar",
"Interface": "Interface",
- "Interface Theme": "Interface Theme",
+ "Interface Theme": "Tema",
"Default": "Default",
- "White": "White",
+ "White": "Branco",
"Solarized Dark": "Solarized Dark",
- "Dark": "Dark",
- "Show a confirmation dialog when deleting notes": "Show a confirmation dialog when deleting notes",
- "Editor Theme": "Editor Theme",
- "Editor Font Size": "Editor Font Size",
- "Editor Font Family": "Editor Font Family",
- "Editor Indent Style": "Editor Indent Style",
- "Spaces": "Spaces",
+ "Dark": "Escuro",
+ "Show a confirmation dialog when deleting notes": "Mostrar uma confirmação ao excluir notas",
+ "Editor Theme": "Tema do Editor",
+ "Editor Font Size": "Tamanho de Fonte do Editor",
+ "Editor Font Family": "Família de Fonte do Editor",
+ "Editor Indent Style": "Estílo de Identação do Editor",
+ "Spaces": "Espaços",
"Tabs": "Tabs",
- "Switch to Preview": "Switch to Preview",
- "When Editor Blurred": "When Editor Blurred",
- "When Editor Blurred, Edit On Double Click": "When Editor Blurred, Edit On Double Click",
- "On Right Click": "On Right Click",
- "Editor Keymap": "Editor Keymap",
- "default": "default",
+ "Switch to Preview": "Mudar para Pré-Visualização",
+ "When Editor Blurred": "Quando o Editor Obscurece",
+ "When Editor Blurred, Edit On Double Click": "Quando o Editor Obscurece, Editar com Duplo Clique",
+ "On Right Click": "Ao Clicar Com o Botão Direito",
+ "Editor Keymap": "Mapa de Teclado do Editor",
+ "default": "padrão",
"vim": "vim",
"emacs": "emacs",
- "⚠️ Please restart boostnote after you change the keymap": "⚠️ Please restart boostnote after you change the keymap",
- "Show line numbers in the editor": "Show line numbers in the editor",
- "Allow editor to scroll past the last line": "Allow editor to scroll past the last line",
- "Bring in web page title when pasting URL on editor": "Bring in web page title when pasting URL on editor",
- "Preview": "Preview",
- "Preview Font Size": "Preview Font Size",
- "Preview Font Family": "Preview Font Family",
- "Code Block Theme": "Code Block Theme",
- "Allow preview to scroll past the last line": "Allow preview to scroll past the last line",
- "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
- "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
- "LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter",
- "LaTeX Block Open Delimiter": "LaTeX Block Open Delimiter",
- "LaTeX Block Close Delimiter": "LaTeX Block Close Delimiter",
+ "⚠️ Please restart boostnote after you change the keymap": "⚠️ Por favor, reinicia o Boostnote depois de alterar o mapa de teclado.",
+ "Show line numbers in the editor": "Mostrar os números das linhas no editor",
+ "Allow editor to scroll past the last line": "Permitir que o editor faça scroll além da última linha",
+ "Bring in web page title when pasting URL on editor": "Trazer o título da página da Web ao colar o endereço no editor",
+ "Preview": "Pré-Visualização",
+ "Preview Font Size": "Tamanho da Fonte da Pré-Visualização",
+ "Preview Font Family": "Família da Fonte da Pré-Visualização",
+ "Code Block Theme": "Tema do Bloco de Código",
+ "Allow preview to scroll past the last line": "Permitir que se faça scroll além da última linha",
+ "Show line numbers for preview code blocks": "Mostrar os números das linhas na pré-visualização dos blocos de código",
+ "LaTeX Inline Open Delimiter": "Delimitador para Abrir Bloco LaTeX em Linha",
+ "LaTeX Inline Close Delimiter": "Delimitador para Fechar Bloco LaTeX em Linha",
+ "LaTeX Block Open Delimiter": "Delimitador para Abrir Bloco LaTeX",
+ "LaTeX Block Close Delimiter": "Delimitador para Fechar Bloco LaTeX",
"PlantUML Server": "PlantUML Server",
- "Community": "Community",
- "Subscribe to Newsletter": "Subscribe to Newsletter",
+ "Community": "Comunidade",
+ "Subscribe to Newsletter": "Subscrever à Newsletter",
"GitHub": "GitHub",
"Blog": "Blog",
- "Facebook Group": "Facebook Group",
+ "Facebook Group": "Grupo de Facebook",
"Twitter": "Twitter",
- "About": "About",
+ "About": "Sobre",
"Boostnote": "Boostnote",
- "An open source note-taking app made for programmers just like you.": "An open source note-taking app made for programmers just like you.",
+ "An open source note-taking app made for programmers just like you.": "Uma aplicação open source de bloco de notas feita para programadores como tu.",
"Website": "Website",
- "Development": "Development",
- " : Development configurations for Boostnote.": " : Development configurations for Boostnote.",
- "Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
- "License: GPL v3": "License: GPL v3",
- "Analytics": "Analytics",
- "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.",
- "You can see how it works on ": "You can see how it works on ",
- "You can choose to enable or disable this option.": "You can choose to enable or disable this option.",
- "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
- "Crowdfunding": "Crowdfunding",
- "Dear Boostnote users,": "Dear Boostnote users,",
- "Thank you for using Boostnote!": "Thank you for using Boostnote!",
- "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote is used in about 200 different countries and regions by an awesome community of developers.",
- "To support our growing userbase, and satisfy community expectations,": "To support our growing userbase, and satisfy community expectations,",
- "we would like to invest more time and resources in this project.": "we would like to invest more time and resources in this project.",
- "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!",
- "Thanks,": "Thanks,",
- "The Boostnote Team": "The Boostnote Team",
- "Support via OpenCollective": "Support via OpenCollective",
- "Language": "Language",
- "English": "English",
- "German": "German",
- "French": "French",
- "Show \"Saved to Clipboard\" notification when copying": "Show \"Saved to Clipboard\" notification when copying",
- "All Notes": "All Notes",
- "Starred": "Starred",
- "Are you sure to ": "Are you sure to ",
- " delete": " delete",
- "this folder?": "this folder?",
- "Confirm": "Confirm",
- "Cancel": "Cancel",
- "Markdown Note": "Markdown Note",
- "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.",
- "Snippet Note": "Snippet Note",
- "This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "This format is for creating code snippets. Multiple snippets can be grouped into a single note.",
- "Tab to switch format": "Tab to switch format",
- "Updated": "Updated",
- "Created": "Created",
- "Alphabetically": "Alphabetically",
- "Default View": "Default View",
- "Compressed View": "Compressed View",
- "Search": "Search",
- "Blog Type": "Blog Type",
- "Blog Address": "Blog Address",
- "Save": "Save",
- "Auth": "Auth",
- "Authentication Method": "Authentication Method",
+ "Development": "Desenvolvimento",
+ " : Development configurations for Boostnote.": " : Configurações de desenvolvimento para o Boostnote.",
+ "Copyright (C) 2017 - 2018 BoostIO": "Direitos de Autor (C) 2017 - 2018 BoostIO",
+ "License: GPL v3": "Licença: GPL v3",
+ "Analytics": "Analíse de Data",
+ "Boostnote collects anonymous data for the sole purpose of improving the application, and strictly does not collect any personal information such the contents of your notes.": "O Boostnote coleta dados anônimos com o único propósito de melhorar a aplicação e não adquire informação pessoal ou conteúdo das tuas notas.",
+ "You can see how it works on ": "Podes ver como funciona em ",
+ "You can choose to enable or disable this option.": "Podes optar por activar ou desactivar esta opção.",
+ "Enable analytics to help improve Boostnote": "Permitir recolha de data anônima para ajudar a melhorar o Boostnote",
+ "Crowdfunding": "Financiamento Coletivo",
+ "Dear Boostnote users,": "Caros(as),",
+ "Thank you for using Boostnote!": "Obrigado por usar o Boostnote!",
+ "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "O Boostnote é usado em cerca de 200 países e regiões diferentes por uma incrível comunidade de developers.",
+ "To support our growing userbase, and satisfy community expectations,": "Para continuar a apoiar o crescimento e satisfazer as expectativas da comunidade,",
+ "we would like to invest more time and resources in this project.": "gostaríamos de investir mais tempo e recursos neste projeto.",
+ "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Se gostas deste projeto e vês o seu potencial, podes ajudar-nos através de donativos no OpenCollective!",
+ "Thanks,": "Obrigado,",
+ "The Boostnote Team": "A Equipa do Boostnote",
+ "Support via OpenCollective": "Suporte via OpenCollective",
+ "Language": "Idioma",
+ "English": "Inglês",
+ "German": "Alemão",
+ "French": "Francês",
+ "Show \"Saved to Clipboard\" notification when copying": "Mostrar a notificação \"Guardado na Área de Transferência\" ao copiar",
+ "All Notes": "Todas as Notas",
+ "Starred": "Com Estrela",
+ "Are you sure to ": "Tens a certeza que gostarias de ",
+ " delete": " apagar",
+ "this folder?": "esta pasta?",
+ "Confirm": "Confirmar",
+ "Cancel": "Cancelar",
+ "Markdown Note": "Nota em Markdown",
+ "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "Este formato permite a criação de documentos de texto. Estão disponíveis: listas de verificação, blocos de código e blocos Latex.",
+ "Snippet Note": "Fragmento de Nota",
+ "This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "Este formato permite a criação de fragmentos de notas. Vários fragmentos podem ser agrupados em uma única nota.",
+ "Tab to switch format": "Tab para mudar o formato",
+ "Updated": "Actualizado",
+ "Created": "Criado",
+ "Alphabetically": "Alfabeticamente",
+ "Default View": "Vista Padrão",
+ "Compressed View": "Vista Comprimida",
+ "Search": "Procurar",
+ "Blog Type": "Tipo de Blog",
+ "Blog Address": "Endereço do Blog",
+ "Save": "Guardar",
+ "Auth": "Autenticação",
+ "Authentication Method": "Método de Autenticação",
"JWT": "JWT",
"USER": "USER",
"Token": "Token",
- "Storage": "Storage",
- "Hotkeys": "Hotkeys",
- "Show/Hide Boostnote": "Show/Hide Boostnote",
- "Restore": "Restore",
- "Permanent Delete": "Permanent Delete",
- "Confirm note deletion": "Confirm note deletion",
- "This will permanently remove this note.": "This will permanently remove this note.",
- "Successfully applied!": "Successfully applied!",
- "Albanian": "Albanian",
- "Chinese (zh-CN)": "Chinese (zh-CN)",
- "Chinese (zh-TW)": "Chinese (zh-TW)",
- "Danish": "Danish",
- "Japanese": "Japanese",
- "Korean": "Korean",
- "Norwegian": "Norwegian",
- "Polish": "Polish",
- "Portuguese": "Portuguese",
- "Spanish": "Spanish",
- "Unsaved Changes!": "Unsaved Changes!",
- "Russian": "Russian",
- "Thai": "Thai (ภาษาไทย)",
- "Editor Rulers": "Editor Rulers",
- "Enable": "Enable",
- "Disable": "Disable",
- "Sanitization": "Sanitization",
- "Only allow secure html tags (recommended)": "Only allow secure html tags (recommended)",
- "Allow styles": "Allow styles",
- "Allow dangerous html tags": "Allow dangerous html tags",
- "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "Storage": "Armazenamento",
+ "Hotkeys": "Teclas de Atalho",
+ "Show/Hide Boostnote": "Mostrar/Esconder Boostnote",
+ "Restore": "Restaurar",
+ "Permanent Delete": "Apagar Permanentemente",
+ "Confirm note deletion": "Confirmar o apagamento da nota",
+ "This will permanently remove this note.": "Isto irá remover permanentemente esta nota.",
+ "Successfully applied!": "Aplicado com Sucesso!",
+ "Albanian": "Albanês",
+ "Chinese (zh-CN)": "Chinês (zh-CN)",
+ "Chinese (zh-TW)": "Chinês (zh-TW)",
+ "Danish": "Dinamarquês",
+ "Japanese": "Japonês",
+ "Korean": "Coreano",
+ "Norwegian": "Norueguês",
+ "Polish": "Polaco",
+ "Portuguese": "Português (pt-PT)",
+ "Spanish": "Espanhol",
+ "Unsaved Changes!": "Alterações Não Guardadas!",
+ "Russian": "Russo",
+ "Editor Rulers": "Réguas do Editor",
+ "Enable": "Activar",
+ "Disable": "Desactivar",
+ "Sanitization": "Sanitização",
+ "Only allow secure html tags (recommended)": "Perminar somente tags html seguras (recomendado)",
+ "Allow styles": "Permitir Estilos",
+ "Allow dangerous html tags": "Permitir tags html perigosas",
+ "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Converter setas de texto em simbolos. ⚠ Isto irá interferir no use de comentários em HTML em Markdown.",
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ Você colou um link referente a um anexo que não pôde ser encontrado no local de armazenamento desta nota. A vinculação de anexos de referência de links só é suportada se o local de origem e de destino for o mesmo de armazenamento. Por favor, arraste e solte o anexo na nota! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/ru.json b/locales/ru.json
index 6dae9948..793e1511 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -149,5 +149,6 @@
"Enable": "Enable",
"Disable": "Disable",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/sq.json b/locales/sq.json
index 870d7ee3..e4cc01ac 100644
--- a/locales/sq.json
+++ b/locales/sq.json
@@ -151,5 +151,6 @@
"Allow styles": "Allow styles",
"Allow dangerous html tags": "Allow dangerous html tags",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/tr.json b/locales/tr.json
index be2ddb4f..03a9791d 100644
--- a/locales/tr.json
+++ b/locales/tr.json
@@ -151,5 +151,6 @@
"Sanitization": "Temizleme",
"Only allow secure html tags (recommended)": "Sadece güvenli html etiketlerine izin ver (tavsiye edilen)",
"Allow styles": "Stillere izin ver",
- "Allow dangerous html tags": "Tehlikeli html etiketlerine izin ver"
+ "Allow dangerous html tags": "Tehlikeli html etiketlerine izin ver",
+ "Disabled": "Disabled"
}
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index a04cffdd..2e12323e 100755
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -207,5 +207,6 @@
"No tags":"无标签",
"Render newlines in Markdown paragraphs as ":"在 Markdown 段落中使用 换行",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
index 531f4322..93a8afd5 100755
--- a/locales/zh-TW.json
+++ b/locales/zh-TW.json
@@ -150,5 +150,6 @@
"Allow styles": "允許樣式",
"Allow dangerous html tags": "允許危險的 HTML 標籤",
"Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.",
- "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠"
+ "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠": "⚠ You have pasted a link referring an attachment that could not be found in the storage location of this note. Pasting links referring attachments is only supported if the source and destination location is the same storage. Please Drag&Drop the attachment instead! ⚠",
+ "Disabled": "Disabled"
}
diff --git a/package.json b/package.json
index 47b6d2bd..f12360a0 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "boost",
"productName": "Boostnote",
- "version": "0.11.10",
+ "version": "0.11.12",
"main": "index.js",
"description": "Boostnote",
"license": "GPL-3.0",
@@ -12,10 +12,11 @@
"jest": "jest",
"fix": "eslint . --fix",
"lint": "eslint .",
- "dev": "node dev-scripts/dev.js"
+ "dev": "node dev-scripts/dev.js",
+ "watch": "webpack-dev-server --hot"
},
"config": {
- "electron-version": "3.0.3"
+ "electron-version": "3.0.8"
},
"repository": {
"type": "git",
@@ -47,6 +48,7 @@
},
"homepage": "https://boostnote.io",
"dependencies": {
+ "@enyaxu/markdown-it-anchor": "^5.0.2",
"@rokt33r/markdown-it-math": "^4.0.1",
"@rokt33r/season": "^5.3.0",
"@susisu/mte-kernel": "^2.0.0",
@@ -60,7 +62,7 @@
"escape-string-regexp": "^1.0.5",
"file-uri-to-path": "^1.0.0",
"file-url": "^2.0.2",
- "filenamify": "^2.0.0",
+ "filenamify": "^2.1.0",
"flowchart.js": "^1.6.5",
"font-awesome": "^4.3.0",
"fs-extra": "^5.0.0",
@@ -80,7 +82,6 @@
"markdown-it-imsize": "^2.0.1",
"markdown-it-kbd": "^1.1.1",
"markdown-it-multimd-table": "^2.0.1",
- "markdown-it-named-headers": "^0.0.4",
"markdown-it-plantuml": "^1.1.0",
"markdown-it-smartarrows": "^1.0.1",
"markdown-it-sub": "^1.0.0",
@@ -98,16 +99,19 @@
"react-codemirror": "^0.3.0",
"react-debounce-render": "^4.0.1",
"react-dom": "^15.0.2",
+ "react-image-carousel": "^2.0.18",
"react-redux": "^4.4.5",
"react-sortable-hoc": "^0.6.7",
+ "react-transition-group": "^2.5.0",
"redux": "^3.5.2",
"sander": "^0.5.1",
"sanitize-html": "^1.18.2",
"striptags": "^2.2.1",
+ "turndown": "^4.0.2",
+ "turndown-plugin-gfm": "^1.0.2",
+ "typo-js": "^1.0.3",
"unique-slug": "2.0.0",
- "uuid": "^3.2.1",
- "turndown":"^4.0.2",
- "turndown-plugin-gfm":"^1.0.2"
+ "uuid": "^3.2.1"
},
"devDependencies": {
"ava": "^0.25.0",
@@ -129,7 +133,7 @@
"css-loader": "^0.19.0",
"devtron": "^1.1.0",
"dom-storage": "^2.0.2",
- "electron": "3.0.3",
+ "electron": "3.0.8",
"electron-packager": "^12.0.0",
"eslint": "^3.13.1",
"eslint-config-standard": "^6.2.1",
@@ -140,6 +144,7 @@
"grunt": "^0.4.5",
"grunt-electron-installer": "2.1.0",
"history": "^1.17.0",
+ "husky": "^1.1.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^22.4.3",
"jest-localstorage-mock": "^2.2.0",
@@ -187,5 +192,10 @@
"/tests/jest.js",
"jest-localstorage-mock"
]
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "npm run lint"
+ }
}
}
diff --git a/readme.md b/readme.md
index b3f2ec46..aba9b92a 100644
--- a/readme.md
+++ b/readme.md
@@ -5,8 +5,11 @@
Note-taking app for programmers.
Apps available for Mac, Windows, Linux, Android, and iOS.
Built with Electron, React + Redux, Webpack, and CSSModules.
␊
`
diff --git a/tests/lib/snapshots/markdown-test.js.snap b/tests/lib/snapshots/markdown-test.js.snap
index b60aae57..f9badcc2 100644
Binary files a/tests/lib/snapshots/markdown-test.js.snap and b/tests/lib/snapshots/markdown-test.js.snap differ
diff --git a/tests/lib/spellcheck.test.js b/tests/lib/spellcheck.test.js
new file mode 100644
index 00000000..6ebaaf3b
--- /dev/null
+++ b/tests/lib/spellcheck.test.js
@@ -0,0 +1,330 @@
+const Typo = require('typo-js')
+const CodeMirror = require('codemirror')
+jest.mock('typo-js')
+
+const systemUnderTest = require('browser/lib/spellcheck')
+
+beforeEach(() => {
+ // Clear all instances and calls to constructor and all methods:
+ Typo.mockClear()
+})
+
+it('should test that checkWord does not marks words that do not contain a typo', function () {
+ const testWord = 'testWord'
+ const editor = jest.fn()
+ editor.getRange = jest.fn(() => testWord)
+ editor.markText = jest.fn()
+ const range = {anchor: {line: 1, ch: 0}, head: {line: 1, ch: 10}}
+ const mockDictionary = jest.fn()
+ mockDictionary.check = jest.fn(() => true)
+ systemUnderTest.setDictionaryForTestsOnly(mockDictionary)
+
+ systemUnderTest.checkWord(editor, range)
+
+ expect(editor.getRange).toHaveBeenCalledWith(range.anchor, range.head)
+ expect(mockDictionary.check).toHaveBeenCalledWith(testWord)
+ expect(editor.markText).not.toHaveBeenCalled()
+})
+
+it('should test that checkWord should marks words that contain a typo', function () {
+ const testWord = 'testWord'
+ const editor = jest.fn()
+ editor.getRange = jest.fn(() => testWord)
+ editor.markText = jest.fn()
+ const range = {anchor: {line: 1, ch: 0}, head: {line: 1, ch: 10}}
+ const mockDictionary = jest.fn()
+ mockDictionary.check = jest.fn(() => false)
+ systemUnderTest.setDictionaryForTestsOnly(mockDictionary)
+
+ systemUnderTest.checkWord(editor, range)
+
+ expect(editor.getRange).toHaveBeenCalledWith(range.anchor, range.head)
+ expect(mockDictionary.check).toHaveBeenCalledWith(testWord)
+ expect(editor.markText).toHaveBeenCalledWith(range.anchor, range.head, {'className': systemUnderTest.CSS_ERROR_CLASS})
+})
+
+it('should test that setLanguage clears all marks', function () {
+ const dummyMarks = [
+ {clear: jest.fn()},
+ {clear: jest.fn()},
+ {clear: jest.fn()}
+ ]
+ const editor = jest.fn()
+ editor.getAllMarks = jest.fn(() => dummyMarks)
+
+ systemUnderTest.setLanguage(editor, systemUnderTest.SPELLCHECK_DISABLED)
+
+ expect(editor.getAllMarks).toHaveBeenCalled()
+ for (const dummyMark of dummyMarks) {
+ expect(dummyMark.clear).toHaveBeenCalled()
+ }
+})
+
+it('should test that setLanguage with DISABLED as a lang argument should not load any dictionary and not check the whole document', function () {
+ const editor = jest.fn()
+ editor.getAllMarks = jest.fn(() => [])
+ const checkWholeDocumentSpy = jest.spyOn(systemUnderTest, 'checkWholeDocument').mockImplementation()
+
+ systemUnderTest.setLanguage(editor, systemUnderTest.SPELLCHECK_DISABLED)
+
+ expect(Typo).not.toHaveBeenCalled()
+ expect(checkWholeDocumentSpy).not.toHaveBeenCalled()
+ checkWholeDocumentSpy.mockRestore()
+})
+
+it('should test that setLanguage loads the correct dictionary', function () {
+ const editor = jest.fn()
+ editor.getAllMarks = jest.fn(() => [])
+ const lang = 'de_DE'
+ const checkWholeDocumentSpy = jest.spyOn(systemUnderTest, 'checkWholeDocument').mockImplementation()
+
+ expect(Typo).not.toHaveBeenCalled()
+ systemUnderTest.setLanguage(editor, lang)
+
+ expect(Typo).toHaveBeenCalledWith(lang, false, false, expect.anything())
+ expect(Typo.mock.calls[0][3].dictionaryPath).toEqual(systemUnderTest.DICTIONARY_PATH)
+ expect(Typo.mock.calls[0][3].asyncLoad).toBe(true)
+ checkWholeDocumentSpy.mockRestore()
+})
+
+it('should test that checkMultiLineRange performs checks for each word in the stated range', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {line: 2, ch: 4}
+ const rangeTo = {line: 3, ch: 36}
+
+ systemUnderTest.checkMultiLineRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(11)
+ expect(dic.check.mock.calls[0][0]).toEqual('lacus')
+ expect(dic.check.mock.calls[1][0]).toEqual('elit')
+ expect(dic.check.mock.calls[2][0]).toEqual('sollicitudin')
+ expect(dic.check.mock.calls[3][0]).toEqual('vestibulum')
+ expect(dic.check.mock.calls[4][0]).toEqual('Phasellus')
+ expect(dic.check.mock.calls[5][0]).toEqual('blandit')
+ expect(dic.check.mock.calls[6][0]).toEqual('laoreet')
+ expect(dic.check.mock.calls[7][0]).toEqual('odio')
+ expect(dic.check.mock.calls[8][0]).toEqual('tristique')
+ expect(dic.check.mock.calls[9][0]).toEqual('risus')
+ expect(dic.check.mock.calls[10][0]).toEqual('tristique')
+})
+
+it('should test that checkMultiLineRange works correct even when the range is inverted (from is the later position and to the lower)', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {line: 3, ch: 36}
+ const rangeTo = {line: 2, ch: 4}
+
+ systemUnderTest.checkMultiLineRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(11)
+ expect(dic.check.mock.calls[0][0]).toEqual('lacus')
+ expect(dic.check.mock.calls[1][0]).toEqual('elit')
+ expect(dic.check.mock.calls[2][0]).toEqual('sollicitudin')
+ expect(dic.check.mock.calls[3][0]).toEqual('vestibulum')
+ expect(dic.check.mock.calls[4][0]).toEqual('Phasellus')
+ expect(dic.check.mock.calls[5][0]).toEqual('blandit')
+ expect(dic.check.mock.calls[6][0]).toEqual('laoreet')
+ expect(dic.check.mock.calls[7][0]).toEqual('odio')
+ expect(dic.check.mock.calls[8][0]).toEqual('tristique')
+ expect(dic.check.mock.calls[9][0]).toEqual('risus')
+ expect(dic.check.mock.calls[10][0]).toEqual('tristique')
+})
+
+it('should test that checkMultiLineRange works for single line', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {line: 5, ch: 14}
+ const rangeTo = {line: 5, ch: 39}
+
+ systemUnderTest.checkMultiLineRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(3)
+ expect(dic.check.mock.calls[0][0]).toEqual('volutpat')
+ expect(dic.check.mock.calls[1][0]).toEqual('quis')
+ expect(dic.check.mock.calls[2][0]).toEqual('ullamcorper')
+})
+
+it('should test that checkMultiLineRange works for single word', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {line: 7, ch: 6}
+ const rangeTo = {line: 7, ch: 6}
+
+ systemUnderTest.checkMultiLineRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(1)
+ expect(dic.check.mock.calls[0][0]).toEqual('molestie')
+})
+
+it('should make sure that liveSpellcheck don\'t work if the spellcheck is not enabled', function () {
+ const checkMultiLineRangeSpy = jest.spyOn(systemUnderTest, 'checkMultiLineRange').mockImplementation()
+ const editor = jest.fn()
+ editor.findMarks = jest.fn()
+
+ systemUnderTest.setDictionaryForTestsOnly(null)
+ systemUnderTest.checkChangeRange(editor, {}, {})
+
+ expect(checkMultiLineRangeSpy).not.toHaveBeenCalled()
+ expect(editor.findMarks).not.toHaveBeenCalled()
+
+ checkMultiLineRangeSpy.mockRestore()
+})
+
+it('should make sure that liveSpellcheck works for a range of changes', function () {
+ const editor = jest.fn()
+ const marks = [{clear: jest.fn()}, {clear: jest.fn()}]
+ editor.findMarks = jest.fn(() => marks)
+ const checkMultiLineRangeSpy = jest.spyOn(systemUnderTest, 'checkMultiLineRange').mockImplementation()
+
+ const inputChangeRange = {from: {line: 0, ch: 2}, to: {line: 1, ch: 1}}
+ const inputChangeRangeTo = {from: {line: 0, ch: 2}, to: {line: 1, ch: 2}}
+
+ systemUnderTest.setDictionaryForTestsOnly({})
+ systemUnderTest.checkChangeRange(editor, inputChangeRange, inputChangeRangeTo)
+
+ expect(checkMultiLineRangeSpy).toHaveBeenCalledWith(editor, {line: 0, ch: 1}, {line: 1, ch: 3})
+ expect(editor.findMarks).toHaveBeenCalledWith({line: 0, ch: 1}, {line: 1, ch: 3})
+ expect(marks[0].clear).toHaveBeenCalled()
+ expect(marks[1].clear).toHaveBeenCalled()
+ checkMultiLineRangeSpy.mockRestore()
+})
+
+it('should make sure that liveSpellcheck works if ranges are inverted', function () {
+ const editor = jest.fn()
+ const marks = [{clear: jest.fn()}, {clear: jest.fn()}]
+ editor.findMarks = jest.fn(() => marks)
+ const checkMultiLineRangeSpy = jest.spyOn(systemUnderTest, 'checkMultiLineRange').mockImplementation()
+
+ const inputChangeRange = {from: {line: 0, ch: 2}, to: {line: 1, ch: 2}}
+ const inputChangeRangeTo = {from: {line: 0, ch: 2}, to: {line: 1, ch: 1}}
+
+ systemUnderTest.setDictionaryForTestsOnly({})
+ systemUnderTest.checkChangeRange(editor, inputChangeRange, inputChangeRangeTo)
+
+ expect(checkMultiLineRangeSpy).toHaveBeenCalledWith(editor, {line: 0, ch: 1}, {line: 1, ch: 3})
+ expect(editor.findMarks).toHaveBeenCalledWith({line: 0, ch: 1}, {line: 1, ch: 3})
+ expect(marks[0].clear).toHaveBeenCalled()
+ expect(marks[1].clear).toHaveBeenCalled()
+ checkMultiLineRangeSpy.mockRestore()
+})
+
+it('should make sure that liveSpellcheck works for a single word with change at the beginning', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {from: {line: 7, ch: 6}, to: {line: 7, ch: 6}}
+ const rangeTo = {from: {line: 7, ch: 6}, to: {line: 7, ch: 6}}
+
+ systemUnderTest.checkChangeRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(1)
+ expect(dic.check.mock.calls[0][0]).toEqual('molestie')
+})
+
+it('should make sure that liveSpellcheck works for a single word with change in the middle', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {from: {line: 7, ch: 9}, to: {line: 7, ch: 9}}
+ const rangeTo = {from: {line: 7, ch: 9}, to: {line: 7, ch: 9}}
+
+ systemUnderTest.checkChangeRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(1)
+ expect(dic.check.mock.calls[0][0]).toEqual('molestie')
+})
+
+it('should make sure that liveSpellcheck works for a single word with change at the end', function () {
+ const dic = jest.fn()
+ dic.check = jest.fn()
+ systemUnderTest.setDictionaryForTestsOnly(dic)
+ document.body.createTextRange = jest.fn(() => document.createElement('textArea'))
+ const editor = new CodeMirror(jest.fn())
+ editor.setValue(
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vehicula sem id tempor sollicitudin. Sed eu sagittis ligula. Maecenas sit amet velit enim. Etiam massa urna, elementum et sapien sit amet, vestibulum pharetra lectus. Nulla consequat malesuada nunc in aliquam. Vivamus faucibus orci et faucibus maximus. Pellentesque at dolor ac mi mollis molestie in facilisis nisl.\n' +
+ '\n' +
+ 'Nam id lacus et elit sollicitudin vestibulum. Phasellus blandit laoreet odio \n' +
+ 'Ut tristique risus et mi tristique, in aliquam odio laoreet. Curabitur nunc felis, mollis ut laoreet quis, finibus in nibh. Proin urna risus, rhoncus at diam interdum, maximus vestibulum nulla. Maecenas ut rutrum nulla, vel finibus est. Etiam placerat mi et libero volutpat, tristique rhoncus felis volutpat. Donec quam erat, congue quis ligula eget, mollis aliquet elit. Vestibulum feugiat odio sit amet ex dignissim, sit amet vulputate lectus iaculis. Sed tempus id enim at eleifend. Nullam bibendum eleifend congue. Pellentesque varius arcu elit, at accumsan dolor ultrices vitae. Etiam condimentum lectus id dolor fringilla tempor. Aliquam nec fringilla sem. Fusce ac quam porta, molestie nunc sed, semper nisl. Curabitur luctus sem in dapibus gravida. Suspendisse scelerisque mollis rutrum. Proin lacinia dolor sit amet ornare condimentum.\n' +
+ '\n' +
+ 'In ex neque, volutpat quis ullamcorper in, vestibulum vel ligula. Quisque lobortis eget neque quis ullamcorper. Nunc purus lorem, scelerisque in malesuada id, congue a magna. Donec rutrum maximus egestas. Nulla ornare libero quis odio ultricies iaculis. Suspendisse consectetur bibendum purus ac blandit. Donec et neque quis dolor eleifend tempus. Fusce fringilla risus id venenatis rutrum. Mauris commodo posuere ipsum, sit amet hendrerit risus lacinia quis. Aenean placerat ultricies ante id dapibus. Donec imperdiet eros quis porttitor accumsan. Vestibulum ut nulla luctus velit feugiat elementum. Nam vel pharetra nisl. Nullam risus tellus, tempor quis ipsum et, pretium rutrum ipsum.\n' +
+ '\n' +
+ 'Fusce molestie leo at facilisis mollis. Vivamus iaculis facilisis fermentum. Vivamus blandit id nisi sit amet porta. Nunc luctus porta blandit. Sed ac consequat eros, eu fringilla lorem. In blandit pharetra sollicitudin. Vivamus placerat risus ut ex faucibus, nec vehicula sapien imperdiet. Praesent luctus, leo eget ultrices cursus, neque ante porttitor mauris, id tempus tellus urna at ex. Curabitur elementum id quam vitae condimentum. Proin sit amet magna vel metus blandit iaculis. Phasellus viverra libero in lacus gravida, id laoreet ligula dapibus. Cras commodo arcu eget mi dignissim, et lobortis elit faucibus. Suspendisse potenti. ')
+ const rangeFrom = {from: {line: 7, ch: 14}, to: {line: 7, ch: 14}}
+ const rangeTo = {from: {line: 7, ch: 14}, to: {line: 7, ch: 14}}
+
+ systemUnderTest.checkChangeRange(editor, rangeFrom, rangeTo)
+
+ expect(dic.check).toHaveBeenCalledTimes(1)
+ expect(dic.check.mock.calls[0][0]).toEqual('molestie')
+})
diff --git a/webpack.config.js b/webpack.config.js
index 16b7fd73..ad3c4f8b 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -28,7 +28,14 @@ var config = Object.assign({}, skeleton, {
publicPath: 'http://localhost:8080/assets/'
},
debug: true,
- devtool: 'cheap-module-eval-source-map'
+ devtool: 'cheap-module-eval-source-map',
+ devServer: {
+ port: 8080,
+ hot: true,
+ inline: true,
+ quiet: false,
+ publicPath: 'http://localhost:8080/assets/'
+ }
})
module.exports = config
diff --git a/yarn.lock b/yarn.lock
index 35c7b9db..604880e5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -58,6 +58,10 @@
dependencies:
arrify "^1.0.1"
+"@enyaxu/markdown-it-anchor@^5.0.2":
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/@enyaxu/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz#d173f7b60b492aabc17dfba864c4d071f5595f72"
+
"@ladjs/time-require@^0.1.4":
version "0.1.4"
resolved "https://registry.yarnpkg.com/@ladjs/time-require/-/time-require-0.1.4.tgz#5c615d75fd647ddd5de9cf6922649558856b21a1"
@@ -1685,6 +1689,10 @@ ci-info@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2"
+ci-info@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+
circular-json@^0.3.1:
version "0.3.3"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
@@ -2102,6 +2110,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+cosmiconfig@^5.0.6:
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+
create-error-class@^3.0.0, create-error-class@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@@ -2744,6 +2760,10 @@ doctrine@^2.0.0, doctrine@^2.0.2:
dependencies:
esutils "^2.0.2"
+dom-helpers@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
+
dom-serializer@0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -2938,9 +2958,9 @@ electron-winstaller@^2.2.0:
lodash.template "^4.2.2"
temp "^0.8.3"
-electron@3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/electron/-/electron-3.0.3.tgz#2857ed8d37c1b46e0a75a72684800252255f3243"
+electron@3.0.8:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/electron/-/electron-3.0.8.tgz#7905806ebaead4c693531e11cda6568c32efa7bb"
dependencies:
"@types/node" "^8.0.24"
electron-download "^4.1.0"
@@ -3359,6 +3379,18 @@ execa@^0.7.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
+execa@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
exit-hook@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
@@ -3586,9 +3618,9 @@ filename-reserved-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
-filenamify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.0.0.tgz#bd162262c0b6e94bfbcdcf19a3bbb3764f785695"
+filenamify@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
dependencies:
filename-reserved-regex "^2.0.0"
strip-outer "^1.0.0"
@@ -3665,6 +3697,12 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ dependencies:
+ locate-path "^3.0.0"
+
findup-sync@~0.1.2:
version "0.1.3"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.1.3.tgz#7f3e7a97b82392c653bf06589bd85190e93c3683"
@@ -3910,6 +3948,10 @@ get-stdin@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398"
+get-stdin@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
+
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -4447,6 +4489,21 @@ humanize-plus@^1.8.1:
version "1.8.2"
resolved "https://registry.yarnpkg.com/humanize-plus/-/humanize-plus-1.8.2.tgz#a65b34459ad6367adbb3707a82a3c9f916167030"
+husky@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-1.1.0.tgz#7271e85f5d98b54349788839b720c9a60cd95dba"
+ dependencies:
+ cosmiconfig "^5.0.6"
+ execa "^0.9.0"
+ find-up "^3.0.0"
+ get-stdin "^6.0.0"
+ is-ci "^1.2.1"
+ pkg-dir "^3.0.0"
+ please-upgrade-node "^3.1.1"
+ read-pkg "^4.0.1"
+ run-node "^1.0.0"
+ slash "^2.0.0"
+
i18n-2@^0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/i18n-2/-/i18n-2-0.7.2.tgz#7efb1a7adc67869adea0688951577464aa793aaf"
@@ -4657,6 +4714,12 @@ is-ci@^1.0.10, is-ci@^1.0.7:
dependencies:
ci-info "^1.0.0"
+is-ci@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+ dependencies:
+ ci-info "^1.5.0"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -4689,6 +4752,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
is-dotfile@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -5319,6 +5386,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
js-yaml@^3.10.0, js-yaml@^3.5.1, js-yaml@^3.7.0:
version "3.11.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
@@ -5326,7 +5397,7 @@ js-yaml@^3.10.0, js-yaml@^3.5.1, js-yaml@^3.7.0:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@^3.12.0, js-yaml@^3.8.1:
+js-yaml@^3.12.0, js-yaml@^3.8.1, js-yaml@^3.9.0:
version "3.12.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
dependencies:
@@ -5683,6 +5754,13 @@ locate-path@^2.0.0:
p-locate "^2.0.0"
path-exists "^3.0.0"
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
lodash-es@^4.2.1:
version "4.17.10"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.10.tgz#62cd7104cdf5dd87f235a837f0ede0e8e5117e05"
@@ -5800,6 +5878,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3
dependencies:
js-tokens "^3.0.0"
+loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
loud-rejection@^1.0.0, loud-rejection@^1.2.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
@@ -5878,12 +5962,6 @@ markdown-it-multimd-table@^2.0.1:
dependencies:
markdown-it "^5.0.3"
-markdown-it-named-headers@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/markdown-it-named-headers/-/markdown-it-named-headers-0.0.4.tgz#82efc28324240a6b1e77b9aae501771d5f351c1f"
- dependencies:
- string "^3.0.1"
-
markdown-it-plantuml@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/markdown-it-plantuml/-/markdown-it-plantuml-1.1.0.tgz#9ab8bfa09a02d80845e16e60f87a488edb50fdde"
@@ -6682,16 +6760,32 @@ p-limit@^1.1.0:
dependencies:
p-try "^1.0.0"
+p-limit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
+ dependencies:
+ p-try "^2.0.0"
+
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
dependencies:
p-limit "^1.1.0"
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ dependencies:
+ p-limit "^2.0.0"
+
p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+p-try@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
+
package-hash@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44"
@@ -6887,12 +6981,24 @@ pkg-dir@^2.0.0:
dependencies:
find-up "^2.1.0"
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ dependencies:
+ find-up "^3.0.0"
+
pkg-up@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
dependencies:
find-up "^2.1.0"
+please-upgrade-node@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac"
+ dependencies:
+ semver-compare "^1.0.0"
+
plist@^2.0.0, plist@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
@@ -7242,6 +7348,13 @@ prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.7, prop-types@^15.5.8,
loose-envify "^1.3.1"
object-assign "^4.1.1"
+prop-types@^15.6.2:
+ version "15.6.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
+ dependencies:
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
proxy-addr@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
@@ -7421,6 +7534,10 @@ react-dom@^15.0.2:
object-assign "^4.1.0"
prop-types "^15.5.10"
+react-image-carousel@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/react-image-carousel/-/react-image-carousel-2.0.18.tgz#5868ea09bd9cca09c4467d3d02695cd4e7792f28"
+
react-input-autosize@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-1.2.0.tgz#87241071159f742123897691da6796ec33b57d05"
@@ -7428,6 +7545,10 @@ react-input-autosize@^1.1.0:
create-react-class "^15.5.2"
prop-types "^15.5.8"
+react-lifecycles-compat@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
+
react-proxy@^1.1.7:
version "1.1.8"
resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a"
@@ -7493,6 +7614,15 @@ react-transform-hmr@^1.0.3:
global "^4.3.0"
react-proxy "^1.1.7"
+react-transition-group@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.5.0.tgz#70bca0e3546102c4dc5cf3f5f57f73447cce6874"
+ dependencies:
+ dom-helpers "^3.3.1"
+ loose-envify "^1.4.0"
+ prop-types "^15.6.2"
+ react-lifecycles-compat "^3.0.4"
+
react@^15.5.4:
version "15.6.2"
resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
@@ -7546,6 +7676,14 @@ read-pkg@^2.0.0:
normalize-package-data "^2.3.2"
path-type "^2.0.0"
+read-pkg@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237"
+ dependencies:
+ normalize-package-data "^2.3.2"
+ parse-json "^4.0.0"
+ pify "^3.0.0"
+
readable-stream@^1.1.8, readable-stream@~1.1.9:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -7896,6 +8034,10 @@ run-async@^0.1.0:
dependencies:
once "^1.3.0"
+run-node@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e"
+
run-parallel@^1.1.2:
version "1.1.9"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
@@ -7995,6 +8137,10 @@ section-iterator@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/section-iterator/-/section-iterator-2.0.0.tgz#bf444d7afeeb94ad43c39ad2fb26151627ccba2a"
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -8154,6 +8300,10 @@ slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+slash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+
slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
@@ -8454,10 +8604,6 @@ string-width@^1.0.1, string-width@^1.0.2:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
-string@^3.0.1:
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/string/-/string-3.3.3.tgz#5ea211cd92d228e184294990a6cc97b366a77cb0"
-
string_decoder@^0.10.25, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -8898,6 +9044,10 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+typo-js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typo-js/-/typo-js-1.0.3.tgz#54d8ebc7949f1a7810908b6002c6841526c99d5a"
+
ua-parser-js@^0.7.9:
version "0.7.18"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed"