1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 01:36:22 +00:00

Merge branch 'fence-attrs' into chart-yaml

This commit is contained in:
Baptiste Augrain
2018-09-30 21:46:09 +02:00
78 changed files with 2321 additions and 589 deletions

View File

@@ -292,6 +292,10 @@ export default class CodeEditor extends React.Component {
this.editor.on('cursorActivity', this.editorActivityHandler) this.editor.on('cursorActivity', this.editorActivityHandler)
this.editor.on('changes', this.editorActivityHandler) this.editor.on('changes', this.editorActivityHandler)
} }
this.setState({
clientWidth: this.refs.root.clientWidth
})
} }
expandSnippet (line, cursor, cm, snippets) { expandSnippet (line, cursor, cm, snippets) {
@@ -441,6 +445,14 @@ export default class CodeEditor extends React.Component {
this.editor.setOption('extraKeys', this.defaultKeyMap) this.editor.setOption('extraKeys', this.defaultKeyMap)
} }
if (this.state.clientWidth !== this.refs.root.clientWidth) {
this.setState({
clientWidth: this.refs.root.clientWidth
})
needRefresh = true
}
if (needRefresh) { if (needRefresh) {
this.editor.refresh() this.editor.refresh()
} }
@@ -604,7 +616,10 @@ export default class CodeEditor extends React.Component {
body, body,
'text/html' 'text/html'
) )
const linkWithTitle = `[${parsedBody.title}](${pastedTxt})` const escapePipe = (str) => {
return str.replace('|', '\\|')
}
const linkWithTitle = `[${escapePipe(parsedBody.title)}](${pastedTxt})`
resolve(linkWithTitle) resolve(linkWithTitle)
} catch (e) { } catch (e) {
reject(e) reject(e)

View File

@@ -18,8 +18,11 @@ import mdurl from 'mdurl'
import exportNote from 'browser/main/lib/dataApi/exportNote' import exportNote from 'browser/main/lib/dataApi/exportNote'
import { escapeHtmlCharacters } from 'browser/lib/utils' import { escapeHtmlCharacters } from 'browser/lib/utils'
import yaml from 'js-yaml' import yaml from 'js-yaml'
import context from 'browser/lib/context'
import i18n from 'browser/lib/i18n'
import fs from 'fs'
const { remote } = require('electron') const { remote, shell } = require('electron')
const attachmentManagement = require('../main/lib/dataApi/attachmentManagement') const attachmentManagement = require('../main/lib/dataApi/attachmentManagement')
const { app } = remote const { app } = remote
@@ -28,6 +31,8 @@ const fileUrl = require('file-url')
const dialog = remote.dialog const dialog = remote.dialog
const uri2path = require('file-uri-to-path')
const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1] const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1]
const appPath = fileUrl( const appPath = fileUrl(
process.env.NODE_ENV === 'production' ? app.getAppPath() : path.resolve() process.env.NODE_ENV === 'production' ? app.getAppPath() : path.resolve()
@@ -162,7 +167,6 @@ const scrollBarDarkStyle = `
} }
` `
const { shell } = require('electron')
const OSX = global.process.platform === 'darwin' const OSX = global.process.platform === 'darwin'
const defaultFontFamily = ['helvetica', 'arial', 'sans-serif'] const defaultFontFamily = ['helvetica', 'arial', 'sans-serif']
@@ -220,8 +224,32 @@ export default class MarkdownPreview extends React.Component {
} }
} }
handleContextMenu (e) { handleContextMenu (event) {
this.props.onContextMenu(e) // If a contextMenu handler was passed to us, use it instead of the self-defined one -> return
if (_.isFunction(this.props.onContextMenu)) {
this.props.onContextMenu(event)
return
}
// No contextMenu was passed to us -> execute our own link-opener
if (event.target.tagName.toLowerCase() === 'a') {
const href = event.target.href
const isLocalFile = href.startsWith('file:')
if (isLocalFile) {
const absPath = uri2path(href)
try {
if (fs.lstatSync(absPath).isFile()) {
context.popup([
{
label: i18n.__('Show in explorer'),
click: (e) => shell.showItemInFolder(absPath)
}
])
}
} catch (e) {
console.log('Error while evaluating if the file is locally available', e)
}
}
}
} }
handleDoubleClick (e) { handleDoubleClick (e) {
@@ -705,7 +733,6 @@ export default class MarkdownPreview extends React.Component {
el.addEventListener('click', this.linkClickHandler) el.addEventListener('click', this.linkClickHandler)
}) })
} catch (e) { } catch (e) {
console.error(e)
el.className = 'flowchart-error' el.className = 'flowchart-error'
el.innerHTML = 'Flowchart parse error: ' + e.message el.innerHTML = 'Flowchart parse error: ' + e.message
} }
@@ -726,7 +753,6 @@ export default class MarkdownPreview extends React.Component {
el.addEventListener('click', this.linkClickHandler) el.addEventListener('click', this.linkClickHandler)
}) })
} catch (e) { } catch (e) {
console.error(e)
el.className = 'sequence-error' el.className = 'sequence-error'
el.innerHTML = 'Sequence diagram parse error: ' + e.message el.innerHTML = 'Sequence diagram parse error: ' + e.message
} }
@@ -752,7 +778,6 @@ export default class MarkdownPreview extends React.Component {
const chart = new Chart(canvas, chartConfig) const chart = new Chart(canvas, chartConfig)
} catch (e) { } catch (e) {
console.error(e)
el.className = 'chart-error' el.className = 'chart-error'
el.innerHTML = 'chartjs diagram parse error: ' + e.message el.innerHTML = 'chartjs diagram parse error: ' + e.message
} }

View File

@@ -74,24 +74,22 @@ const NoteItem = ({
? note.title ? note.title
: <span styleName='item-title-empty'>{i18n.__('Empty note')}</span>} : <span styleName='item-title-empty'>{i18n.__('Empty note')}</span>}
</div> </div>
{['ALL', 'STORAGE'].includes(viewType) && <div styleName='item-middle'>
<div styleName='item-middle'> <div styleName='item-middle-time'>{dateDisplay}</div>
<div styleName='item-middle-time'>{dateDisplay}</div> <div styleName='item-middle-app-meta'>
<div styleName='item-middle-app-meta'> <div
<div title={
title={ viewType === 'ALL'
viewType === 'ALL' ? storageName
? storageName : viewType === 'STORAGE' ? folderName : null
: viewType === 'STORAGE' ? folderName : null }
} styleName='item-middle-app-meta-label'
styleName='item-middle-app-meta-label' >
> {viewType === 'ALL' && storageName}
{viewType === 'ALL' && storageName} {viewType === 'STORAGE' && folderName}
{viewType === 'STORAGE' && folderName}
</div>
</div> </div>
</div>} </div>
</div>
<div styleName='item-bottom'> <div styleName='item-bottom'>
<div styleName='item-bottom-tagList'> <div styleName='item-bottom-tagList'>
{note.tags.length > 0 {note.tags.length > 0

View File

@@ -368,13 +368,13 @@ body[data-theme="monokai"]
.item-title .item-title
.item-title-icon .item-title-icon
.item-bottom-time .item-bottom-time
color $ui-monokai-text-color color $ui-monokai-active-color
.item-bottom-tagList-item .item-bottom-tagList-item
background-color alpha(white, 10%) background-color alpha(white, 10%)
color $ui-monokai-text-color color $ui-monokai-text-color
&:hover &:hover
// background-color alpha($ui-monokai-button--active-backgroundColor, 60%) // background-color alpha($ui-monokai-button--active-backgroundColor, 60%)
color #c0392b color #f92672
.item-bottom-tagList-item .item-bottom-tagList-item
background-color alpha(#fff, 20%) background-color alpha(#fff, 20%)

View File

@@ -240,7 +240,7 @@ body[data-theme="monokai"]
.item-simple-title-icon .item-simple-title-icon
.item-simple-bottom-time .item-simple-bottom-time
transition 0.15s transition 0.15s
color $ui-solarized-dark-text-color color $ui-monokai-text-color
.item-simple-bottom-tagList-item .item-simple-bottom-tagList-item
transition 0.15s transition 0.15s
background-color alpha(#fff, 20%) background-color alpha(#fff, 20%)

View File

@@ -39,7 +39,7 @@ body[data-theme="dark"]
.percentageText .percentageText
color $ui-dark-text-color color $ui-dark-text-color
body[data-theme="solarized-dark"] body[data-theme="solarized-dark"]
.percentageBar .percentageBar
background-color #002b36 background-color #002b36
@@ -52,10 +52,10 @@ body[data-theme="solarized-dark"]
body[data-theme="monokai"] body[data-theme="monokai"]
.percentageBar .percentageBar
background-color #f92672 background-color: $ui-monokai-borderColor
.progressBar .progressBar
background-color: #373831 background-color $ui-monokai-active-color
.percentageText .percentageText
color #fdf6e3 color $ui-monokai-text-color

View File

@@ -206,11 +206,11 @@ code
text-decoration none text-decoration none
margin-right 2px margin-right 2px
pre pre
padding 0.5em !important padding 0.5rem !important
border solid 1px #D1D1D1 border solid 1px #D1D1D1
border-radius 5px border-radius 5px
overflow-x auto overflow-x auto
margin 0 0 1em margin 0 0 1rem
display flex display flex
line-height 1.4em line-height 1.4em
code code
@@ -226,8 +226,8 @@ pre
flex 1 flex 1
overflow-x auto overflow-x auto
&>span.filename &>span.filename
margin -8px 100% 8px -8px margin -0.5rem 100% 0.5rem -0.5rem
padding 2px 6px padding 0.125rem 0.375rem
background-color #777; background-color #777;
color white color white
&:empty &:empty
@@ -235,8 +235,8 @@ pre
&>span.lineNumber &>span.lineNumber
display none display none
font-size 1em font-size 1em
padding 0.5em 0 padding 0.5rem 0
margin -0.5em 0.5em -0.5em -0.5em margin -0.5rem 0.5rem -0.5rem -0.5rem
border-right 1px solid border-right 1px solid
text-align right text-align right
border-top-left-radius 4px border-top-left-radius 4px

View File

@@ -35,7 +35,6 @@ function render (element, content, theme) {
element.innerHTML = svgGraph element.innerHTML = svgGraph
}) })
} catch (e) { } catch (e) {
console.error(e)
element.className = 'mermaid-error' element.className = 'mermaid-error'
element.innerHTML = 'mermaid diagram parse error: ' + e.message element.innerHTML = 'mermaid diagram parse error: ' + e.message
} }

View File

@@ -3,6 +3,17 @@ export function findNoteTitle (value) {
let title = null let title = null
let isInsideCodeBlock = false let isInsideCodeBlock = false
if (splitted[0] === '---') {
let line = 0
while (++line < splitted.length) {
if (splitted[line] === '---') {
splitted.splice(0, line + 1)
break
}
}
}
splitted.some((line, index) => { splitted.some((line, index) => {
const trimmedLine = line.trim() const trimmedLine = line.trim()
const trimmedNextLine = splitted[index + 1] === undefined ? '' : splitted[index + 1].trim() const trimmedNextLine = splitted[index + 1] === undefined ? '' : splitted[index + 1].trim()

View File

@@ -66,7 +66,7 @@ module.exports = function (md, renderers, defaultRenderer) {
const parameters = {} const parameters = {}
let langType = '' let langType = ''
let fileName = '' let fileName = ''
let firstLineNumber = 0 let firstLineNumber = 1
let match = paramsRE.exec(params) let match = paramsRE.exec(params)
if (match) { if (match) {
@@ -122,7 +122,7 @@ module.exports = function (md, renderers, defaultRenderer) {
alt: ['paragraph', 'reference', 'blockquote', 'list'] alt: ['paragraph', 'reference', 'blockquote', 'list']
}) })
for (let name in renderers) { for (const name in renderers) {
md.renderer.rules[`${name}_fence`] = (tokens, index) => renderers[name](tokens[index]) md.renderer.rules[`${name}_fence`] = (tokens, index) => renderers[name](tokens[index])
} }

View File

@@ -0,0 +1,24 @@
'use strict'
module.exports = function frontMatterPlugin (md) {
function frontmatter (state, startLine, endLine, silent) {
if (startLine !== 0 || state.src.substr(startLine, state.eMarks[0]) !== '---') {
return false
}
let line = 0
while (++line < state.lineMax) {
if (state.src.substring(state.bMarks[line], state.eMarks[line]) === '---') {
state.line = line + 1
return true
}
}
return false
}
md.block.ruler.before('table', 'frontmatter', frontmatter, {
alt: [ 'paragraph', 'reference', 'blockquote', 'list' ]
})
}

View File

@@ -14,7 +14,7 @@ module.exports = function sanitizePlugin (md, options) {
options options
) )
} }
if (state.tokens[tokenIdx].type === 'fence') { if (state.tokens[tokenIdx].type === '_fence') {
// escapeHtmlCharacters has better performance // escapeHtmlCharacters has better performance
state.tokens[tokenIdx].content = escapeHtmlCharacters( state.tokens[tokenIdx].content = escapeHtmlCharacters(
state.tokens[tokenIdx].content, state.tokens[tokenIdx].content,

View File

@@ -0,0 +1,100 @@
/**
* @fileoverview Markdown table of contents generator
*/
import toc from 'markdown-toc'
import diacritics from 'diacritics-map'
import stripColor from 'strip-color'
const EOL = require('os').EOL
/**
* @caseSensitiveSlugify Custom slugify function
* Same implementation that the original used by markdown-toc (node_modules/markdown-toc/lib/utils.js),
* but keeps original case to properly handle https://github.com/BoostIO/Boostnote/issues/2067
*/
function caseSensitiveSlugify (str) {
function replaceDiacritics (str) {
return str.replace(/[À-ž]/g, function (ch) {
return diacritics[ch] || ch
})
}
function getTitle (str) {
if (/^\[[^\]]+\]\(/.test(str)) {
var m = /^\[([^\]]+)\]/.exec(str)
if (m) return m[1]
}
return str
}
str = getTitle(str)
str = stripColor(str)
// str = str.toLowerCase() //let's be case sensitive
// `.split()` is often (but not always) faster than `.replace()`
str = str.split(' ').join('-')
str = str.split(/\t/).join('--')
str = str.split(/<\/?[^>]+>/).join('')
str = str.split(/[|$&`~=\\\/@+*!?({[\]})<>=.,;:'"^]/).join('')
str = str.split(/[。?!,、;:“”【】()〔〕[]﹃﹄“ ”‘’﹁﹂—…-~《》〈〉「」]/).join('')
str = replaceDiacritics(str)
return str
}
const TOC_MARKER_START = '<!-- toc -->'
const TOC_MARKER_END = '<!-- tocstop -->'
/**
* Takes care of proper updating given editor with TOC.
* If TOC doesn't exit in the editor, it's inserted at current caret position.
* Otherwise,TOC is updated in place.
* @param editor CodeMirror editor to be updated with TOC
*/
export function generateInEditor (editor) {
const tocRegex = new RegExp(`${TOC_MARKER_START}[\\s\\S]*?${TOC_MARKER_END}`)
function tocExistsInEditor () {
return tocRegex.test(editor.getValue())
}
function updateExistingToc () {
const toc = generate(editor.getValue())
const search = editor.getSearchCursor(tocRegex)
while (search.findNext()) {
search.replace(toc)
}
}
function addTocAtCursorPosition () {
const toc = generate(editor.getRange(editor.getCursor(), {line: Infinity}))
editor.replaceRange(wrapTocWithEol(toc, editor), editor.getCursor())
}
if (tocExistsInEditor()) {
updateExistingToc()
} else {
addTocAtCursorPosition()
}
}
/**
* Generates MD TOC based on MD document passed as string.
* @param markdownText MD document
* @returns generatedTOC String containing generated TOC
*/
export function generate (markdownText) {
const generatedToc = toc(markdownText, {slugify: caseSensitiveSlugify})
return TOC_MARKER_START + EOL + EOL + generatedToc.content + EOL + EOL + TOC_MARKER_END
}
function wrapTocWithEol (toc, editor) {
const leftWrap = editor.getCursor().ch === 0 ? '' : EOL
const rightWrap = editor.getLine(editor.getCursor().line).length === editor.getCursor().ch ? '' : EOL
return leftWrap + toc + rightWrap
}
export default {
generate,
generateInEditor
}

View File

@@ -122,7 +122,9 @@ class Markdown {
} }
}) })
this.md.use(require('markdown-it-kbd')) this.md.use(require('markdown-it-kbd'))
this.md.use(require('markdown-it-admonition'))
this.md.use(require('markdown-it-admonition'), {types: ['note', 'hint', 'attention', 'caution', 'danger', 'error']})
this.md.use(require('./markdown-it-frontmatter'))
this.md.use(require('./markdown-it-fence'), { this.md.use(require('./markdown-it-fence'), {
chart: token => { chart: token => {
@@ -130,31 +132,31 @@ class Markdown {
token.parameters.format = 'yaml' token.parameters.format = 'yaml'
} }
return `<pre class="fence"> return `<pre class="fence" data-line="${token.map[0]}">
<span class="filename">${token.fileName}</span> <span class="filename">${token.fileName}</span>
<div class="chart" data-height="${token.parameters.height}" data-format="${token.parameters.format || 'json'}">${token.content}</div> <div class="chart" data-height="${token.parameters.height}" data-format="${token.parameters.format || 'json'}">${token.content}</div>
</pre>` </pre>`
}, },
flowchart: token => { flowchart: token => {
return `<pre class="fence"> return `<pre class="fence" data-line="${token.map[0]}">
<span class="filename">${token.fileName}</span> <span class="filename">${token.fileName}</span>
<div class="flowchart" data-height="${token.parameters.height}">${token.content}</div> <div class="flowchart" data-height="${token.parameters.height}">${token.content}</div>
</pre>` </pre>`
}, },
mermaid: token => { mermaid: token => {
return `<pre class="fence"> return `<pre class="fence" data-line="${token.map[0]}">
<span class="filename">${token.fileName}</span> <span class="filename">${token.fileName}</span>
<div class="mermaid" data-height="${token.parameters.height}">${token.content}</div> <div class="mermaid" data-height="${token.parameters.height}">${token.content}</div>
</pre>` </pre>`
}, },
sequence: token => { sequence: token => {
return `<pre class="fence"> return `<pre class="fence" data-line="${token.map[0]}">
<span class="filename">${token.fileName}</span> <span class="filename">${token.fileName}</span>
<div class="sequence" data-height="${token.parameters.height}">${token.content}</div> <div class="sequence" data-height="${token.parameters.height}">${token.content}</div>
</pre>` </pre>`
} }
}, token => { }, token => {
return `<pre class="code CodeMirror"> return `<pre class="code CodeMirror" data-line="${token.map[0]}">
<span class="filename">${token.fileName}</span> <span class="filename">${token.fileName}</span>
${createGutter(token.content, token.firstLineNumber)} ${createGutter(token.content, token.firstLineNumber)}
<code class="${token.langType}">${token.content}</code> <code class="${token.langType}">${token.content}</code>

62
browser/lib/newNote.js Normal file
View File

@@ -0,0 +1,62 @@
import { hashHistory } from 'react-router'
import dataApi from 'browser/main/lib/dataApi'
import ee from 'browser/main/lib/eventEmitter'
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
export function createMarkdownNote (storage, folder, dispatch, location) {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_MARKDOWN')
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_ALLNOTE')
return dataApi
.createNote(storage, {
type: 'MARKDOWN_NOTE',
folder: folder,
title: '',
content: ''
})
.then(note => {
const noteHash = note.key
dispatch({
type: 'UPDATE_NOTE',
note: note
})
hashHistory.push({
pathname: location.pathname,
query: { key: noteHash }
})
ee.emit('list:jump', noteHash)
ee.emit('detail:focus')
})
}
export function createSnippetNote (storage, folder, dispatch, location, config) {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_SNIPPET')
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_ALLNOTE')
return dataApi
.createNote(storage, {
type: 'SNIPPET_NOTE',
folder: folder,
title: '',
description: '',
snippets: [
{
name: '',
mode: config.editor.snippetDefaultLanguage || 'text',
content: ''
}
]
})
.then(note => {
const noteHash = note.key
dispatch({
type: 'UPDATE_NOTE',
note: note
})
hashHistory.push({
pathname: location.pathname,
query: { key: noteHash }
})
ee.emit('list:jump', noteHash)
ee.emit('detail:focus')
})
}

View File

@@ -29,6 +29,7 @@ import { formatDate } from 'browser/lib/date-formatter'
import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus' import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus'
import striptags from 'striptags' import striptags from 'striptags'
import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote'
import markdownToc from 'browser/lib/markdown-toc-generator'
class MarkdownNoteDetail extends React.Component { class MarkdownNoteDetail extends React.Component {
constructor (props) { constructor (props) {
@@ -47,6 +48,7 @@ class MarkdownNoteDetail extends React.Component {
this.dispatchTimer = null this.dispatchTimer = null
this.toggleLockButton = this.handleToggleLockButton.bind(this) this.toggleLockButton = this.handleToggleLockButton.bind(this)
this.generateToc = () => this.handleGenerateToc()
} }
focus () { focus () {
@@ -59,6 +61,7 @@ class MarkdownNoteDetail extends React.Component {
const reversedType = this.state.editorType === 'SPLIT' ? 'EDITOR_PREVIEW' : 'SPLIT' const reversedType = this.state.editorType === 'SPLIT' ? 'EDITOR_PREVIEW' : 'SPLIT'
this.handleSwitchMode(reversedType) this.handleSwitchMode(reversedType)
}) })
ee.on('code:generate-toc', this.generateToc)
} }
componentWillReceiveProps (nextProps) { componentWillReceiveProps (nextProps) {
@@ -75,6 +78,7 @@ class MarkdownNoteDetail extends React.Component {
componentWillUnmount () { componentWillUnmount () {
ee.off('topbar:togglelockbutton', this.toggleLockButton) ee.off('topbar:togglelockbutton', this.toggleLockButton)
ee.off('code:generate-toc', this.generateToc)
if (this.saveQueue != null) this.saveNow() if (this.saveQueue != null) this.saveNow()
} }
@@ -262,6 +266,11 @@ class MarkdownNoteDetail extends React.Component {
} }
} }
handleGenerateToc () {
const editor = this.refs.content.refs.code.editor
markdownToc.generateInEditor(editor)
}
handleFocus (e) { handleFocus (e) {
this.focus() this.focus()
} }
@@ -363,6 +372,7 @@ class MarkdownNoteDetail extends React.Component {
<TagSelect <TagSelect
ref='tags' ref='tags'
value={this.state.note.tags} value={this.state.note.tags}
data={data}
onChange={this.handleUpdateTag.bind(this)} onChange={this.handleUpdateTag.bind(this)}
/> />
<TodoListPercentage percentageOfTodo={getTodoPercentageOfCompleted(note.content)} /> <TodoListPercentage percentageOfTodo={getTodoPercentageOfCompleted(note.content)} />

View File

@@ -13,6 +13,7 @@ $info-margin-under-border = 30px
display flex display flex
align-items center align-items center
padding 0 20px padding 0 20px
z-index 99
.info-left .info-left
padding 0 10px padding 0 10px

View File

@@ -29,6 +29,7 @@ import InfoPanelTrashed from './InfoPanelTrashed'
import { formatDate } from 'browser/lib/date-formatter' import { formatDate } from 'browser/lib/date-formatter'
import i18n from 'browser/lib/i18n' import i18n from 'browser/lib/i18n'
import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote'
import markdownToc from 'browser/lib/markdown-toc-generator'
const electron = require('electron') const electron = require('electron')
const { remote } = electron const { remote } = electron
@@ -52,6 +53,7 @@ class SnippetNoteDetail extends React.Component {
} }
this.scrollToNextTabThreshold = 0.7 this.scrollToNextTabThreshold = 0.7
this.generateToc = () => this.handleGenerateToc()
} }
componentDidMount () { componentDidMount () {
@@ -65,6 +67,7 @@ class SnippetNoteDetail extends React.Component {
enableLeftArrow: allTabs.offsetLeft !== 0 enableLeftArrow: allTabs.offsetLeft !== 0
}) })
} }
ee.on('code:generate-toc', this.generateToc)
} }
componentWillReceiveProps (nextProps) { componentWillReceiveProps (nextProps) {
@@ -91,6 +94,16 @@ class SnippetNoteDetail extends React.Component {
componentWillUnmount () { componentWillUnmount () {
if (this.saveQueue != null) this.saveNow() if (this.saveQueue != null) this.saveNow()
ee.off('code:generate-toc', this.generateToc)
}
handleGenerateToc () {
const { note, snippetIndex } = this.state
const currentMode = note.snippets[snippetIndex].mode
if (currentMode.includes('Markdown')) {
const currentEditor = this.refs[`code-${snippetIndex}`].refs.code.editor
markdownToc.generateInEditor(currentEditor)
}
} }
handleChange (e) { handleChange (e) {
@@ -441,7 +454,7 @@ class SnippetNoteDetail extends React.Component {
const isSuper = global.process.platform === 'darwin' const isSuper = global.process.platform === 'darwin'
? e.metaKey ? e.metaKey
: e.ctrlKey : e.ctrlKey
if (isSuper && !e.shiftKey) { if (isSuper && !e.shiftKey && !e.altKey) {
e.preventDefault() e.preventDefault()
this.addSnippet() this.addSnippet()
} }
@@ -746,6 +759,7 @@ class SnippetNoteDetail extends React.Component {
<TagSelect <TagSelect
ref='tags' ref='tags'
value={this.state.note.tags} value={this.state.note.tags}
data={data}
onChange={(e) => this.handleChange(e)} onChange={(e) => this.handleChange(e)}
/> />
</div> </div>

View File

@@ -6,71 +6,33 @@ import _ from 'lodash'
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
import i18n from 'browser/lib/i18n' import i18n from 'browser/lib/i18n'
import ee from 'browser/main/lib/eventEmitter' import ee from 'browser/main/lib/eventEmitter'
import Autosuggest from 'react-autosuggest'
class TagSelect extends React.Component { class TagSelect extends React.Component {
constructor (props) { constructor (props) {
super(props) super(props)
this.state = { this.state = {
newTag: '' newTag: '',
suggestions: []
} }
this.addtagHandler = this.handleAddTag.bind(this)
this.handleAddTag = this.handleAddTag.bind(this)
this.onInputBlur = this.onInputBlur.bind(this)
this.onInputChange = this.onInputChange.bind(this)
this.onInputKeyDown = this.onInputKeyDown.bind(this)
this.onSuggestionsClearRequested = this.onSuggestionsClearRequested.bind(this)
this.onSuggestionsFetchRequested = this.onSuggestionsFetchRequested.bind(this)
this.onSuggestionSelected = this.onSuggestionSelected.bind(this)
} }
componentDidMount () { addNewTag (newTag) {
this.value = this.props.value
ee.on('editor:add-tag', this.addtagHandler)
}
componentDidUpdate () {
this.value = this.props.value
}
componentWillUnmount () {
ee.off('editor:add-tag', this.addtagHandler)
}
handleAddTag () {
this.refs.newTag.focus()
}
handleNewTagInputKeyDown (e) {
switch (e.keyCode) {
case 9:
e.preventDefault()
this.submitTag()
break
case 13:
this.submitTag()
break
case 8:
if (this.refs.newTag.value.length === 0) {
this.removeLastTag()
}
}
}
handleNewTagBlur (e) {
this.submitTag()
}
removeLastTag () {
this.removeTagByCallback((value) => {
value.pop()
})
}
reset () {
this.setState({
newTag: ''
})
}
submitTag () {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_TAG') AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_TAG')
let { value } = this.props
let newTag = this.refs.newTag.value.trim().replace(/ +/g, '_') newTag = newTag.trim().replace(/ +/g, '_')
newTag = newTag.charAt(0) === '#' ? newTag.substring(1) : newTag if (newTag.charAt(0) === '#') {
newTag.substring(1)
}
if (newTag.length <= 0) { if (newTag.length <= 0) {
this.setState({ this.setState({
@@ -79,6 +41,7 @@ class TagSelect extends React.Component {
return return
} }
let { value } = this.props
value = _.isArray(value) value = _.isArray(value)
? value.slice() ? value.slice()
: [] : []
@@ -93,10 +56,41 @@ class TagSelect extends React.Component {
}) })
} }
handleNewTagInputChange (e) { buildSuggestions () {
this.setState({ this.suggestions = _.sortBy(this.props.data.tagNoteMap.map(
newTag: this.refs.newTag.value (tag, name) => ({
}) name,
nameLC: name.toLowerCase(),
size: tag.size
})
).filter(
tag => tag.size > 0
), ['name'])
}
componentDidMount () {
this.value = this.props.value
this.buildSuggestions()
ee.on('editor:add-tag', this.handleAddTag)
}
componentDidUpdate () {
this.value = this.props.value
}
componentWillUnmount () {
ee.off('editor:add-tag', this.handleAddTag)
}
handleAddTag () {
this.refs.newTag.input.focus()
}
handleTagLabelClick (tag) {
const { router } = this.context
router.push(`/tags/${tag}`)
} }
handleTagRemoveButtonClick (tag) { handleTagRemoveButtonClick (tag) {
@@ -105,6 +99,60 @@ class TagSelect extends React.Component {
}, tag) }, tag)
} }
onInputBlur (e) {
this.submitNewTag()
}
onInputChange (e, { newValue, method }) {
this.setState({
newTag: newValue
})
}
onInputKeyDown (e) {
switch (e.keyCode) {
case 9:
e.preventDefault()
this.submitNewTag()
break
case 13:
this.submitNewTag()
break
case 8:
if (this.state.newTag.length === 0) {
this.removeLastTag()
}
}
}
onSuggestionsClearRequested () {
this.setState({
suggestions: []
})
}
onSuggestionsFetchRequested ({ value }) {
const valueLC = value.toLowerCase()
const suggestions = _.filter(
this.suggestions,
tag => !_.includes(this.value, tag.name) && tag.nameLC.indexOf(valueLC) !== -1
)
this.setState({
suggestions
})
}
onSuggestionSelected (event, { suggestion, suggestionValue }) {
this.addNewTag(suggestionValue)
}
removeLastTag () {
this.removeTagByCallback((value) => {
value.pop()
})
}
removeTagByCallback (callback, tag = null) { removeTagByCallback (callback, tag = null) {
let { value } = this.props let { value } = this.props
@@ -118,6 +166,18 @@ class TagSelect extends React.Component {
this.props.onChange() this.props.onChange()
} }
reset () {
this.buildSuggestions()
this.setState({
newTag: ''
})
}
submitNewTag () {
this.addNewTag(this.refs.newTag.input.value)
}
render () { render () {
const { value, className } = this.props const { value, className } = this.props
@@ -127,7 +187,7 @@ class TagSelect extends React.Component {
<span styleName='tag' <span styleName='tag'
key={tag} key={tag}
> >
<span styleName='tag-label'>#{tag}</span> <span styleName='tag-label' onClick={(e) => this.handleTagLabelClick(tag)}>#{tag}</span>
<button styleName='tag-removeButton' <button styleName='tag-removeButton'
onClick={(e) => this.handleTagRemoveButtonClick(tag)} onClick={(e) => this.handleTagRemoveButtonClick(tag)}
> >
@@ -138,6 +198,8 @@ class TagSelect extends React.Component {
}) })
: [] : []
const { newTag, suggestions } = this.state
return ( return (
<div className={_.isString(className) <div className={_.isString(className)
? 'TagSelect ' + className ? 'TagSelect ' + className
@@ -146,24 +208,39 @@ class TagSelect extends React.Component {
styleName='root' styleName='root'
> >
{tagList} {tagList}
<input styleName='newTag' <Autosuggest
ref='newTag' ref='newTag'
value={this.state.newTag} suggestions={suggestions}
placeholder={i18n.__('Add tag...')} onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}
onChange={(e) => this.handleNewTagInputChange(e)} onSuggestionsClearRequested={this.onSuggestionsClearRequested}
onKeyDown={(e) => this.handleNewTagInputKeyDown(e)} onSuggestionSelected={this.onSuggestionSelected}
onBlur={(e) => this.handleNewTagBlur(e)} getSuggestionValue={suggestion => suggestion.name}
renderSuggestion={suggestion => (
<div>
{suggestion.name}
</div>
)}
inputProps={{
placeholder: i18n.__('Add tag...'),
value: newTag,
onChange: this.onInputChange,
onKeyDown: this.onInputKeyDown,
onBlur: this.onInputBlur
}}
/> />
</div> </div>
) )
} }
} }
TagSelect.contextTypes = {
router: PropTypes.shape({})
}
TagSelect.propTypes = { TagSelect.propTypes = {
className: PropTypes.string, className: PropTypes.string,
value: PropTypes.arrayOf(PropTypes.string), value: PropTypes.arrayOf(PropTypes.string),
onChange: PropTypes.func onChange: PropTypes.func
} }
export default CSSModules(TagSelect, styles) export default CSSModules(TagSelect, styles)

View File

@@ -39,16 +39,9 @@
.tag-label .tag-label
font-size 13px font-size 13px
color: $ui-text-color color $ui-text-color
padding 4px 16px 4px 8px padding 4px 16px 4px 8px
cursor pointer
.newTag
box-sizing border-box
border none
background-color transparent
outline none
padding 0 4px
font-size 13px
body[data-theme="dark"] body[data-theme="dark"]
.tag .tag
@@ -62,11 +55,6 @@ body[data-theme="dark"]
.tag-label .tag-label
color $ui-dark-text-color color $ui-dark-text-color
.newTag
border-color none
background-color transparent
color $ui-dark-text-color
body[data-theme="solarized-dark"] body[data-theme="solarized-dark"]
.tag .tag
background-color $ui-solarized-dark-tag-backgroundColor background-color $ui-solarized-dark-tag-backgroundColor
@@ -78,14 +66,9 @@ body[data-theme="solarized-dark"]
.tag-label .tag-label
color $ui-solarized-dark-text-color color $ui-solarized-dark-text-color
.newTag
border-color none
background-color transparent
color $ui-solarized-dark-text-color
body[data-theme="monokai"] body[data-theme="monokai"]
.tag .tag
background-color $ui-monokai-button-backgroundColor background-color $ui-monokai-tag-backgroundColor
.tag-removeButton .tag-removeButton
border-color $ui-button--focus-borderColor border-color $ui-button--focus-borderColor
@@ -93,8 +76,3 @@ body[data-theme="monokai"]
.tag-label .tag-label
color $ui-monokai-text-color color $ui-monokai-text-color
.newTag
border-color none
background-color transparent
color $ui-monokai-text-color

View File

@@ -59,7 +59,7 @@ body[data-theme="solarized-dark"]
body[data-theme="monokai"] body[data-theme="monokai"]
.control-toggleModeButton .control-toggleModeButton
background-color #272822 background-color #373831
.active .active
background-color #1EC38B background-color #f92672
box-shadow 2px 0px 7px #222222 box-shadow 2px 0px 7px #222222

View File

@@ -56,7 +56,7 @@ class Main extends React.Component {
init () { init () {
dataApi dataApi
.addStorage({ .addStorage({
name: 'My Storage', name: 'My Storage Location',
path: path.join(remote.app.getPath('home'), 'Boostnote') path: path.join(remote.app.getPath('home'), 'Boostnote')
}) })
.then(data => { .then(data => {

View File

@@ -7,6 +7,7 @@ import modal from 'browser/main/lib/modal'
import NewNoteModal from 'browser/main/modals/NewNoteModal' import NewNoteModal from 'browser/main/modals/NewNoteModal'
import eventEmitter from 'browser/main/lib/eventEmitter' import eventEmitter from 'browser/main/lib/eventEmitter'
import i18n from 'browser/lib/i18n' import i18n from 'browser/lib/i18n'
import { createMarkdownNote, createSnippetNote } from 'browser/lib/newNote'
const { remote } = require('electron') const { remote } = require('electron')
const { dialog } = remote const { dialog } = remote
@@ -37,13 +38,19 @@ class NewNoteButton extends React.Component {
const { location, dispatch, config } = this.props const { location, dispatch, config } = this.props
const { storage, folder } = this.resolveTargetFolder() const { storage, folder } = this.resolveTargetFolder()
modal.open(NewNoteModal, { if (config.ui.defaultNote === 'MARKDOWN_NOTE') {
storage: storage.key, createMarkdownNote(storage.key, folder.key, dispatch, location)
folder: folder.key, } else if (config.ui.defaultNote === 'SNIPPET_NOTE') {
dispatch, createSnippetNote(storage.key, folder.key, dispatch, location, config)
location, } else {
config modal.open(NewNoteModal, {
}) storage: storage.key,
folder: folder.key,
dispatch,
location,
config
})
}
} }
resolveTargetFolder () { resolveTargetFolder () {

View File

@@ -80,6 +80,7 @@ class NoteList extends React.Component {
this.getViewType = this.getViewType.bind(this) this.getViewType = this.getViewType.bind(this)
this.restoreNote = this.restoreNote.bind(this) this.restoreNote = this.restoreNote.bind(this)
this.copyNoteLink = this.copyNoteLink.bind(this) this.copyNoteLink = this.copyNoteLink.bind(this)
this.navigate = this.navigate.bind(this)
// TODO: not Selected noteKeys but SelectedNote(for reusing) // TODO: not Selected noteKeys but SelectedNote(for reusing)
this.state = { this.state = {
@@ -98,6 +99,7 @@ class NoteList extends React.Component {
ee.on('list:isMarkdownNote', this.alertIfSnippetHandler) ee.on('list:isMarkdownNote', this.alertIfSnippetHandler)
ee.on('import:file', this.importFromFileHandler) ee.on('import:file', this.importFromFileHandler)
ee.on('list:jump', this.jumpNoteByHash) ee.on('list:jump', this.jumpNoteByHash)
ee.on('list:navigate', this.navigate)
} }
componentWillReceiveProps (nextProps) { componentWillReceiveProps (nextProps) {
@@ -517,7 +519,7 @@ class NoteList extends React.Component {
click: this.cloneNote.bind(this) click: this.cloneNote.bind(this)
}, { }, {
label: copyNoteLink, label: copyNoteLink,
click: this.copyNoteLink(note) click: this.copyNoteLink.bind(this, note)
}) })
if (note.type === 'MARKDOWN_NOTE') { if (note.type === 'MARKDOWN_NOTE') {
if (note.blog && note.blog.blogLink && note.blog.blogId) { if (note.blog && note.blog.blogLink && note.blog.blogId) {
@@ -687,6 +689,16 @@ class NoteList extends React.Component {
return copy(noteLink) return copy(noteLink)
} }
navigate (sender, pathname) {
const { router } = this.context
router.push({
pathname,
query: {
// key: noteKey
}
})
}
save (note) { save (note) {
const { dispatch } = this.props const { dispatch } = this.props
dataApi dataApi

View File

@@ -38,6 +38,22 @@ class StorageItem extends React.Component {
{ {
type: 'separator' type: 'separator'
}, },
{
label: i18n.__('Export Storage'),
submenu: [
{
label: i18n.__('Export as txt'),
click: (e) => this.handleExportStorageClick(e, 'txt')
},
{
label: i18n.__('Export as md'),
click: (e) => this.handleExportStorageClick(e, 'md')
}
]
},
{
type: 'separator'
},
{ {
label: i18n.__('Unlink Storage'), label: i18n.__('Unlink Storage'),
click: (e) => this.handleUnlinkStorageClick(e) click: (e) => this.handleUnlinkStorageClick(e)
@@ -68,6 +84,30 @@ class StorageItem extends React.Component {
} }
} }
handleExportStorageClick (e, fileType) {
const options = {
properties: ['openDirectory', 'createDirectory'],
buttonLabel: i18n.__('Select directory'),
title: i18n.__('Select a folder to export the files to'),
multiSelections: false
}
dialog.showOpenDialog(remote.getCurrentWindow(), options,
(paths) => {
if (paths && paths.length === 1) {
const { storage, dispatch } = this.props
dataApi
.exportStorage(storage.key, fileType, paths[0])
.then(data => {
dispatch({
type: 'EXPORT_STORAGE',
storage: data.storage,
fileType: data.fileType
})
})
}
})
}
handleToggleButtonClick (e) { handleToggleButtonClick (e) {
const { storage, dispatch } = this.props const { storage, dispatch } = this.props
const isOpen = !this.state.isOpen const isOpen = !this.state.isOpen

View File

@@ -198,12 +198,12 @@ class SideNav extends React.Component {
const tags = pathSegments[pathSegments.length - 1] const tags = pathSegments[pathSegments.length - 1]
return (tags === 'alltags') return (tags === 'alltags')
? [] ? []
: tags.split(' ') : tags.split(' ').map(tag => decodeURIComponent(tag))
} }
handleClickTagListItem (name) { handleClickTagListItem (name) {
const { router } = this.context const { router } = this.context
router.push(`/tags/${name}`) router.push(`/tags/${encodeURIComponent(name)}`)
} }
handleSortTagsByChange (e) { handleSortTagsByChange (e) {
@@ -230,7 +230,7 @@ class SideNav extends React.Component {
} else { } else {
listOfTags.push(tag) listOfTags.push(tag)
} }
router.push(`/tags/${listOfTags.join(' ')}`) router.push(`/tags/${listOfTags.map(tag => encodeURIComponent(tag)).join(' ')}`)
} }
emptyTrash (entries) { emptyTrash (entries) {

View File

@@ -132,6 +132,15 @@ body[data-theme="dark"]
.CodeMirror-foldgutter-folded:after .CodeMirror-foldgutter-folded:after
content: "\25B8" content: "\25B8"
.CodeMirror-hover
padding 2px 4px 0 4px
position absolute
z-index 99
.CodeMirror-hyperlink
cursor pointer
.sortableItemHelper .sortableItemHelper
z-index modalZIndex + 5 z-index modalZIndex + 5
@@ -156,3 +165,5 @@ body[data-theme="monokai"]
body[data-theme="default"] body[data-theme="default"]
.SideNav ::-webkit-scrollbar-thumb .SideNav ::-webkit-scrollbar-thumb
background-color rgba(255, 255, 255, 0.3) background-color rgba(255, 255, 255, 0.3)
@import '../styles/Detail/TagSelect.styl'

View File

@@ -24,7 +24,7 @@ export const DEFAULT_CONFIG = {
amaEnabled: true, amaEnabled: true,
hotkey: { hotkey: {
toggleMain: OSX ? 'Command + Alt + L' : 'Super + Alt + E', toggleMain: OSX ? 'Command + Alt + L' : 'Super + Alt + E',
toggleMode: OSX ? 'Command + M' : 'Ctrl + M' toggleMode: OSX ? 'Command + Option + M' : 'Ctrl + M'
}, },
ui: { ui: {
language: 'en', language: 'en',
@@ -195,6 +195,7 @@ function rewriteHotkey (config) {
const keys = [...Object.keys(config.hotkey)] const keys = [...Object.keys(config.hotkey)]
keys.forEach(key => { keys.forEach(key => {
config.hotkey[key] = config.hotkey[key].replace(/Cmd/g, 'Command') config.hotkey[key] = config.hotkey[key].replace(/Cmd/g, 'Command')
config.hotkey[key] = config.hotkey[key].replace(/Opt/g, 'Alt')
}) })
return config return config
} }

View File

@@ -11,6 +11,118 @@ import i18n from 'browser/lib/i18n'
const STORAGE_FOLDER_PLACEHOLDER = ':storage' const STORAGE_FOLDER_PLACEHOLDER = ':storage'
const DESTINATION_FOLDER = 'attachments' const DESTINATION_FOLDER = 'attachments'
const PATH_SEPARATORS = escapeStringRegexp(path.posix.sep) + escapeStringRegexp(path.win32.sep) const PATH_SEPARATORS = escapeStringRegexp(path.posix.sep) + escapeStringRegexp(path.win32.sep)
/**
* @description
* Create a Image element to get the real size of image.
* @param {File} file the File object dropped.
* @returns {Promise<Image>} Image element created
*/
function getImage (file) {
return new Promise((resolve) => {
const reader = new FileReader()
const img = new Image()
img.onload = () => resolve(img)
reader.onload = e => {
img.src = e.target.result
}
reader.readAsDataURL(file)
})
}
/**
* @description
* Get the orientation info from iamges's EXIF data.
* case 1: The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.
* case 2: The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side.
* case 3: The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side.
* case 4: The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side.
* case 5: The 0th row is the visual left-hand side of the image, and the 0th column is the visual top.
* case 6: The 0th row is the visual right-hand side of the image, and the 0th column is the visual top.
* case 7: The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom.
* case 8: The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom.
* Other: reserved
* ref: http://sylvana.net/jpegcrop/exif_orientation.html
* @param {File} file the File object dropped.
* @returns {Promise<Number>} Orientation info
*/
function getOrientation (file) {
const getData = arrayBuffer => {
const view = new DataView(arrayBuffer)
// Not start with SOI(Start of image) Marker return fail value
if (view.getUint16(0, false) !== 0xFFD8) return -2
const length = view.byteLength
let offset = 2
while (offset < length) {
const marker = view.getUint16(offset, false)
offset += 2
// Loop and seed for APP1 Marker
if (marker === 0xFFE1) {
// return fail value if it isn't EXIF data
if (view.getUint32(offset += 2, false) !== 0x45786966) {
return -1
}
// Read TIFF header,
// First 2bytes defines byte align of TIFF data.
// If it is 0x4949="II", it means "Intel" type byte align.
// If it is 0x4d4d="MM", it means "Motorola" type byte align
const little = view.getUint16(offset += 6, false) === 0x4949
offset += view.getUint32(offset + 4, little)
const tags = view.getUint16(offset, little) // Get TAG number
offset += 2
for (let i = 0; i < tags; i++) {
// Loop to find Orientation TAG and return the value
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
return view.getUint16(offset + (i * 12) + 8, little)
}
}
} else if ((marker & 0xFF00) !== 0xFF00) { // If not start with 0xFF, not a Marker
break
} else {
offset += view.getUint16(offset, false)
}
}
return -1
}
return new Promise((resolve) => {
const reader = new FileReader()
reader.onload = event => resolve(getData(event.target.result))
reader.readAsArrayBuffer(file.slice(0, 64 * 1024))
})
}
/**
* @description
* Rotate image file to correct direction.
* Create a canvas and draw the image with correct direction, then export to base64 format.
* @param {*} file the File object dropped.
* @return {String} Base64 encoded image.
*/
function fixRotate (file) {
return Promise.all([getImage(file), getOrientation(file)])
.then(([img, orientation]) => {
const canvas = document.createElement('canvas')
const ctx = canvas.getContext('2d')
if (orientation > 4 && orientation < 9) {
canvas.width = img.height
canvas.height = img.width
} else {
canvas.width = img.width
canvas.height = img.height
}
switch (orientation) {
case 2: ctx.transform(-1, 0, 0, 1, img.width, 0); break
case 3: ctx.transform(-1, 0, 0, -1, img.width, img.height); break
case 4: ctx.transform(1, 0, 0, -1, 0, img.height); break
case 5: ctx.transform(0, 1, 1, 0, 0, 0); break
case 6: ctx.transform(0, 1, -1, 0, img.height, 0); break
case 7: ctx.transform(0, -1, -1, 0, img.height, img.width); break
case 8: ctx.transform(0, -1, 1, 0, 0, img.width); break
default: break
}
ctx.drawImage(img, 0, 0)
return canvas.toDataURL()
})
}
/** /**
* @description * @description
@@ -38,26 +150,34 @@ function copyAttachment (sourceFilePath, storageKey, noteKey, useRandomName = tr
} }
try { try {
if (!fs.existsSync(sourceFilePath)) { const isBase64 = typeof sourceFilePath === 'object' && sourceFilePath.type === 'base64'
reject('source file does not exist') if (!fs.existsSync(sourceFilePath) && !isBase64) {
return reject('source file does not exist')
} }
const targetStorage = findStorage.findStorage(storageKey) const targetStorage = findStorage.findStorage(storageKey)
const inputFileStream = fs.createReadStream(sourceFilePath)
let destinationName let destinationName
if (useRandomName) { if (useRandomName) {
destinationName = `${uniqueSlug()}${path.extname(sourceFilePath)}` destinationName = `${uniqueSlug()}${path.extname(sourceFilePath.sourceFilePath || sourceFilePath)}`
} else { } else {
destinationName = path.basename(sourceFilePath) destinationName = path.basename(sourceFilePath.sourceFilePath || sourceFilePath)
} }
const destinationDir = path.join(targetStorage.path, DESTINATION_FOLDER, noteKey) const destinationDir = path.join(targetStorage.path, DESTINATION_FOLDER, noteKey)
createAttachmentDestinationFolder(targetStorage.path, noteKey) createAttachmentDestinationFolder(targetStorage.path, noteKey)
const outputFile = fs.createWriteStream(path.join(destinationDir, destinationName)) const outputFile = fs.createWriteStream(path.join(destinationDir, destinationName))
inputFileStream.pipe(outputFile)
inputFileStream.on('end', () => { if (isBase64) {
resolve(destinationName) const base64Data = sourceFilePath.data.replace(/^data:image\/\w+;base64,/, '')
}) const dataBuffer = new Buffer(base64Data, 'base64')
outputFile.write(dataBuffer, () => {
resolve(destinationName)
})
} else {
const inputFileStream = fs.createReadStream(sourceFilePath)
inputFileStream.pipe(outputFile)
inputFileStream.on('end', () => {
resolve(destinationName)
})
}
} catch (e) { } catch (e) {
return reject(e) return reject(e)
} }
@@ -137,10 +257,17 @@ function handleAttachmentDrop (codeEditor, storageKey, noteKey, dropEvent) {
const filePath = file.path const filePath = file.path
const originalFileName = path.basename(filePath) const originalFileName = path.basename(filePath)
const fileType = file['type'] const fileType = file['type']
const isImage = fileType.startsWith('image')
copyAttachment(filePath, storageKey, noteKey).then((fileName) => { let promise
const showPreview = fileType.startsWith('image') if (isImage) {
const imageMd = generateAttachmentMarkdown(originalFileName, path.join(STORAGE_FOLDER_PLACEHOLDER, noteKey, fileName), showPreview) promise = fixRotate(file).then(base64data => {
return copyAttachment({type: 'base64', data: base64data, sourceFilePath: filePath}, storageKey, noteKey)
})
} else {
promise = copyAttachment(filePath, storageKey, noteKey)
}
promise.then((fileName) => {
const imageMd = generateAttachmentMarkdown(originalFileName, path.join(STORAGE_FOLDER_PLACEHOLDER, noteKey, fileName), isImage)
codeEditor.insertAttachmentMd(imageMd) codeEditor.insertAttachmentMd(imageMd)
}) })
} }

View File

@@ -0,0 +1,63 @@
import { findStorage } from 'browser/lib/findStorage'
import resolveStorageData from './resolveStorageData'
import resolveStorageNotes from './resolveStorageNotes'
import filenamify from 'filenamify'
import * as path from 'path'
import * as fs from 'fs'
/**
* @param {String} storageKey
* @param {String} fileType
* @param {String} exportDir
*
* @return {Object}
* ```
* {
* storage: Object,
* fileType: String,
* exportDir: String
* }
* ```
*/
function exportStorage (storageKey, fileType, exportDir) {
let targetStorage
try {
targetStorage = findStorage(storageKey)
} catch (e) {
return Promise.reject(e)
}
return resolveStorageData(targetStorage)
.then(storage => (
resolveStorageNotes(storage).then(notes => ({storage, notes}))
))
.then(function exportNotes (data) {
const { storage, notes } = data
const folderNamesMapping = {}
storage.folders.forEach(folder => {
const folderExportedDir = path.join(exportDir, filenamify(folder.name, {replacement: '_'}))
folderNamesMapping[folder.key] = folderExportedDir
// make sure directory exists
try {
fs.mkdirSync(folderExportedDir)
} catch (e) {}
})
notes
.filter(note => !note.isTrashed && note.type === 'MARKDOWN_NOTE')
.forEach(markdownNote => {
const folderExportedDir = folderNamesMapping[markdownNote.folder]
const snippetName = `${filenamify(markdownNote.title, {replacement: '_'})}.${fileType}`
const notePath = path.join(folderExportedDir, snippetName)
fs.writeFileSync(notePath, markdownNote.content)
})
return {
storage,
fileType,
exportDir
}
})
}
module.exports = exportStorage

View File

@@ -9,6 +9,7 @@ const dataApi = {
deleteFolder: require('./deleteFolder'), deleteFolder: require('./deleteFolder'),
reorderFolder: require('./reorderFolder'), reorderFolder: require('./reorderFolder'),
exportFolder: require('./exportFolder'), exportFolder: require('./exportFolder'),
exportStorage: require('./exportStorage'),
createNote: require('./createNote'), createNote: require('./createNote'),
updateNote: require('./updateNote'), updateNote: require('./updateNote'),
deleteNote: require('./deleteNote'), deleteNote: require('./deleteNote'),

View File

@@ -1,12 +1,9 @@
import React from 'react' import React from 'react'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import styles from './NewNoteModal.styl' import styles from './NewNoteModal.styl'
import dataApi from 'browser/main/lib/dataApi'
import { hashHistory } from 'react-router'
import ee from 'browser/main/lib/eventEmitter'
import ModalEscButton from 'browser/components/ModalEscButton' import ModalEscButton from 'browser/components/ModalEscButton'
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
import i18n from 'browser/lib/i18n' import i18n from 'browser/lib/i18n'
import { createMarkdownNote, createSnippetNote } from 'browser/lib/newNote'
class NewNoteModal extends React.Component { class NewNoteModal extends React.Component {
constructor (props) { constructor (props) {
@@ -24,31 +21,10 @@ class NewNoteModal extends React.Component {
} }
handleMarkdownNoteButtonClick (e) { handleMarkdownNoteButtonClick (e) {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_MARKDOWN')
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_ALLNOTE')
const { storage, folder, dispatch, location } = this.props const { storage, folder, dispatch, location } = this.props
dataApi createMarkdownNote(storage, folder, dispatch, location).then(() => {
.createNote(storage, { setTimeout(this.props.close, 200)
type: 'MARKDOWN_NOTE', })
folder: folder,
title: '',
content: ''
})
.then(note => {
const noteHash = note.key
dispatch({
type: 'UPDATE_NOTE',
note: note
})
hashHistory.push({
pathname: location.pathname,
query: { key: noteHash }
})
ee.emit('list:jump', noteHash)
ee.emit('detail:focus')
setTimeout(this.props.close, 200)
})
} }
handleMarkdownNoteButtonKeyDown (e) { handleMarkdownNoteButtonKeyDown (e) {
@@ -59,38 +35,10 @@ class NewNoteModal extends React.Component {
} }
handleSnippetNoteButtonClick (e) { handleSnippetNoteButtonClick (e) {
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_SNIPPET')
AwsMobileAnalyticsConfig.recordDynamicCustomEvent('ADD_ALLNOTE')
const { storage, folder, dispatch, location, config } = this.props const { storage, folder, dispatch, location, config } = this.props
createSnippetNote(storage, folder, dispatch, location, config).then(() => {
dataApi setTimeout(this.props.close, 200)
.createNote(storage, { })
type: 'SNIPPET_NOTE',
folder: folder,
title: '',
description: '',
snippets: [
{
name: '',
mode: config.editor.snippetDefaultLanguage || 'text',
content: ''
}
]
})
.then(note => {
const noteHash = note.key
dispatch({
type: 'UPDATE_NOTE',
note: note
})
hashHistory.push({
pathname: location.pathname,
query: { key: noteHash }
})
ee.emit('list:jump', noteHash)
ee.emit('detail:focus')
setTimeout(this.props.close, 200)
})
} }
handleSnippetNoteButtonKeyDown (e) { handleSnippetNoteButtonKeyDown (e) {

View File

@@ -43,7 +43,7 @@ class Blog extends React.Component {
this.handleSettingError = (err) => { this.handleSettingError = (err) => {
this.setState({BlogAlert: { this.setState({BlogAlert: {
type: 'error', type: 'error',
message: err.message != null ? err.message : i18n.__('Error occurs!') message: err.message != null ? err.message : i18n.__('An error occurred!')
}}) }})
} }
this.oldBlog = this.state.config.blog this.oldBlog = this.state.config.blog
@@ -70,7 +70,7 @@ class Blog extends React.Component {
this.props.haveToSave({ this.props.haveToSave({
tab: 'Blog', tab: 'Blog',
type: 'warning', type: 'warning',
message: i18n.__('You have to save!') message: i18n.__('Unsaved Changes!')
}) })
} }
} }

View File

@@ -68,9 +68,9 @@
:global :global
.alert .alert
display inline-block display inline-block
position absolute position fixed
top 60px top 130px
right 15px right 100px
font-size 14px font-size 14px
.success .success
color #1EC38B color #1EC38B
@@ -127,7 +127,7 @@ colorDarkControl()
border-color $ui-dark-borderColor border-color $ui-dark-borderColor
background-color $ui-dark-backgroundColor background-color $ui-dark-backgroundColor
color $ui-dark-text-color color $ui-dark-text-color
colorSolarizedDarkControl() colorSolarizedDarkControl()
border none border none
background-color $ui-solarized-dark-button-backgroundColor background-color $ui-solarized-dark-button-backgroundColor
@@ -165,27 +165,27 @@ body[data-theme="dark"]
.group-section-control .group-section-control
select, .group-section-control-input select, .group-section-control-input
colorDarkControl() colorDarkControl()
body[data-theme="solarized-dark"] body[data-theme="solarized-dark"]
.root .root
color $ui-solarized-dark-text-color color $ui-solarized-dark-text-color
.group-header .group-header
color $ui-solarized-dark-text-color color $ui-solarized-dark-text-color
border-color $ui-solarized-dark-borderColor border-color $ui-solarized-dark-borderColor
.group-header2 .group-header2
color $ui-solarized-dark-text-color color $ui-solarized-dark-text-color
.group-section-control-input .group-section-control-input
border-color $ui-solarized-dark-borderColor border-color $ui-solarized-dark-borderColor
.group-control .group-control
border-color $ui-solarized-dark-borderColor border-color $ui-solarized-dark-borderColor
.group-control-leftButton .group-control-leftButton
colorDarkDefaultButton() colorDarkDefaultButton()
border-color $ui-solarized-dark-borderColor border-color $ui-solarized-dark-borderColor
.group-control-rightButton .group-control-rightButton
colorSolarizedDarkPrimaryButton() colorSolarizedDarkPrimaryButton()
.group-hint .group-hint
@@ -200,19 +200,19 @@ body[data-theme="monokai"]
.group-header .group-header
color $ui-monokai-text-color color $ui-monokai-text-color
border-color $ui-monokai-borderColor border-color $ui-monokai-borderColor
.group-header2 .group-header2
color $ui-monokai-text-color color $ui-monokai-text-color
.group-section-control-input .group-section-control-input
border-color $ui-monokai-borderColor border-color $ui-monokai-borderColor
.group-control .group-control
border-color $ui-monokai-borderColor border-color $ui-monokai-borderColor
.group-control-leftButton .group-control-leftButton
colorDarkDefaultButton() colorDarkDefaultButton()
border-color $ui-monokai-borderColor border-color $ui-monokai-borderColor
.group-control-rightButton .group-control-rightButton
colorMonokaiPrimaryButton() colorMonokaiPrimaryButton()
.group-hint .group-hint

View File

@@ -23,18 +23,18 @@ class Crowdfunding extends React.Component {
return ( return (
<div styleName='root'> <div styleName='root'>
<div styleName='header'>{i18n.__('Crowdfunding')}</div> <div styleName='header'>{i18n.__('Crowdfunding')}</div>
<p>{i18n.__('Dear everyone,')}</p> <p>{i18n.__('Dear Boostnote users,')}</p>
<br /> <br />
<p>{i18n.__('Thank you for using Boostnote!')}</p> <p>{i18n.__('Thank you for using Boostnote!')}</p>
<p>{i18n.__('Boostnote is used in about 200 different countries and regions by an awesome community of developers.')}</p> <p>{i18n.__('Boostnote is used in about 200 different countries and regions by an awesome community of developers.')}</p>
<br /> <br />
<p>{i18n.__('To continue supporting this growth, and to satisfy community expectations,')}</p> <p>{i18n.__('To support our growing userbase, and satisfy community expectations,')}</p>
<p>{i18n.__('we would like to invest more time and resources in this project.')}</p> <p>{i18n.__('we would like to invest more time and resources in this project.')}</p>
<br /> <br />
<p>{i18n.__('If you like this project and see its potential, you can help by supporting us on OpenCollective!')}</p> <p>{i18n.__('If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!')}</p>
<br /> <br />
<p>{i18n.__('Thanks,')}</p> <p>{i18n.__('Thanks,')}</p>
<p>{i18n.__('Boostnote maintainers')}</p> <p>{i18n.__('The Boostnote Team')}</p>
<br /> <br />
<button styleName='cf-link'> <button styleName='cf-link'>
<a href='https://opencollective.com/boostnoteio' onClick={(e) => this.handleLinkClick(e)}>{i18n.__('Support via OpenCollective')}</a> <a href='https://opencollective.com/boostnoteio' onClick={(e) => this.handleLinkClick(e)}>{i18n.__('Support via OpenCollective')}</a>

View File

@@ -2,6 +2,7 @@
height 35px height 35px
box-sizing border-box box-sizing border-box
padding 2.5px 15px padding 2.5px 15px
display flex
&:hover &:hover
background-color darken(white, 3%) background-color darken(white, 3%)
@@ -18,7 +19,10 @@
border-left solid 2px transparent border-left solid 2px transparent
padding 0 10px padding 0 10px
line-height 30px line-height 30px
float left flex 1
white-space nowrap
text-overflow ellipsis
overflow hidden
.folderItem-left-danger .folderItem-left-danger
color $danger-color color $danger-color
font-weight bold font-weight bold
@@ -52,7 +56,8 @@
outline none outline none
.folderItem-right .folderItem-right
float right -webkit-box-flex: 1
white-space nowrap
.folderItem-right-button .folderItem-right-button
vertical-align middle vertical-align middle

View File

@@ -30,7 +30,7 @@ class HotkeyTab extends React.Component {
this.handleSettingError = (err) => { this.handleSettingError = (err) => {
this.setState({keymapAlert: { this.setState({keymapAlert: {
type: 'error', type: 'error',
message: err.message != null ? err.message : i18n.__('Error occurs!') message: err.message != null ? err.message : i18n.__('An error occurred!')
}}) }})
} }
this.oldHotkey = this.state.config.hotkey this.oldHotkey = this.state.config.hotkey
@@ -79,7 +79,7 @@ class HotkeyTab extends React.Component {
this.props.haveToSave({ this.props.haveToSave({
tab: 'Hotkey', tab: 'Hotkey',
type: 'warning', type: 'warning',
message: i18n.__('You have to save!') message: i18n.__('Unsaved Changes!')
}) })
} }
} }
@@ -117,7 +117,7 @@ class HotkeyTab extends React.Component {
</div> </div>
</div> </div>
<div styleName='group-section'> <div styleName='group-section'>
<div styleName='group-section-label'>{i18n.__('Toggle editor mode')}</div> <div styleName='group-section-label'>{i18n.__('Toggle Editor Mode')}</div>
<div styleName='group-section-control'> <div styleName='group-section-control'>
<input styleName='group-section-control-input' <input styleName='group-section-control-input'
onChange={(e) => this.handleHotkeyChange(e)} onChange={(e) => this.handleHotkeyChange(e)}

View File

@@ -9,13 +9,17 @@
box-sizing border-box box-sizing border-box
border-bottom $default-border border-bottom $default-border
margin-bottom 5px margin-bottom 5px
display flex
.header-label .header-label
float left
cursor pointer cursor pointer
&:hover &:hover
.header-label-editButton .header-label-editButton
opacity 1 opacity 1
flex 1
white-space nowrap
text-overflow ellipsis
overflow hidden
.header-label-path .header-label-path
color $ui-inactive-text-color color $ui-inactive-text-color
@@ -38,8 +42,8 @@
outline none outline none
.header-control .header-control
float right -webkit-box-flex: 1
white-space nowrap
.header-control-button .header-control-button
width 30px width 30px
height 25px height 25px

View File

@@ -70,7 +70,7 @@ class StoragesTab extends React.Component {
}) })
return ( return (
<div styleName='list'> <div styleName='list'>
<div styleName='header'>{i18n.__('Storages')}</div> <div styleName='header'>{i18n.__('Storage Locations')}</div>
{storageList.length > 0 {storageList.length > 0
? storageList ? storageList
: <div styleName='list-empty'>{i18n.__('No storage found.')}</div> : <div styleName='list-empty'>{i18n.__('No storage found.')}</div>

View File

@@ -40,7 +40,7 @@ class UiTab extends React.Component {
this.handleSettingError = (err) => { this.handleSettingError = (err) => {
this.setState({UiAlert: { this.setState({UiAlert: {
type: 'error', type: 'error',
message: err.message != null ? err.message : i18n.__('Error occurs!') message: err.message != null ? err.message : i18n.__('An error occurred!')
}}) }})
} }
ipc.addListener('APP_SETTING_DONE', this.handleSettingDone) ipc.addListener('APP_SETTING_DONE', this.handleSettingDone)
@@ -67,6 +67,7 @@ class UiTab extends React.Component {
ui: { ui: {
theme: this.refs.uiTheme.value, theme: this.refs.uiTheme.value,
language: this.refs.uiLanguage.value, language: this.refs.uiLanguage.value,
defaultNote: this.refs.defaultNote.value,
showCopyNotification: this.refs.showCopyNotification.checked, showCopyNotification: this.refs.showCopyNotification.checked,
confirmDeletion: this.refs.confirmDeletion.checked, confirmDeletion: this.refs.confirmDeletion.checked,
showOnlyRelatedTags: this.refs.showOnlyRelatedTags.checked, showOnlyRelatedTags: this.refs.showOnlyRelatedTags.checked,
@@ -124,7 +125,7 @@ class UiTab extends React.Component {
this.props.haveToSave({ this.props.haveToSave({
tab: 'UI', tab: 'UI',
type: 'warning', type: 'warning',
message: i18n.__('You have to save!') message: i18n.__('Unsaved Changes!')
}) })
} }
}) })
@@ -174,7 +175,9 @@ class UiTab extends React.Component {
<div styleName='group-header'>{i18n.__('Interface')}</div> <div styleName='group-header'>{i18n.__('Interface')}</div>
<div styleName='group-section'> <div styleName='group-section'>
{i18n.__('Interface Theme')} <div styleName='group-section-label'>
{i18n.__('Interface Theme')}
</div>
<div styleName='group-section-control'> <div styleName='group-section-control'>
<select value={config.ui.theme} <select value={config.ui.theme}
onChange={(e) => this.handleUIChange(e)} onChange={(e) => this.handleUIChange(e)}
@@ -190,7 +193,9 @@ class UiTab extends React.Component {
</div> </div>
<div styleName='group-section'> <div styleName='group-section'>
{i18n.__('Language')} <div styleName='group-section-label'>
{i18n.__('Language')}
</div>
<div styleName='group-section-control'> <div styleName='group-section-control'>
<select value={config.ui.language} <select value={config.ui.language}
onChange={(e) => this.handleUIChange(e)} onChange={(e) => this.handleUIChange(e)}
@@ -203,6 +208,22 @@ class UiTab extends React.Component {
</div> </div>
</div> </div>
<div styleName='group-section'>
<div styleName='group-section-label'>
{i18n.__('Default New Note')}
</div>
<div styleName='group-section-control'>
<select value={config.ui.defaultNote}
onChange={(e) => this.handleUIChange(e)}
ref='defaultNote'
>
<option value='ALWAYS_ASK'>{i18n.__('Always Ask')}</option>
<option value='MARKDOWN_NOTE'>{i18n.__('Markdown Note')}</option>
<option value='SNIPPET_NOTE'>{i18n.__('Snippet Note')}</option>
</select>
</div>
</div>
<div styleName='group-checkBoxSection'> <div styleName='group-checkBoxSection'>
<label> <label>
<input onChange={(e) => this.handleUIChange(e)} <input onChange={(e) => this.handleUIChange(e)}
@@ -477,7 +498,7 @@ class UiTab extends React.Component {
</div> </div>
</div> </div>
<div styleName='group-section'> <div styleName='group-section'>
<div styleName='group-section-label'>{i18n.__('Code block Theme')}</div> <div styleName='group-section-label'>{i18n.__('Code Block Theme')}</div>
<div styleName='group-section-control'> <div styleName='group-section-control'>
<select value={config.preview.codeBlockTheme} <select value={config.preview.codeBlockTheme}
ref='previewCodeBlockTheme' ref='previewCodeBlockTheme'

View File

@@ -216,16 +216,10 @@ function data (state = defaultDataMap(), action) {
return state return state
} }
case 'UPDATE_FOLDER': case 'UPDATE_FOLDER':
state = Object.assign({}, state)
state.storageMap = new Map(state.storageMap)
state.storageMap.set(action.storage.key, action.storage)
return state
case 'REORDER_FOLDER': case 'REORDER_FOLDER':
state = Object.assign({}, state)
state.storageMap = new Map(state.storageMap)
state.storageMap.set(action.storage.key, action.storage)
return state
case 'EXPORT_FOLDER': case 'EXPORT_FOLDER':
case 'RENAME_STORAGE':
case 'EXPORT_STORAGE':
state = Object.assign({}, state) state = Object.assign({}, state)
state.storageMap = new Map(state.storageMap) state.storageMap = new Map(state.storageMap)
state.storageMap.set(action.storage.key, action.storage) state.storageMap.set(action.storage.key, action.storage)
@@ -355,11 +349,6 @@ function data (state = defaultDataMap(), action) {
}) })
} }
return state return state
case 'RENAME_STORAGE':
state = Object.assign({}, state)
state.storageMap = new Map(state.storageMap)
state.storageMap.set(action.storage.key, action.storage)
return state
case 'EXPAND_STORAGE': case 'EXPAND_STORAGE':
state = Object.assign({}, state) state = Object.assign({}, state)
state.storageMap = new Map(state.storageMap) state.storageMap = new Map(state.storageMap)

View File

@@ -0,0 +1,109 @@
.TagSelect
.react-autosuggest__input
box-sizing border-box
border none
background-color transparent
outline none
padding 0 4px
font-size 13px
ul
position fixed
z-index 999
box-sizing border-box
list-style none
padding 0
margin 0
border-radius 4px
margin .2em 0 0
background-color $ui-noteList-backgroundColor
border 1px solid rgba(0,0,0,.3)
box-shadow .05em .2em .6em rgba(0,0,0,.2)
text-shadow none
&:empty,
&[hidden]
display none
&:before
content ""
position absolute
top -7px
left 14px
width 0 height 0
padding 6px
background-color $ui-noteList-backgroundColor
border inherit
border-right 0
border-bottom 0
-webkit-transform rotate(45deg)
transform rotate(45deg)
li
position relative
padding 6px 18px 6px 10px
cursor pointer
li[aria-selected="true"]
background-color alpha($ui-button--active-backgroundColor, 40%)
color $ui-text-color
body[data-theme="dark"]
.TagSelect
.react-autosuggest__input
color $ui-dark-text-color
ul
border-color $ui-dark-borderColor
background-color $ui-dark-noteList-backgroundColor
color $ui-dark-text-color
&:before
background-color $ui-dark-noteList-backgroundColor
li[aria-selected="true"]
background-color $ui-dark-button--active-backgroundColor
color $ui-dark-text-color
body[data-theme="monokai"]
.TagSelect
.react-autosuggest__input
color $ui-monokai-text-color
ul
border-color $ui-monokai-borderColor
background-color $ui-monokai-noteList-backgroundColor
color $ui-monokai-text-color
&:before
background-color $ui-dark-noteList-backgroundColor
li[aria-selected="true"]
background-color $ui-monokai-button-backgroundColor
color $ui-monokai-text-color
body[data-theme="solarized-dark"]
.TagSelect
.react-autosuggest__input
color $ui-solarized-dark-text-color
ul
border-color $ui-solarized-dark-borderColor
background-color $ui-solarized-dark-noteList-backgroundColor
color $ui-solarized-dark-text-color
&:before
background-color $ui-solarized-dark-noteList-backgroundColor
li[aria-selected="true"]
background-color $ui-dark-button--active-backgroundColor
color $ui-solarized-dark-text-color
body[data-theme="white"]
.TagSelect
ul
background-color $ui-white-noteList-backgroundColor
li[aria-selected="true"]
background-color $ui-button--active-backgroundColor

View File

@@ -369,7 +369,7 @@ $ui-monokai-active-color = #f92672
$ui-monokai-borderColor = #373831 $ui-monokai-borderColor = #373831
$ui-monokai-tag-backgroundColor = #f92672 $ui-monokai-tag-backgroundColor = #373831
$ui-monokai-button-backgroundColor = #373831 $ui-monokai-button-backgroundColor = #373831
$ui-monokai-button--active-color = white $ui-monokai-button--active-color = white

View File

@@ -1,18 +1,18 @@
# Contributing to Boostnote (English) # Contributing to Boostnote (English)
### When you open an issue of a bug report ### When you open an issue or a bug report
There are no issue template. But there is a request. There is no issue template, but there is a request.
**Please paste screenshots of Boostnote with developer tool open** **Please paste screenshots of Boostnote with the developer tool open**
Thank you for your help in advance. Thank you in advance for your help.
### About copyright of Pull Request ### Concerning Copyright
If you make a pull request, It means you agree to transfer the copyright of the code changes to BoostIO. By making a pull request you agree to transfer ownership of your code to BoostIO.
It doesn't mean Boostnote will become a paid app. If we want to earn some money, We will try other way, which is some kind of cloud storage, Mobile app integration or some SPECIAL features. This doesn't mean Boostnote will become a paid app. If we want to earn money, we will find other way. Potentially some kind of cloud storage, mobile app integration, or some premium features.
Because GPL v3 is too strict to be compatible with any other License, We thought this is needed to replace the license with much freer one(like BSD, MIT) somewhen. GPL v3 is too strict to be compatible with another license, so we thought it might be necessary to replace the license with a more open one (like BSD, MIT) eventually.
--- ---
@@ -86,4 +86,23 @@ Pull requestをすることはその変化分のコードの著作権をBoostIO
如果您提供了一个Pull Request这表示您将您所修改的代码的著作权移交给BoostIO。 如果您提供了一个Pull Request这表示您将您所修改的代码的著作权移交给BoostIO。
这并不表示Boostnote会成为一个需要付费的软件。如果我们想获得收益我们会尝试一些其他的方法比如说云存储、绑定手机软件等。 这并不表示Boostnote会成为一个需要付费的软件。如果我们想获得收益我们会尝试一些其他的方法比如说云存储、绑定手机软件等。
因为GPLv3过于严格不能和其他的一些协议兼容所以我们有可能在将来会把BoostNote的协议改为一些较为宽松的协议比如说BSD、MIT。 因为GPLv3过于严格不能和其他的一些协议兼容所以我们有可能在将来会把BoostNote的协议改为一些较为宽松的协议比如说BSD、MIT。
---
# Contributing to Boostnote (Français)
### Lorsque vous signalez un problème ou un bug
Il n'y a pas de modèle pour un signaler problème. Mais nous vous demandons :
**Merci de founir une capture d'écran de Boostnote avec l'outil de développement ouvert**
(vous pouvez l'ouvrir avec `Ctrl+Shift+I`)
Merci en avance pour votre aide.
### À propos des droits d'auteurs et des requêtes (`Pull Request`)
Si vous faites une requête, vous acceptez de transmettre les modifications du code à BoostIO.
Cela ne veut pas dire que Boostnote deviendra une application payante. Si nous voulons gagner de l'argent, nous trouverons un autre moyen, comme un service de sauvegarde sur le Cloud, une application mobile ou des options payantes.
Puisque GPL v3 est trop strict pour être compatible avec n'importe quelle autre licence, nous pensons avoir un jour besoin de la remplacer avec une licence bien plus libre (comme BSD, MIT).

View File

@@ -0,0 +1,127 @@
(function (mod) {
if (typeof exports === 'object' && typeof module === 'object') { // Common JS
mod(require('../codemirror/lib/codemirror'))
} else if (typeof define === 'function' && define.amd) { // AMD
define(['../codemirror/lib/codemirror'], mod)
} else { // Plain browser env
mod(CodeMirror)
}
})(function (CodeMirror) {
'use strict'
const shell = require('electron').shell
const yOffset = 2
const macOS = global.process.platform === 'darwin'
const modifier = macOS ? 'metaKey' : 'ctrlKey'
class HyperLink {
constructor(cm) {
this.cm = cm
this.lineDiv = cm.display.lineDiv
this.onMouseDown = this.onMouseDown.bind(this)
this.onMouseEnter = this.onMouseEnter.bind(this)
this.onMouseLeave = this.onMouseLeave.bind(this)
this.onMouseMove = this.onMouseMove.bind(this)
this.tooltip = document.createElement('div')
this.tooltipContent = document.createElement('div')
this.tooltipIndicator = document.createElement('div')
this.tooltip.setAttribute('class', 'CodeMirror-hover CodeMirror-matchingbracket CodeMirror-selected')
this.tooltip.setAttribute('cm-ignore-events', 'true')
this.tooltip.appendChild(this.tooltipContent)
this.tooltip.appendChild(this.tooltipIndicator)
this.tooltipContent.textContent = `${macOS ? 'Cmd(⌘)' : 'Ctrl(^)'} + click to follow link`
this.lineDiv.addEventListener('mousedown', this.onMouseDown)
this.lineDiv.addEventListener('mouseenter', this.onMouseEnter, {
capture: true,
passive: true
})
this.lineDiv.addEventListener('mouseleave', this.onMouseLeave, {
capture: true,
passive: true
})
this.lineDiv.addEventListener('mousemove', this.onMouseMove, {
passive: true
})
}
getUrl(el) {
const className = el.className.split(' ')
if (className.indexOf('cm-url') !== -1) {
const match = /^\((.*)\)|\[(.*)\]|(.*)$/.exec(el.textContent)
return match[1] || match[2] || match[3]
}
return null
}
onMouseDown(e) {
const { target } = e
if (!e[modifier]) {
return
}
const url = this.getUrl(target)
if (url) {
e.preventDefault()
shell.openExternal(url)
}
}
onMouseEnter(e) {
const { target } = e
const url = this.getUrl(target)
if (url) {
if (e[modifier]) {
target.classList.add('CodeMirror-activeline-background', 'CodeMirror-hyperlink')
}
else {
target.classList.add('CodeMirror-activeline-background')
}
this.showInfo(target)
}
}
onMouseLeave(e) {
if (this.tooltip.parentElement === this.lineDiv) {
e.target.classList.remove('CodeMirror-activeline-background', 'CodeMirror-hyperlink')
this.lineDiv.removeChild(this.tooltip)
}
}
onMouseMove(e) {
if (this.tooltip.parentElement === this.lineDiv) {
if (e[modifier]) {
e.target.classList.add('CodeMirror-hyperlink')
}
else {
e.target.classList.remove('CodeMirror-hyperlink')
}
}
}
showInfo(relatedTo) {
const b1 = relatedTo.getBoundingClientRect()
const b2 = this.lineDiv.getBoundingClientRect()
const tdiv = this.tooltip
tdiv.style.left = (b1.left - b2.left) + 'px'
this.lineDiv.appendChild(tdiv)
const b3 = tdiv.getBoundingClientRect()
const top = b1.top - b2.top - b3.height - yOffset
if (top < 0) {
tdiv.style.top = (b1.top - b2.top + b1.height + yOffset) + 'px'
}
else {
tdiv.style.top = top + 'px'
}
}
}
CodeMirror.defineOption('hyperlink', true, (cm) => {
const addon = new HyperLink(cm)
})
})

View File

@@ -78,9 +78,11 @@ app.on('ready', function () {
var template = require('./main-menu') var template = require('./main-menu')
var menu = Menu.buildFromTemplate(template) var menu = Menu.buildFromTemplate(template)
var touchBarMenu = require('./touchbar-menu')
switch (process.platform) { switch (process.platform) {
case 'darwin': case 'darwin':
Menu.setApplicationMenu(menu) Menu.setApplicationMenu(menu)
mainWindow.setTouchBar(touchBarMenu)
break break
case 'win32': case 'win32':
mainWindow.setMenu(menu) mainWindow.setMenu(menu)

View File

@@ -145,6 +145,16 @@ const file = {
{ {
type: 'separator' type: 'separator'
}, },
{
label: 'Generate/Update Markdown TOC',
accelerator: 'Shift+Ctrl+T',
click () {
mainWindow.webContents.send('code:generate-toc')
}
},
{
type: 'separator'
},
{ {
label: 'Print', label: 'Print',
accelerator: 'CommandOrControl+P', accelerator: 'CommandOrControl+P',

View File

@@ -10,6 +10,7 @@
<link rel="stylesheet" href="../node_modules/codemirror/lib/codemirror.css"> <link rel="stylesheet" href="../node_modules/codemirror/lib/codemirror.css">
<link rel="stylesheet" href="../node_modules/katex/dist/katex.min.css"> <link rel="stylesheet" href="../node_modules/katex/dist/katex.min.css">
<link rel="stylesheet" href="../node_modules/codemirror/addon/dialog/dialog.css"> <link rel="stylesheet" href="../node_modules/codemirror/addon/dialog/dialog.css">
<title>Boostnote</title> <title>Boostnote</title>
<style> <style>
@@ -101,6 +102,7 @@
<script src="../extra_scripts/boost/boostNewLineIndentContinueMarkdownList.js"></script> <script src="../extra_scripts/boost/boostNewLineIndentContinueMarkdownList.js"></script>
<script src="../extra_scripts/codemirror/mode/bfm/bfm.js"></script> <script src="../extra_scripts/codemirror/mode/bfm/bfm.js"></script>
<script src="../extra_scripts/codemirror/addon/hyperlink/hyperlink.js"></script>
<script src="../node_modules/codemirror/addon/edit/closebrackets.js"></script> <script src="../node_modules/codemirror/addon/edit/closebrackets.js"></script>
<script src="../node_modules/codemirror/addon/edit/matchbrackets.js"></script> <script src="../node_modules/codemirror/addon/edit/matchbrackets.js"></script>

41
lib/touchbar-menu.js Normal file
View File

@@ -0,0 +1,41 @@
const {TouchBar} = require('electron')
const {TouchBarButton, TouchBarSpacer} = TouchBar
const mainWindow = require('./main-window')
const allNotes = new TouchBarButton({
label: '📒',
click: () => {
mainWindow.webContents.send('list:navigate', '/home')
}
})
const starredNotes = new TouchBarButton({
label: '⭐️',
click: () => {
mainWindow.webContents.send('list:navigate', '/starred')
}
})
const trash = new TouchBarButton({
label: '🗑',
click: () => {
mainWindow.webContents.send('list:navigate', '/trashed')
}
})
const newNote = new TouchBarButton({
label: '✎',
click: () => {
mainWindow.webContents.send('list:navigate', '/home')
mainWindow.webContents.send('top:new-note')
}
})
module.exports = new TouchBar([
allNotes,
starredNotes,
trash,
new TouchBarSpacer({size: 'small'}),
newNote
])

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote", "Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages", "Storage Locations": "Storage Locations",
"Add Storage Location": "Add Storage Location", "Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder", "Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder", "Open Storage folder": "Open Storage folder",
@@ -55,7 +55,7 @@
"Preview": "Preview", "Preview": "Preview",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family", "Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme", "Code Block Theme": "Code Block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "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", "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Dear Boostnote users,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "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.", "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 continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "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.", "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 like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "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,", "Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "The Boostnote Team",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Language", "Language": "Language",
"English": "English", "English": "English",
@@ -141,7 +141,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "You have to save!", "Unsaved Changes!": "Unsaved Changes!",
"Russian": "Russian", "Russian": "Russian",
"Command(⌘)": "Command(⌘)", "Command(⌘)": "Command(⌘)",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Editor Rulers",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Drucken", "Print": "Drucken",
"Your preferences for Boostnote": "Boostnote Einstellungen", "Your preferences for Boostnote": "Boostnote Einstellungen",
"Storages": "Speicherverwaltung", "Storage Locations": "Speicherverwaltung",
"Add Storage Location": "Speicherort hinzufügen", "Add Storage Location": "Speicherort hinzufügen",
"Add Folder": "Ordner hinzufügen", "Add Folder": "Ordner hinzufügen",
"Open Storage folder": "Speicherort öffnen", "Open Storage folder": "Speicherort öffnen",
@@ -55,7 +55,7 @@
"Preview": "Vorschau", "Preview": "Vorschau",
"Preview Font Size": "Vorschau Schriftgröße", "Preview Font Size": "Vorschau Schriftgröße",
"Preview Font Family": "Vorschau Schriftart", "Preview Font Family": "Vorschau Schriftart",
"Code block Theme": "Code-Block Theme", "Code Block Theme": "Code-Block Theme",
"Allow preview to scroll past the last line": "Vorschau das Scrollen über das Ende hinaus erlauben", "Allow preview to scroll past the last line": "Vorschau das Scrollen über das Ende hinaus erlauben",
"Show line numbers for preview code blocks": "Zeilennummern in Vorschau-Code-Blöcken anzeigen", "Show line numbers for preview code blocks": "Zeilennummern in Vorschau-Code-Blöcken anzeigen",
"LaTeX Inline Open Delimiter": "LaTeX Inline Beginn Kennzeichen", "LaTeX Inline Open Delimiter": "LaTeX Inline Beginn Kennzeichen",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "Du kannst wählen, ob du diese Option aktivieren oder daektivieren möchtest.", "You can choose to enable or disable this option.": "Du kannst wählen, ob du diese Option aktivieren oder daektivieren möchtest.",
"Enable analytics to help improve Boostnote": "Datenerhebung zur Verbesserung von Boostnote aktivieren", "Enable analytics to help improve Boostnote": "Datenerhebung zur Verbesserung von Boostnote aktivieren",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Hallo,", "Dear Boostnote users,": "Hallo,",
"Thank you for using Boostnote!": "Danke, dass du Boostnote verwendest.", "Thank you for using Boostnote!": "Danke, dass du Boostnote verwendest.",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote wird in über 200 verschiedenen Ländern von einer großartigen Community von Entwicklern verwendet.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote wird in über 200 verschiedenen Ländern von einer großartigen Community von Entwicklern verwendet.",
"To continue supporting this growth, and to satisfy community expectations,": "Um die Erwartungen der Community weiterhin erfüllen zu können und die Verbreitung von Boostnote weiter voranzutreiben,", "To support our growing userbase, and satisfy community expectations,": "Um die Erwartungen der Community weiterhin erfüllen zu können und die Verbreitung von Boostnote weiter voranzutreiben,",
"we would like to invest more time and resources in this project.": "würden wir gern mehr Zeit und Resourcen in dieses Projekt investieren.", "we would like to invest more time and resources in this project.": "würden wir gern mehr Zeit und Resourcen in dieses Projekt investieren.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Wenn dir dieses Projekt gefällt und du sein Potential erkennst, kannst du uns gern mit OpenCollective unterstützen!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Wenn dir dieses Projekt gefällt und du sein Potential erkennst, kannst du uns gern mit OpenCollective unterstützen!",
"Thanks,": "Vielen Dank,", "Thanks,": "Vielen Dank,",
"Boostnote maintainers": "Dein Boostnote Team", "The Boostnote Team": "Dein Boostnote Team",
"Support via OpenCollective": "Unterstützen mit OpenCollective", "Support via OpenCollective": "Unterstützen mit OpenCollective",
"Language": "Sprache", "Language": "Sprache",
"English": "Englisch", "English": "Englisch",
@@ -130,7 +130,7 @@
"Permanent Delete": "Dauerhaft löschen", "Permanent Delete": "Dauerhaft löschen",
"Confirm note deletion": "Löschen bestätigen", "Confirm note deletion": "Löschen bestätigen",
"This will permanently remove this note.": "Diese Notiz wird dauerhaft gelöscht.", "This will permanently remove this note.": "Diese Notiz wird dauerhaft gelöscht.",
"You have to save!": "Speichern notwendig!", "Unsaved Changes!": "Speichern notwendig!",
"Albanian": "Albanisch", "Albanian": "Albanisch",
"Danish": "Dänisch", "Danish": "Dänisch",
"Japanese": "Japanisch", "Japanese": "Japanisch",

View File

@@ -23,7 +23,7 @@
"Your preferences for Boostnote": "Your preferences for Boostnote", "Your preferences for Boostnote": "Your preferences for Boostnote",
"Help": "Help", "Help": "Help",
"Hide Help": "Hide Help", "Hide Help": "Hide Help",
"Storages": "Storages", "Storage Locations": "Storage Locations",
"Add Storage Location": "Add Storage Location", "Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder", "Add Folder": "Add Folder",
"Select Folder": "Select Folder", "Select Folder": "Select Folder",
@@ -62,7 +62,7 @@
"Preview": "Preview", "Preview": "Preview",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family", "Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme", "Code Block Theme": "Code Block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -90,14 +90,14 @@
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "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", "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Dear Boostnote users,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "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.", "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 continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "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.", "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 like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "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,", "Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "The Boostnote Team",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Language", "Language": "Language",
"English": "English", "English": "English",
@@ -134,7 +134,7 @@
"Storage": "Storage", "Storage": "Storage",
"Hotkeys": "Hotkeys", "Hotkeys": "Hotkeys",
"Show/Hide Boostnote": "Show/Hide Boostnote", "Show/Hide Boostnote": "Show/Hide Boostnote",
"Toggle editor mode": "Toggle editor mode", "Toggle Editor Mode": "Toggle Editor Mode",
"Restore": "Restore", "Restore": "Restore",
"Permanent Delete": "Permanent Delete", "Permanent Delete": "Permanent Delete",
"Confirm note deletion": "Confirm note deletion", "Confirm note deletion": "Confirm note deletion",
@@ -150,7 +150,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "You have to save!", "Unsaved Changes!": "Unsaved Changes!",
"UserName": "UserName", "UserName": "UserName",
"Password": "Password", "Password": "Password",
"Russian": "Russian", "Russian": "Russian",

View File

@@ -1,8 +1,8 @@
{ {
"Notes": "Notas", "Notes": "Notas",
"Tags": "Etiquetas", "Tags": "Etiquetas",
"Preferences": "Preferencias", "Preferences": "Preferencias",
"Make a note": "Tomar una nota", "Make a note": "Crear nota",
"Ctrl": "Ctrl", "Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl", "Ctrl(^)": "Ctrl",
"to create a new note": "para crear una nueva nota", "to create a new note": "para crear una nueva nota",
@@ -14,16 +14,16 @@
"STORAGE": "ALMACENAMIENTO", "STORAGE": "ALMACENAMIENTO",
"FOLDER": "CARPETA", "FOLDER": "CARPETA",
"CREATION DATE": "FECHA DE CREACIÓN", "CREATION DATE": "FECHA DE CREACIÓN",
"NOTE LINK": "ENLACE A LA NOTA", "NOTE LINK": "ENLACE DE LA NOTA",
".md": ".md", ".md": ".md",
".txt": ".txt", ".txt": ".txt",
".html": ".html", ".html": ".html",
"Print": "Imprimir", "Print": "Imprimir",
"Your preferences for Boostnote": "Tus preferencias para Boostnote", "Your preferences for Boostnote": "Tus preferencias para Boostnote",
"Storages": "Almacenamientos", "Storage Locations": "Almacenamientos",
"Add Storage Location": "Añadir ubicación de almacenamiento", "Add Storage Location": "Añadir ubicación de almacenamiento",
"Add Folder": "Añadir carpeta", "Add Folder": "Añadir carpeta",
"Open Storage folder": "Añadir carpeta de almacenamiento", "Open Storage folder": "Abrir carpeta de almacenamiento",
"Unlink": "Desvincular", "Unlink": "Desvincular",
"Edit": "Editar", "Edit": "Editar",
"Delete": "Eliminar", "Delete": "Eliminar",
@@ -39,8 +39,8 @@
"Editor Font Family": "Fuente del editor", "Editor Font Family": "Fuente del editor",
"Editor Indent Style": "Estilo de indentado del editor", "Editor Indent Style": "Estilo de indentado del editor",
"Spaces": "Espacios", "Spaces": "Espacios",
"Tabs": "Tabulación", "Tabs": "Tabulaciones",
"Switch to Preview": "Cambiar a Previsualización", "Switch to Preview": "Cambiar a previsualización",
"When Editor Blurred": "Cuando el editor pierde el foco", "When Editor Blurred": "Cuando el editor pierde el foco",
"When Editor Blurred, Edit On Double Click": "Cuando el editor pierde el foco, editar con doble clic", "When Editor Blurred, Edit On Double Click": "Cuando el editor pierde el foco, editar con doble clic",
"On Right Click": "Al hacer clic derecho", "On Right Click": "Al hacer clic derecho",
@@ -48,20 +48,20 @@
"default": "por defecto", "default": "por defecto",
"vim": "vim", "vim": "vim",
"emacs": "emacs", "emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Reinicie boostnote después de cambiar el mapeo de teclas", "⚠️ Please restart boostnote after you change the keymap": "⚠️ Por favor reinicie boostnote después de cambiar el mapeo de teclas",
"Show line numbers in the editor": "Mostrar números de línea en el editor", "Show line numbers in the editor": "Mostrar números de línea en el editor",
"Allow editor to scroll past the last line": "Permitir al editor desplazarse más allá de la última línea", "Allow editor to scroll past the last line": "Permitir al editor desplazarse más allá de la última línea",
"Bring in web page title when pasting URL on editor": "Al pegar una URL en el editor, insertar el título de la web automáticamente", "Bring in web page title when pasting URL on editor": "Al pegar una URL en el editor, insertar el título de la web",
"Preview": "Previsualización", "Preview": "Previsualizar",
"Preview Font Size": "Previsualizar tamaño de la fuente", "Preview Font Size": "Previsualizar tamaño de la fuente",
"Preview Font Family": "Previsualizar fuente", "Preview Font Family": "Previsualizar fuente",
"Code block Theme": "Tema de los bloques de código", "Code Block Theme": "Tema de los bloques de código",
"Allow preview to scroll past the last line": "Permitir a la previsualización desplazarse más allá de la última línea", "Allow preview to scroll past the last line": "Permitir a la previsualización desplazarse más allá de la última línea",
"Show line numbers for preview code blocks": "Mostar números de línea al previsualizar bloques de código", "Show line numbers for preview code blocks": "Mostrar números de línea al previsualizar bloques de código",
"LaTeX Inline Open Delimiter": "Delimitador de apertura LaTeX en línea", "LaTeX Inline Open Delimiter": "Delimitador de apertura de LaTeX en línea",
"LaTeX Inline Close Delimiter": "Delimitador de cierre LaTeX en línea", "LaTeX Inline Close Delimiter": "Delimitador de cierre de LaTeX en línea",
"LaTeX Block Open Delimiter": "Delimitado de apertura bloque LaTeX", "LaTeX Block Open Delimiter": "Delimitador de apertura de bloque LaTeX",
"LaTeX Block Close Delimiter": "Delimitador de cierre bloque LaTeX", "LaTeX Block Close Delimiter": "Delimitador de cierre de bloque LaTeX",
"PlantUML Server": "PlantUML Server", "PlantUML Server": "PlantUML Server",
"Community": "Comunidad", "Community": "Comunidad",
"Subscribe to Newsletter": "Suscribirse al boletín", "Subscribe to Newsletter": "Suscribirse al boletín",
@@ -71,26 +71,26 @@
"Twitter": "Twitter", "Twitter": "Twitter",
"About": "Sobre", "About": "Sobre",
"Boostnote": "Boostnote", "Boostnote": "Boostnote",
"An open source note-taking app made for programmers just like you.": "Una aplicación para tomar notas de código abieto para programadores como tú.", "An open source note-taking app made for programmers just like you.": "Una aplicación de código abierto para tomar notas hecho para programadores como tú.",
"Website": "Página web", "Website": "Página web",
"Development": "Desarrollo", "Development": "Desarrollo",
" : Development configurations for Boostnote.": " : Configuraciones de desarrollo para Boostnote.", " : Development configurations for Boostnote.": " : Configuraciones de desarrollo para Boostnote.",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO", "Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "Licencia: GPL v3", "License: GPL v3": "Licencia: GPL v3",
"Analytics": "Analítica", "Analytics": "Analítica",
"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 recopila datos anónimos con el único propósito de mejorar la aplicación. No recopila ninguna información personal, como puede ser el contenido de sus notas.", "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 recopila datos anónimos con el único propósito de mejorar la aplicación, y de ninguna manera recopila información personal como el contenido de sus notas.",
"You can see how it works on ": "Puedes ver cómo funciona en ", "You can see how it works on ": "Puedes ver cómo funciona en ",
"You can choose to enable or disable this option.": "Puedes elegir activar o desactivar esta opción.", "You can choose to enable or disable this option.": "Puedes elegir activar o desactivar esta opción.",
"Enable analytics to help improve Boostnote": "Activa analítica para ayudar a mejorar Boostnote", "Enable analytics to help improve Boostnote": "Activar recopilación de datos para ayudar a mejorar Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Hola a todos,", "Dear Boostnote users,": "Hola a todos,",
"Thank you for using Boostnote!": "Gracias por usar Boostnote!", "Thank you for using Boostnote!": "¡Gracias por usar Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote es utilizado en alrededor de 200 países y regiones diferentes por una increíble comunidad de desarrolladores.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote es utilizado en alrededor de 200 países y regiones diferentes por una increíble comunidad de desarrolladores.",
"To continue supporting this growth, and to satisfy community expectations,": "Para continuar apoyando este crecimiento y satisfacer las expectativas de la comunidad,", "To support our growing userbase, and satisfy community expectations,": "Para continuar apoyando este crecimiento y satisfacer las expectativas de la comunidad,",
"we would like to invest more time and resources in this project.": "nos gustaría invertir más tiempo y recursos en este proyecto.", "we would like to invest more time and resources in this project.": "nos gustaría invertir más tiempo y recursos en este proyecto.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Si te gusta este proyecto y ves su potencial, ¡puedes ayudar apoyándonos en OpenCollective!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Si te gusta este proyecto y ves su potencial, ¡puedes ayudar apoyándonos en OpenCollective!",
"Thanks,": "Gracias,", "Thanks,": "Gracias,",
"Boostnote maintainers": "Equipo de Boostnote", "The Boostnote Team": "Equipo de Boostnote",
"Support via OpenCollective": "Contribuir vía OpenCollective", "Support via OpenCollective": "Contribuir vía OpenCollective",
"Language": "Idioma", "Language": "Idioma",
"English": "Inglés", "English": "Inglés",
@@ -99,7 +99,7 @@
"Show \"Saved to Clipboard\" notification when copying": "Mostrar la notificaión \"Guardado en Portapapeles\" al copiar", "Show \"Saved to Clipboard\" notification when copying": "Mostrar la notificaión \"Guardado en Portapapeles\" al copiar",
"All Notes": "Todas las notas", "All Notes": "Todas las notas",
"Starred": "Destacado", "Starred": "Destacado",
"Are you sure to ": "Estás seguro de ", "Are you sure to ": "¿Estás seguro de ",
" delete": " eliminar", " delete": " eliminar",
"this folder?": "esta carpeta?", "this folder?": "esta carpeta?",
"Confirm": "Confirmar", "Confirm": "Confirmar",
@@ -118,7 +118,7 @@
"Blog Type": "Tipo de blog", "Blog Type": "Tipo de blog",
"Blog Address": "Dirección del blog", "Blog Address": "Dirección del blog",
"Save": "Guardar", "Save": "Guardar",
"Auth": "Auth", "Auth": "Autentificación",
"Authentication Method": "Método de autentificación", "Authentication Method": "Método de autentificación",
"JWT": "JWT", "JWT": "JWT",
"USER": "USUARIO", "USER": "USUARIO",
@@ -129,8 +129,8 @@
"Restore": "Restaurar", "Restore": "Restaurar",
"Permanent Delete": "Eliminar permanentemente", "Permanent Delete": "Eliminar permanentemente",
"Confirm note deletion": "Confirmar eliminación de nota", "Confirm note deletion": "Confirmar eliminación de nota",
"This will permanently remove this note.": "La nota se eliminará permanentemente.", "This will permanently remove this note.": "Esto eliminará la nota permanentemente.",
"Successfully applied!": "Aplicado con éxito!", "Successfully applied!": "¡Aplicado con éxito!",
"Albanian": "Albanés", "Albanian": "Albanés",
"Chinese (zh-CN)": "Chino - China", "Chinese (zh-CN)": "Chino - China",
"Chinese (zh-TW)": "Chino - Taiwan", "Chinese (zh-TW)": "Chino - Taiwan",
@@ -139,11 +139,11 @@
"Korean": "Coreano", "Korean": "Coreano",
"Norwegian": "Noruego", "Norwegian": "Noruego",
"Polish": "Polaco", "Polish": "Polaco",
"Portuguese": "Portugues", "Portuguese": "Portugués",
"Spanish": "Español", "Spanish": "Español",
"You have to save!": "Tienes que guardar!", "Unsaved Changes!": "¡Tienes que guardar!",
"Russian": "Ruso", "Russian": "Ruso",
"Command(⌘)": "Command(⌘)", "Command(⌘)": "Comando(⌘)",
"Editor Rulers": "Reglas del editor", "Editor Rulers": "Reglas del editor",
"Enable": "Activar", "Enable": "Activar",
"Disable": "Desactivar", "Disable": "Desactivar",
@@ -151,6 +151,7 @@
"Only allow secure html tags (recommended)": "Solo permitir etiquetas html seguras (recomendado)", "Only allow secure html tags (recommended)": "Solo permitir etiquetas html seguras (recomendado)",
"Allow styles": "Permitir estilos", "Allow styles": "Permitir estilos",
"Allow dangerous html tags": "Permitir etiquetas html peligrosas", "Allow dangerous html tags": "Permitir etiquetas html peligrosas",
"⚠ 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 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.": "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.": "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"
} }

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "پرینت", "Print": "پرینت",
"Your preferences for Boostnote": "تنظیمات شما برای boostnote", "Your preferences for Boostnote": "تنظیمات شما برای boostnote",
"Storages": "ذخیره سازی", "Storage Locations": "ذخیره سازی",
"Add Storage Location": "افزودن محل ذخیره سازی", "Add Storage Location": "افزودن محل ذخیره سازی",
"Add Folder": "ساخت پوشه", "Add Folder": "ساخت پوشه",
"Open Storage folder": "بازکردن پوشه ذخیره سازی", "Open Storage folder": "بازکردن پوشه ذخیره سازی",
@@ -55,7 +55,7 @@
"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": "جداکننده آغازین لاتکس خطی",
@@ -83,14 +83,14 @@
"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 everyone,": "عزیزان,", "Dear Boostnote users,": "عزیزان,",
"Thank you for using Boostnote!": "از شما بخاطر استفاده از boostnote ممنونیم!", "Thank you for using Boostnote!": "از شما بخاطر استفاده از boostnote ممنونیم!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "در ۲۰۰ کشور مختلف دنیا مورد توسط جمعی از برنامه نویسان بی نظیر مورد استفاده قرار میگیرد. Boostnote", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "در ۲۰۰ کشور مختلف دنیا مورد توسط جمعی از برنامه نویسان بی نظیر مورد استفاده قرار میگیرد. Boostnote",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "اگر این پروژه را دوست دارید و پتانسیلی در آن می‌بینید، میتوانید مارا در اوپن‌ کالکتیو حمایت کنید.", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "اگر این پروژه را دوست دارید و پتانسیلی در آن می‌بینید، میتوانید مارا در اوپن‌ کالکتیو حمایت کنید.",
"Thanks,": "با تشکر,", "Thanks,": "با تشکر,",
"Boostnote maintainers": "Boostnote نگهدارندگان", "The Boostnote Team": "Boostnote نگهدارندگان",
"Support via OpenCollective": "حمایت کنید OpenCollective از طریق", "Support via OpenCollective": "حمایت کنید OpenCollective از طریق",
"Language": "زبان", "Language": "زبان",
"English": "انگلیسی", "English": "انگلیسی",
@@ -142,7 +142,7 @@
"Polish": "لهستانی", "Polish": "لهستانی",
"Portuguese": "پرتغالی", "Portuguese": "پرتغالی",
"Spanish": "اسپانیایی", "Spanish": "اسپانیایی",
"You have to save!": "!باید ذخیره کنید", "Unsaved Changes!": "!باید ذخیره کنید",
"UserName": "نام کاربری", "UserName": "نام کاربری",
"Password": "رمز عبور", "Password": "رمز عبور",
"Russian": "روسی", "Russian": "روسی",
@@ -156,4 +156,4 @@
"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.", "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! ⚠"
} }

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Imprimer", "Print": "Imprimer",
"Your preferences for Boostnote": "Vos préférences pour Boostnote", "Your preferences for Boostnote": "Vos préférences pour Boostnote",
"Storages": "Stockages", "Storage Locations": "Stockages",
"Add Storage Location": "Ajouter un espace de stockage", "Add Storage Location": "Ajouter un espace de stockage",
"Add Folder": "Ajouter un dossier", "Add Folder": "Ajouter un dossier",
"Open Storage folder": "Ouvrir un dossier de stockage", "Open Storage folder": "Ouvrir un dossier de stockage",
@@ -55,7 +55,7 @@
"Preview": "Aperçu", "Preview": "Aperçu",
"Preview Font Size": "Taille de police de l'aperçu", "Preview Font Size": "Taille de police de l'aperçu",
"Preview Font Family": "Police de l'aperçu", "Preview Font Family": "Police de l'aperçu",
"Code block Theme": "Thème des blocs de code", "Code Block Theme": "Thème des blocs de code",
"Show line numbers for preview code blocks": "Montrer les numéros de lignes dans les blocs de code dans l'aperçu", "Show line numbers for preview code blocks": "Montrer les numéros de lignes dans les blocs de code dans l'aperçu",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
"LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter", "LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter",
@@ -82,14 +82,14 @@
"You can choose to enable or disable this option.": "Vous pouvez choisir d'activer/désactiver cette option.", "You can choose to enable or disable this option.": "Vous pouvez choisir d'activer/désactiver cette option.",
"Enable analytics to help improve Boostnote": "Activer la collecte de données anonymisées pour améliorer Boostnote", "Enable analytics to help improve Boostnote": "Activer la collecte de données anonymisées pour améliorer Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Cher utilisateur,", "Dear Boostnote users,": "Cher utilisateur,",
"Thank you for using Boostnote!": "Merci d'utiliser Boostnote !", "Thank you for using Boostnote!": "Merci d'utiliser Boostnote !",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote est utilisé dans plus de 200 pays et régions par une impressionnante communauté de développeurs.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote est utilisé dans plus de 200 pays et régions par une impressionnante communauté de développeurs.",
"To continue supporting this growth, and to satisfy community expectations,": "Afin de continuer à grandir, et de satisfaire les attentes de la communauté,", "To support our growing userbase, and satisfy community expectations,": "Afin de continuer à grandir, et de satisfaire les attentes de la communauté,",
"we would like to invest more time and resources in this project.": "nous aimerions investir d'avantage de temps et de ressources dans ce proje.", "we would like to invest more time and resources in this project.": "nous aimerions investir d'avantage de temps et de ressources dans ce proje.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Si vous aimez ce projet et que vous en voyez tout le potentiel, vous pouvez aider par un support sur OpenCollective !", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Si vous aimez ce projet et que vous en voyez tout le potentiel, vous pouvez aider par un support sur OpenCollective !",
"Thanks,": "Merci,", "Thanks,": "Merci,",
"Boostnote maintainers": "Les mainteneurs de Boostnote", "The Boostnote Team": "Les mainteneurs de Boostnote",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Langues", "Language": "Langues",
"English": "Anglais", "English": "Anglais",
@@ -140,7 +140,7 @@
"Polish": "Polonais", "Polish": "Polonais",
"Portuguese": "Portugais", "Portuguese": "Portugais",
"Spanish": "Espagnol", "Spanish": "Espagnol",
"You have to save!": "Il faut sauvegarder !", "Unsaved Changes!": "Il faut sauvegarder !",
"Russian": "Russe", "Russian": "Russe",
"Command(⌘)": "Command(⌘)", "Command(⌘)": "Command(⌘)",
"Editor Rulers": "Règles dans l'éditeur", "Editor Rulers": "Règles dans l'éditeur",

View File

@@ -23,7 +23,7 @@
"Your preferences for Boostnote": "Boostnote beállításaid", "Your preferences for Boostnote": "Boostnote beállításaid",
"Help": "Súgó", "Help": "Súgó",
"Hide Help": "Súgó Elrejtése", "Hide Help": "Súgó Elrejtése",
"Storages": "Tárolók", "Storage Locations": "Tárolók",
"Add Storage Location": "Tároló Hozzáadása", "Add Storage Location": "Tároló Hozzáadása",
"Add Folder": "Könyvtár Hozzáadása", "Add Folder": "Könyvtár Hozzáadása",
"Select Folder": "Könyvtár Kiválasztása", "Select Folder": "Könyvtár Kiválasztása",
@@ -62,7 +62,7 @@
"Preview": "Megtekintés", "Preview": "Megtekintés",
"Preview Font Size": "Megtekintés Betűmérete", "Preview Font Size": "Megtekintés Betűmérete",
"Preview Font Family": "Megtekintés Betűtípusa", "Preview Font Family": "Megtekintés Betűtípusa",
"Code block Theme": "Kódblokk Témája", "Code Block Theme": "Kódblokk Témája",
"Allow preview to scroll past the last line": "Megtekintésben az utolsó sor alá is lehessen görgetni", "Allow preview to scroll past the last line": "Megtekintésben az utolsó sor alá is lehessen görgetni",
"Show line numbers for preview code blocks": "Mutatassa a sorszámokat a megtekintett kódblokkokban", "Show line numbers for preview code blocks": "Mutatassa a sorszámokat a megtekintett kódblokkokban",
"LaTeX Inline Open Delimiter": "LaTeX Inline Nyitó Határolója", "LaTeX Inline Open Delimiter": "LaTeX Inline Nyitó Határolója",
@@ -90,14 +90,14 @@
"You can choose to enable or disable this option.": "Kiválaszthatod, hogy engedélyezed, vagy tiltod ezt az opciót.", "You can choose to enable or disable this option.": "Kiválaszthatod, hogy engedélyezed, vagy tiltod ezt az opciót.",
"Enable analytics to help improve Boostnote": "Adatok elemzésének engedélyezése a Boostnote tökéletesítésének céljából", "Enable analytics to help improve Boostnote": "Adatok elemzésének engedélyezése a Boostnote tökéletesítésének céljából",
"Crowdfunding": "Közösségi finanszírozás", "Crowdfunding": "Közösségi finanszírozás",
"Dear everyone,": "Kedves felhasználók!", "Dear Boostnote users,": "Kedves felhasználók!",
"Thank you for using Boostnote!": "Köszönjük, hogy a Boostnote-ot használjátok!", "Thank you for using Boostnote!": "Köszönjük, hogy a Boostnote-ot használjátok!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "A Boostnote-ot több, mint 200 ország és régió fantasztikus fejlesztői használják.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "A Boostnote-ot több, mint 200 ország és régió fantasztikus fejlesztői használják.",
"To continue supporting this growth, and to satisfy community expectations,": "Hogy folytathassuk ezt a fejlődést és kielégíthessük a felhasználói elvárásokat,", "To support our growing userbase, and satisfy community expectations,": "Hogy folytathassuk ezt a fejlődést és kielégíthessük a felhasználói elvárásokat,",
"we would like to invest more time and resources in this project.": "több időt és erőforrást szeretnénk a projektbe fektetni.", "we would like to invest more time and resources in this project.": "több időt és erőforrást szeretnénk a projektbe fektetni.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Ha tetszik a projekt és hasznosnak találod, te is segíthetsz ebben az OpenCollective-en keresztül küldött támogatásoddal.", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Ha tetszik a projekt és hasznosnak találod, te is segíthetsz ebben az OpenCollective-en keresztül küldött támogatásoddal.",
"Thanks,": "Köszönjük!", "Thanks,": "Köszönjük!",
"Boostnote maintainers": "A Boostnote csapata", "The Boostnote Team": "A Boostnote csapata",
"Support via OpenCollective": "Támogatás Küldése", "Support via OpenCollective": "Támogatás Küldése",
"Language": "Nyelv", "Language": "Nyelv",
"English": "English", "English": "English",
@@ -134,7 +134,7 @@
"Storage": "Tároló", "Storage": "Tároló",
"Hotkeys": "Gyorsbillentyűk", "Hotkeys": "Gyorsbillentyűk",
"Show/Hide Boostnote": "Boostnote Megjelenítése/Elrejtése", "Show/Hide Boostnote": "Boostnote Megjelenítése/Elrejtése",
"Toggle editor mode": "Szerkesztő mód váltása", "Toggle Editor Mode": "Szerkesztő mód váltása",
"Restore": "Visszaállítás", "Restore": "Visszaállítás",
"Permanent Delete": "Végleges Törlés", "Permanent Delete": "Végleges Törlés",
"Confirm note deletion": "Törlés megerősítése", "Confirm note deletion": "Törlés megerősítése",
@@ -150,7 +150,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "Mentened kell!", "Unsaved Changes!": "Mentened kell!",
"UserName": "FelhasznaloNev", "UserName": "FelhasznaloNev",
"Password": "Jelszo", "Password": "Jelszo",
"Russian": "Russian", "Russian": "Russian",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Stampa", "Print": "Stampa",
"Your preferences for Boostnote": "Le tue preferenze per Boostnote", "Your preferences for Boostnote": "Le tue preferenze per Boostnote",
"Storages": "Posizioni", "Storage Locations": "Posizioni",
"Add Storage Location": "Aggiungi posizione", "Add Storage Location": "Aggiungi posizione",
"Add Folder": "Aggiungi cartella", "Add Folder": "Aggiungi cartella",
"Open Storage folder": "Apri cartella di memoria", "Open Storage folder": "Apri cartella di memoria",
@@ -55,7 +55,7 @@
"Preview": "Anteprima", "Preview": "Anteprima",
"Preview Font Size": "Dimensione font nell'anteprima", "Preview Font Size": "Dimensione font nell'anteprima",
"Preview Font Family": "Famiglia del font dell'anteprima", "Preview Font Family": "Famiglia del font dell'anteprima",
"Code block Theme": "Tema blocco di codice", "Code Block Theme": "Tema blocco di codice",
"Allow preview to scroll past the last line": "Consenti scrolling oltre l'ultima linea", "Allow preview to scroll past the last line": "Consenti scrolling oltre l'ultima linea",
"Show line numbers for preview code blocks": "Mostra numero di linea per i blocchi di codice nell'Anteprima", "Show line numbers for preview code blocks": "Mostra numero di linea per i blocchi di codice nell'Anteprima",
"LaTeX Inline Open Delimiter": "Delimitatore inline per apertura LaTex", "LaTeX Inline Open Delimiter": "Delimitatore inline per apertura LaTex",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "Puoi scegliere se attivare o disattivare questa opzione.", "You can choose to enable or disable this option.": "Puoi scegliere se attivare o disattivare questa opzione.",
"Enable analytics to help improve Boostnote": "Attiva raccolta dati per aiutare a migliorare Boostnote", "Enable analytics to help improve Boostnote": "Attiva raccolta dati per aiutare a migliorare Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Cari utenti,", "Dear Boostnote users,": "Cari utenti,",
"Thank you for using Boostnote!": "Grazie per stare utilizzando Boostnote!", "Thank you for using Boostnote!": "Grazie per stare utilizzando Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote è usato in circa 200 Paesi da una fantastica community di sviluppatori.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote è usato in circa 200 Paesi da una fantastica community di sviluppatori.",
"To continue supporting this growth, and to satisfy community expectations,": "Per continuare a supportarne la crescita, e per soddisfare le aspettative della comunità,", "To support our growing userbase, and satisfy community expectations,": "Per continuare a supportarne la crescita, e per soddisfare le aspettative della comunità,",
"we would like to invest more time and resources in this project.": "ci piacerebbe investire più tempo e risorse in questo progetto.", "we would like to invest more time and resources in this project.": "ci piacerebbe investire più tempo e risorse in questo progetto.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Se ti piace questo progetto e ci vedi del potenziale, puoi aiutarci dandodci supporto su OpenCollective!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Se ti piace questo progetto e ci vedi del potenziale, puoi aiutarci dandodci supporto su OpenCollective!",
"Thanks,": "Grazie,", "Thanks,": "Grazie,",
"Boostnote maintainers": "I mantainers di Boostnote", "The Boostnote Team": "I mantainers di Boostnote",
"Support via OpenCollective": "Supporta su OpenCollective", "Support via OpenCollective": "Supporta su OpenCollective",
"Language": "Lingua", "Language": "Lingua",
"English": "Inglese", "English": "Inglese",
@@ -142,7 +142,7 @@
"Polish": "Polacco", "Polish": "Polacco",
"Portuguese": "Portoghese", "Portuguese": "Portoghese",
"Spanish": "Spagnolo", "Spanish": "Spagnolo",
"You have to save!": "Devi salvare!", "Unsaved Changes!": "Devi salvare!",
"UserName": "UserName", "UserName": "UserName",
"Password": "Password", "Password": "Password",
"Russian": "Russo", "Russian": "Russo",

View File

@@ -23,7 +23,7 @@
"Your preferences for Boostnote": "Boostnoteの個人設定", "Your preferences for Boostnote": "Boostnoteの個人設定",
"Help": "ヘルプ", "Help": "ヘルプ",
"Hide Help": "ヘルプを隠す", "Hide Help": "ヘルプを隠す",
"Storages": "ストレージ", "Storage Locations": "ストレージ",
"Add Storage Location": "ストレージロケーションを追加", "Add Storage Location": "ストレージロケーションを追加",
"Add Folder": "フォルダを追加", "Add Folder": "フォルダを追加",
"Select Folder": "フォルダを選択", "Select Folder": "フォルダを選択",
@@ -62,7 +62,7 @@
"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 開始デリミタ(インライン)", "LaTeX Inline Open Delimiter": "LaTeX 開始デリミタ(インライン)",
@@ -90,14 +90,14 @@
"You can choose to enable or disable this option.": "このオプションは有効/無効を選択できます。", "You can choose to enable or disable this option.": "このオプションは有効/無効を選択できます。",
"Enable analytics to help improve Boostnote": "Boostnote の機能向上のための解析機能を有効にする", "Enable analytics to help improve Boostnote": "Boostnote の機能向上のための解析機能を有効にする",
"Crowdfunding": "クラウドファンディング", "Crowdfunding": "クラウドファンディング",
"Dear everyone,": "みなさまへ", "Dear Boostnote users,": "みなさまへ",
"Thank you for using Boostnote!": "Boostnote を利用いただき、ありがとうございます!", "Thank you for using Boostnote!": "Boostnote を利用いただき、ありがとうございます!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote はおよそ 200 の国と地域において、開発者コミュニティを中心に利用されています。", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote はおよそ 200 の国と地域において、開発者コミュニティを中心に利用されています。",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "もしあなたがこのプロジェクトとそのポテンシャルを気に入っていただけたのであれば、OpenCollective を通じて支援いただくことができます!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "もしあなたがこのプロジェクトとそのポテンシャルを気に入っていただけたのであれば、OpenCollective を通じて支援いただくことができます!",
"Thanks,": "ありがとうございます。", "Thanks,": "ありがとうございます。",
"Boostnote maintainers": "Boostnote メンテナンスチーム", "The Boostnote Team": "Boostnote メンテナンスチーム",
"Support via OpenCollective": "OpenCollective を通じて支援します", "Support via OpenCollective": "OpenCollective を通じて支援します",
"Language": "言語", "Language": "言語",
"English": "英語", "English": "英語",
@@ -134,7 +134,7 @@
"Storage": "ストレージ", "Storage": "ストレージ",
"Hotkeys": "ホットキー", "Hotkeys": "ホットキー",
"Show/Hide Boostnote": "Boostnote の表示/非表示", "Show/Hide Boostnote": "Boostnote の表示/非表示",
"Toggle editor mode": "エディタモードの切替", "Toggle Editor Mode": "エディタモードの切替",
"Restore": "リストア", "Restore": "リストア",
"Permanent Delete": "永久に削除", "Permanent Delete": "永久に削除",
"Confirm note deletion": "ノート削除確認", "Confirm note deletion": "ノート削除確認",
@@ -150,7 +150,7 @@
"Polish": "ポーランド語", "Polish": "ポーランド語",
"Portuguese": "ポルトガル語", "Portuguese": "ポルトガル語",
"Spanish": "スペイン語", "Spanish": "スペイン語",
"You have to save!": "保存してください!", "Unsaved Changes!": "保存してください!",
"UserName": "ユーザー名", "UserName": "ユーザー名",
"Password": "パスワード", "Password": "パスワード",
"Russian": "ロシア語", "Russian": "ロシア語",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "인쇄", "Print": "인쇄",
"Your preferences for Boostnote": "Boostnote 설정", "Your preferences for Boostnote": "Boostnote 설정",
"Storages": "저장소", "Storage Locations": "저장소",
"Add Storage Location": "저장소 위치 추가", "Add Storage Location": "저장소 위치 추가",
"Add Folder": "폴더 추가", "Add Folder": "폴더 추가",
"Open Storage folder": "저장소 위치 열기", "Open Storage folder": "저장소 위치 열기",
@@ -55,7 +55,7 @@
"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", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX 인라인 블록 열기 기호", "LaTeX Inline Open Delimiter": "LaTeX 인라인 블록 열기 기호",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "사용 통계/분석 수집 여부는 직접 선택하실 수 있습니다.", "You can choose to enable or disable this option.": "사용 통계/분석 수집 여부는 직접 선택하실 수 있습니다.",
"Enable analytics to help improve Boostnote": "Boostnote 개선을 돕기위해 사용 통계/분석 수집 허가", "Enable analytics to help improve Boostnote": "Boostnote 개선을 돕기위해 사용 통계/분석 수집 허가",
"Crowdfunding": "크라우드펀딩", "Crowdfunding": "크라우드펀딩",
"Dear everyone,": "모두들에게,", "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는 200여개의 국가에서 뛰어난 개발자들에게 사용되어지고 있습니다.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote는 200여개의 국가에서 뛰어난 개발자들에게 사용되어지고 있습니다.",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "만약 이 프로젝트가 마음에 들고 가능성이 보이신다면, 저희를 OpenCollective에서 도와주세요!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "만약 이 프로젝트가 마음에 들고 가능성이 보이신다면, 저희를 OpenCollective에서 도와주세요!",
"Thanks,": "감사합니다,", "Thanks,": "감사합니다,",
"Boostnote maintainers": "Boostnote 메인테이너", "The Boostnote Team": "Boostnote 메인테이너",
"Support via OpenCollective": "OpenCollective로 지원하기", "Support via OpenCollective": "OpenCollective로 지원하기",
"Language": "언어(Language)", "Language": "언어(Language)",
"English": "English", "English": "English",
@@ -141,7 +141,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "저장해주세요!", "Unsaved Changes!": "저장해주세요!",
"Russian": "Russian", "Russian": "Russian",
"Command(⌘)": "Command(⌘)", "Command(⌘)": "Command(⌘)",
"Delete Folder": "폴더 삭제", "Delete Folder": "폴더 삭제",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote", "Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages", "Storage Locations": "Storage Locations",
"Add Storage Location": "Add Storage Location", "Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder", "Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder", "Open Storage folder": "Open Storage folder",
@@ -55,7 +55,7 @@
"Preview": "Preview", "Preview": "Preview",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family", "Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme", "Code Block Theme": "Code Block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "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", "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Dear Boostnote users,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "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.", "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 continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "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.", "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 like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "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,", "Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "The Boostnote Team",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Language", "Language": "Language",
"English": "English", "English": "English",
@@ -141,7 +141,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "You have to save!", "Unsaved Changes!": "Unsaved Changes!",
"Russian": "Russian", "Russian": "Russian",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Editor Rulers",
"Enable": "Enable", "Enable": "Enable",

View File

@@ -1,155 +1,164 @@
{ {
"Notes": "Notes", "Notes": "Notatki",
"Tags": "Tags", "Tags": "Tagi",
"Preferences": "Preferences", "Preferences": "Ustawienia",
"Make a note": "Make a note", "Make a note": "Stwórz notatkę",
"Ctrl": "Ctrl", "Ctrl": "Ctrl",
"Ctrl(^)": "Ctrl", "Ctrl(^)": "Ctrl",
"to create a new note": "to create a new note", "to create a new note": "Aby stworzyć nową notatkę",
"Toggle Mode": "Toggle Mode", "Toggle Mode": "Przełącz tryb",
"Trash": "Trash", "Trash": "Kosz",
"MODIFICATION DATE": "MODIFICATION DATE", "MODIFICATION DATE": "DATA MODYFIKACJI",
"Words": "Words", "Words": "Słowa",
"Letters": "Letters", "Letters": "Litery",
"STORAGE": "STORAGE", "STORAGE": "MIEJSCE ZAPISU",
"FOLDER": "FOLDER", "FOLDER": "FOLDER",
"CREATION DATE": "CREATION DATE", "CREATION DATE": "DATA UTWORZENIA",
"NOTE LINK": "NOTE LINK", "NOTE LINK": "LINK NOTATKI",
"Toggle Editor Mode": "Przełączanie trybu edytora",
".md": ".md", ".md": ".md",
".txt": ".txt", ".txt": ".txt",
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Drukuj",
"Your preferences for Boostnote": "Your preferences for Boostnote", "Help": "Pomoc",
"Storages": "Storages", "Your preferences for Boostnote": "Twoje ustawienia dla Boostnote",
"Add Storage Location": "Add Storage Location", "Storage Locations": "Storage Locations",
"Add Folder": "Add Folder", "Add Storage Location": "Dodaj miejsce zapisu",
"Open Storage folder": "Open Storage folder", "Add Folder": "Dodaj Folder",
"Unlink": "Unlink", "Open Storage folder": "Otwórz folder zapisu",
"Edit": "Edit", "Unlink": "Odlinkuj",
"Delete": "Delete", "Edit": "Edytuj",
"Interface": "Interface", "Delete": "Usuń",
"Interface Theme": "Interface Theme", "Interface": "Interfejs",
"Default": "Default", "Interface Theme": "Styl interfejsu",
"White": "White", "Default": "Domyślny",
"White": "Biały",
"Solarized Dark": "Solarized Dark", "Solarized Dark": "Solarized Dark",
"Dark": "Dark", "Dark": "Ciemny",
"Show a confirmation dialog when deleting notes": "Show a confirmation dialog when deleting notes", "Show a confirmation dialog when deleting notes": "Zatwierdzaj usunięcie notatek",
"Editor Theme": "Editor Theme", "Show only related tags": "Pokazuj tylko powiązane tagi",
"Editor Font Size": "Editor Font Size", "Editor Theme": "Wygląd edytora",
"Editor Font Family": "Editor Font Family", "Editor Font Size": "Rozmiar czcionki",
"Editor Indent Style": "Editor Indent Style", "Editor Font Family": "Czcionka",
"Spaces": "Spaces", "Snippet Default Language": "Domyślny język snippetów kodu",
"Tabs": "Tabs", "Editor Indent Style": "Rodzaj wcięć",
"Switch to Preview": "Switch to Preview", "Spaces": "Spacje",
"When Editor Blurred": "When Editor Blurred", "Tabs": "Tabulatory",
"When Editor Blurred, Edit On Double Click": "When Editor Blurred, Edit On Double Click", "Switch to Preview": "Przełącz na podgląd",
"On Right Click": "On Right Click", "When Editor Blurred": "Gdy edytor jest w tle",
"Editor Keymap": "Editor Keymap", "When Editor Blurred, Edit On Double Click": "Gdy edytor jest w tle, edytuj za pomocą podwójnego kliknięcia",
"default": "default", "On Right Click": "Kliknięcie prawego przycisku myszy",
"Editor Keymap": "Układ klawiszy edytora",
"default": "domyślny",
"vim": "vim", "vim": "vim",
"emacs": "emacs", "emacs": "emacs",
"⚠️ Please restart boostnote after you change the keymap": "⚠️ Please restart boostnote after you change the keymap", "⚠️ Please restart boostnote after you change the keymap": "⚠️ Musisz zrestartować Boostnote po zmianie ustawień klawiszy",
"Show line numbers in the editor": "Show line numbers in the editor", "Show line numbers in the editor": "Pokazuj numery lini w edytorze",
"Allow editor to scroll past the last line": "Allow editor to scroll past the last line", "Allow editor to scroll past the last line": "Pozwalaj edytorowi na przewijanie poza końcową lin",
"Bring in web page title when pasting URL on editor": "Bring in web page title when pasting URL on editor", "Bring in web page title when pasting URL on editor": "Wprowadź tytuł wklejanej strony WWW do edytora",
"Preview": "Preview", "Preview": "Podgląd",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Rozmiar czcionki",
"Preview Font Family": "Preview Font Family", "Enable smart quotes": "Włącz inteligentne cytowanie",
"Code block Theme": "Code block Theme", "Render newlines in Markdown paragraphs as <br>": "Dodawaj nowe linie w notatce jako znacznik <br>",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "Preview Font Family": "Czcionka",
"Show line numbers for preview code blocks": "Show line numbers for preview code blocks", "Code Block Theme": "Styl bloku kodu",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "Allow preview to scroll past the last line": "Pozwalaj podglądowi na przewijanie poza końcową linię",
"LaTeX Inline Close Delimiter": "LaTeX Inline Close Delimiter", "Show line numbers for preview code blocks": "Pokazuj numery lini dla podglądu bloków kodu",
"LaTeX Block Open Delimiter": "LaTeX Block Open Delimiter", "LaTeX Inline Open Delimiter": "Otwarcie liniowego ogranicznika LaTeX",
"LaTeX Block Close Delimiter": "LaTeX Block Close Delimiter", "LaTeX Inline Close Delimiter": "Zamknięcie liniowego ogranicznika LaTeX",
"PlantUML Server": "PlantUML Server", "LaTeX Block Open Delimiter": "Otwarcie blokowego ogranicznika LaTeX",
"Community": "Community", "LaTeX Block Close Delimiter": "Zamknięcie blokowego ogranicznika LaTeX",
"Subscribe to Newsletter": "Subscribe to Newsletter", "PlantUML Server": "Serwer PlantUML",
"Community": "Społeczność",
"Subscribe to Newsletter": "Zapisz się do Newslettera",
"GitHub": "GitHub", "GitHub": "GitHub",
"Blog": "Blog", "Blog": "Blog",
"Facebook Group": "Facebook Group", "Facebook Group": "Grupa na Facebooku",
"Twitter": "Twitter", "Twitter": "Twitter",
"About": "About", "About": "O nas",
"Boostnote": "Boostnote", "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.": "Aplikacja open-source do przechowywania notatek, stworzona dla programistów takich jak Ty.",
"Website": "Website", "Website": "Strona WWW",
"Development": "Development", "Development": "Development",
" : Development configurations for Boostnote.": " : Development configurations for Boostnote.", " : Development configurations for Boostnote.": " : Development configurations for Boostnote.",
"Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO", "Copyright (C) 2017 - 2018 BoostIO": "Copyright (C) 2017 - 2018 BoostIO",
"License: GPL v3": "License: GPL v3", "License: GPL v3": "Licencja: GPL v3",
"Analytics": "Analytics", "Analytics": "Statystyki",
"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.", "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 zbiera anonimowe dane wyłącznie w celu poprawy działania aplikacji, lecz nigdy nie pobiera prywatnych danych z Twoich notatek.",
"You can see how it works on ": "You can see how it works on ", "You can see how it works on ": "Możesz zobaczyć jak to działa na platformie",
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "You can choose to enable or disable this option.": "Możesz włączyć lub wyłączyć zbieranie danych tutaj:",
"Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote", "Enable analytics to help improve Boostnote": "Zbieraj dane by pomóc w ulepszaniu Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Droga społeczności,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "Thank you for using Boostnote!": "Dziękujemy za używanie 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.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote jest używany w około 200 krajach i regionach przez wspaniałą społeczność programistów.",
"To continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "To support our growing userbase, and satisfy community expectations,": "Chcielibyśmy poświęcić więcej czasu na rozwój naszego projektu",
"we would like to invest more time and resources in this project.": "we would like to invest more time and resources in this project.", "we would like to invest more time and resources in this project.": "aby popularność i satysfakcja naszej społeczności ciągle wzrastała.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Jeśli podoba Ci się naszy projekt i lubisz go używać, możesz wspomóc nasz przez OpenCollective!",
"Thanks,": "Thanks,", "Thanks,": "Dzięki,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "Kontrybutorzy Boostnote",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Wspomóż przez OpenCollective",
"Language": "Language", "Language": "Język",
"English": "English", "English": "Angielski",
"German": "German", "German": "Niemiecki",
"French": "French", "French": "Francuski",
"Show \"Saved to Clipboard\" notification when copying": "Show \"Saved to Clipboard\" notification when copying", "Show \"Saved to Clipboard\" notification when copying": "Pokazuj \"Skopiowano do schowka\" podczas kopiowania",
"All Notes": "All Notes", "All Notes": "Notatki",
"Starred": "Starred", "Starred": "Oznaczone",
"Are you sure to ": "Are you sure to ", "Are you sure to ": "Czy na pewno chcesz ",
" delete": " delete", " delete": " usunąc",
"this folder?": "this folder?", "this folder?": "ten folder?",
"Confirm": "Confirm", "Confirm": "Potwierdź",
"Cancel": "Cancel", "Cancel": "Anuluj",
"Markdown Note": "Markdown Note", "Markdown Note": "Notatka Markdown",
"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.", "This format is for creating text documents. Checklists, code blocks and Latex blocks are available.": "Ten format pozwala na tworzenie dokumentów tekstowych, list zadań, bloków kodu, czy bloków Latex.",
"Snippet Note": "Snippet Note", "Snippet Note": "Snippet Kodu",
"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.", "This format is for creating code snippets. Multiple snippets can be grouped into a single note.": "Ten format zezwala na tworzenia snippetów kodu. Kilka snippetów można zgrupować w jedną notatkę.",
"Tab to switch format": "Tab to switch format", "Tab to switch format": "Tabulator by zmienić format",
"Updated": "Updated", "Updated": "Ostatnio aktualizowane",
"Created": "Created", "Created": "Data utworzenia",
"Alphabetically": "Alphabetically", "Alphabetically": "Alfabetycznie",
"Default View": "Default View", "Default View": "Widok domyślny",
"Compressed View": "Compressed View", "Compressed View": "Widok skompresowany",
"Search": "Search", "Search": "Szukaj",
"Blog Type": "Blog Type", "Blog Type": "Typ bloga",
"Blog Address": "Blog Address", "Blog Address": "Adres bloga",
"Save": "Save", "Save": "Zapisz",
"Auth": "Auth", "Auth": "Autoryzacja",
"Authentication Method": "Authentication Method", "Authentication Method": "Metoda Autoryzacji",
"JWT": "JWT", "JWT": "JWT",
"USER": "USER", "USER": "Użutkownik",
"Token": "Token", "Token": "Token",
"Storage": "Storage", "Storage": "Storage",
"Hotkeys": "Hotkeys", "Hotkeys": "Skróty klawiszowe",
"Show/Hide Boostnote": "Show/Hide Boostnote", "Show/Hide Boostnote": "Pokaż/Ukryj Boostnote",
"Restore": "Restore", "Restore": "Przywróć",
"Permanent Delete": "Permanent Delete", "Permanent Delete": "Usuń trwale",
"Confirm note deletion": "Confirm note deletion", "Confirm note deletion": "Potwierdź usunięcie notatki",
"This will permanently remove this note.": "This will permanently remove this note.", "This will permanently remove this note.": "Spodowoduje to trwałe usunięcie notatki",
"Successfully applied!": "Successfully applied!", "Successfully applied!": "Sukces!",
"Albanian": "Albanian", "Albanian": "Albański",
"Chinese (zh-CN)": "Chinese (zh-CN)", "Chinese (zh-CN)": "Chiński (zh-CN)",
"Chinese (zh-TW)": "Chinese (zh-TW)", "Chinese (zh-TW)": "Chiński (zh-TW)",
"Danish": "Danish", "Danish": "Duński",
"Japanese": "Japanese", "Japanese": "Japoński",
"Korean": "Korean", "Korean": "Koreański",
"Norwegian": "Norwegian", "Norwegian": "Norweski",
"Polish": "Polish", "Polish": "Polski",
"Portuguese": "Portuguese", "Portuguese": "Portugalski",
"Spanish": "Spanish", "Spanish": "Hiszpański",
"You have to save!": "You have to save!", "Unsaved Changes!": "Musisz zapisać!",
"Russian": "Russian", "Russian": "Rosyjski",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Margines",
"Enable": "Enable", "Enable": "Włącz",
"Disable": "Disable", "Disable": "Wyłącz",
"Sanitization": "Sanitization", "Sanitization": "Sanitization",
"Only allow secure html tags (recommended)": "Only allow secure html tags (recommended)", "Only allow secure html tags (recommended)": "Zezwól tylko na bezpieczne tagi HTML (zalecane)",
"Allow styles": "Allow styles", "Allow styles": "Zezwól na style",
"Allow dangerous html tags": "Allow dangerous html tags", "Allow dangerous html tags": "Zezwól na niebezpieczne tagi 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.", "Convert textual arrows to beautiful signs. ⚠ This will interfere with using HTML comments in your Markdown.": "Konwertuje tekstowe strzałki na znaki. ⚠ Wpłynie to na używanie komentarzy HTML w Twojej notatce.",
"⚠ 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! ⚠": "⚠ 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..."
} }

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Imprimir", "Print": "Imprimir",
"Your preferences for Boostnote": "Suas preferências para o Boostnote", "Your preferences for Boostnote": "Suas preferências para o Boostnote",
"Storages": "Armazenamentos", "Storage Locations": "Armazenamentos",
"Add Storage Location": "Adicionar Local de Armazenamento", "Add Storage Location": "Adicionar Local de Armazenamento",
"Add Folder": "Adicionar Pasta", "Add Folder": "Adicionar Pasta",
"Open Storage folder": "Abrir Local de Armazenamento", "Open Storage folder": "Abrir Local de Armazenamento",
@@ -55,7 +55,7 @@
"Preview": "Pré-Visualização", "Preview": "Pré-Visualização",
"Preview Font Size": "Tamanho da Fonte da Pré-Visualização", "Preview Font Size": "Tamanho da Fonte da Pré-Visualização",
"Preview Font Family": "Família 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", "Code Block Theme": "Tema do Bloco de Código",
"Allow preview to scroll past the last line": "Permitir à pré-visualização rolar além da última linha", "Allow preview to scroll past the last line": "Permitir à pré-visualização rolar 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", "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 em Linha Aberto do LaTeX", "LaTeX Inline Open Delimiter": "Delimitador em Linha Aberto do LaTeX",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "Você pode optar por ativar ou desativar essa opção.", "You can choose to enable or disable this option.": "Você pode optar por ativar ou desativar essa opção.",
"Enable analytics to help improve Boostnote": "Ativar técnicas analíticas para ajudar a melhorar o Boostnote", "Enable analytics to help improve Boostnote": "Ativar técnicas analíticas para ajudar a melhorar o Boostnote",
"Crowdfunding": "Financiamento Coletivo", "Crowdfunding": "Financiamento Coletivo",
"Dear everyone,": "Caros(as),", "Dear Boostnote users,": "Caros(as),",
"Thank you for using Boostnote!": "Obrigado por usar o Boostnote!", "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 desenvolvedores.", "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 desenvolvedores.",
"To continue supporting this growth, and to satisfy community expectations,": "Para continuar apoiando o crescimento e satisfazer as expectativas da comunidade,", "To support our growing userbase, and satisfy community expectations,": "Para continuar apoiando 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.", "we would like to invest more time and resources in this project.": "gostaríamos de investir mais tempo e recursos neste projeto.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Se você gosta deste projeto e vê o seu potencial, você pode nos ajudar apoiando-nos no OpenCollective!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Se você gosta deste projeto e vê o seu potencial, você pode nos ajudar apoiando-nos no OpenCollective!",
"Thanks,": "Obrigado,", "Thanks,": "Obrigado,",
"Boostnote maintainers": "Mantenedores do Boostnote", "The Boostnote Team": "Mantenedores do Boostnote",
"Support via OpenCollective": "Suporte via OpenCollective", "Support via OpenCollective": "Suporte via OpenCollective",
"Language": "Idioma", "Language": "Idioma",
"English": "Inglês", "English": "Inglês",
@@ -141,7 +141,7 @@
"Polish": "Polonês", "Polish": "Polonês",
"Portuguese": "Português (pt-BR)", "Portuguese": "Português (pt-BR)",
"Spanish": "Espanhol", "Spanish": "Espanhol",
"You have to save!": "Você precisa salvar!", "Unsaved Changes!": "Você precisa salvar!",
"Russian": "Russo", "Russian": "Russo",
"Editor Rulers": "Réguas do Editor", "Editor Rulers": "Réguas do Editor",
"Enable": "Habilitado", "Enable": "Habilitado",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote", "Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages", "Storage Locations": "Storage Locations",
"Add Storage Location": "Add Storage Location", "Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder", "Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder", "Open Storage folder": "Open Storage folder",
@@ -55,7 +55,7 @@
"Preview": "Preview", "Preview": "Preview",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family", "Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme", "Code Block Theme": "Code Block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -83,14 +83,14 @@
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "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", "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Dear Boostnote users,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "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.", "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 continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "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.", "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 like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "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,", "Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "The Boostnote Team",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Language", "Language": "Language",
"English": "English", "English": "English",
@@ -141,7 +141,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "You have to save!", "Unsaved Changes!": "Unsaved Changes!",
"Russian": "Russian", "Russian": "Russian",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Editor Rulers",
"Enable": "Enable", "Enable": "Enable",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Print",
"Your preferences for Boostnote": "Настройки Boostnote", "Your preferences for Boostnote": "Настройки Boostnote",
"Storages": "Хранилища", "Storage Locations": "Хранилища",
"Add Storage Location": "Добавить хранилище", "Add Storage Location": "Добавить хранилище",
"Add Folder": "Добавить папку", "Add Folder": "Добавить папку",
"Open Storage folder": "Открыть хранилище", "Open Storage folder": "Открыть хранилище",
@@ -55,7 +55,7 @@
"Preview": "Preview", "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": "Символ начала inline записи в LaTeX", "LaTeX Inline Open Delimiter": "Символ начала inline записи в LaTeX",
@@ -82,14 +82,14 @@
"You can choose to enable or disable this option.": "Вы можете отказаться от передачи анонимной информации разработчикам.", "You can choose to enable or disable this option.": "Вы можете отказаться от передачи анонимной информации разработчикам.",
"Enable analytics to help improve Boostnote": "Отправлять анонимные данные, чтобы сделать Boostnote еще лучше", "Enable analytics to help improve Boostnote": "Отправлять анонимные данные, чтобы сделать Boostnote еще лучше",
"Crowdfunding": "Краудфандинг", "Crowdfunding": "Краудфандинг",
"Dear everyone,": "Привет,", "Dear Boostnote users,": "Привет,",
"Thank you for using Boostnote!": "Спасибо за использование Boostnote!", "Thank you for using Boostnote!": "Спасибо за использование Boostnote!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote используется в 200 странах и регионов дружным сообществом разработчиков.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote используется в 200 странах и регионов дружным сообществом разработчиков.",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "Если вам нравится Boostnote и его сообщество, вы можете профинансировать проект на OpenCollective!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Если вам нравится Boostnote и его сообщество, вы можете профинансировать проект на OpenCollective!",
"Thanks,": "Спасибо,", "Thanks,": "Спасибо,",
"Boostnote maintainers": "разработчики Boostnote", "The Boostnote Team": "разработчики Boostnote",
"Support via OpenCollective": "Старница проекта на OpenCollective", "Support via OpenCollective": "Старница проекта на OpenCollective",
"Language": "Язык", "Language": "Язык",
"English": "Английский", "English": "Английский",
@@ -140,7 +140,7 @@
"Polish": "Польский", "Polish": "Польский",
"Portuguese": "Португальский", "Portuguese": "Португальский",
"Spanish": "Испанский", "Spanish": "Испанский",
"You have to save!": "Нужно сохранить!", "Unsaved Changes!": "Нужно сохранить!",
"UserName": "Имя пользователя", "UserName": "Имя пользователя",
"Password": "Пароль", "Password": "Пароль",
"Russian": "Русский", "Russian": "Русский",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Print", "Print": "Print",
"Your preferences for Boostnote": "Your preferences for Boostnote", "Your preferences for Boostnote": "Your preferences for Boostnote",
"Storages": "Storages", "Storage Locations": "Storage Locations",
"Add Storage Location": "Add Storage Location", "Add Storage Location": "Add Storage Location",
"Add Folder": "Add Folder", "Add Folder": "Add Folder",
"Open Storage folder": "Open Storage folder", "Open Storage folder": "Open Storage folder",
@@ -55,7 +55,7 @@
"Preview": "Preview", "Preview": "Preview",
"Preview Font Size": "Preview Font Size", "Preview Font Size": "Preview Font Size",
"Preview Font Family": "Preview Font Family", "Preview Font Family": "Preview Font Family",
"Code block Theme": "Code block Theme", "Code Block Theme": "Code Block Theme",
"Allow preview to scroll past the last line": "Allow preview to scroll past the last line", "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", "Show line numbers for preview code blocks": "Show line numbers for preview code blocks",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -82,14 +82,14 @@
"You can choose to enable or disable this option.": "You can choose to enable or disable this option.", "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", "Enable analytics to help improve Boostnote": "Enable analytics to help improve Boostnote",
"Crowdfunding": "Crowdfunding", "Crowdfunding": "Crowdfunding",
"Dear everyone,": "Dear everyone,", "Dear Boostnote users,": "Dear Boostnote users,",
"Thank you for using Boostnote!": "Thank you for using Boostnote!", "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.", "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 continue supporting this growth, and to satisfy community expectations,": "To continue supporting this growth, and to satisfy community expectations,", "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.", "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 like this project and see its potential, you can help by supporting us on OpenCollective!": "If you like this project and see its potential, you can help by supporting us on OpenCollective!", "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,", "Thanks,": "Thanks,",
"Boostnote maintainers": "Boostnote maintainers", "The Boostnote Team": "The Boostnote Team",
"Support via OpenCollective": "Support via OpenCollective", "Support via OpenCollective": "Support via OpenCollective",
"Language": "Language", "Language": "Language",
"English": "English", "English": "English",
@@ -140,7 +140,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "You have to save!", "Unsaved Changes!": "Unsaved Changes!",
"Russian": "Russian", "Russian": "Russian",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Editor Rulers",
"Enable": "Enable", "Enable": "Enable",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "Yazdır", "Print": "Yazdır",
"Your preferences for Boostnote": "Boostnote tercihleriniz", "Your preferences for Boostnote": "Boostnote tercihleriniz",
"Storages": "Saklama Alanları", "Storage Locations": "Saklama Alanları",
"Add Storage Location": "Saklama Yeri Ekle", "Add Storage Location": "Saklama Yeri Ekle",
"Add Folder": "Dosya Ekle", "Add Folder": "Dosya Ekle",
"Open Storage folder": "Saklama Alanı Dosyasını Aç", "Open Storage folder": "Saklama Alanı Dosyasını Aç",
@@ -55,7 +55,7 @@
"Preview": "Önizleme", "Preview": "Önizleme",
"Preview Font Size": "Yazı Büyüklüğünü Önizle", "Preview Font Size": "Yazı Büyüklüğünü Önizle",
"Preview Font Family": "Yazı Tipini Önizle", "Preview Font Family": "Yazı Tipini Önizle",
"Code block Theme": "Kod bloğu Teması", "Code Block Theme": "Kod bloğu Teması",
"Allow preview to scroll past the last line": "Önizlemenin son satırı geçmesine izin ver", "Allow preview to scroll past the last line": "Önizlemenin son satırı geçmesine izin ver",
"Show line numbers for preview code blocks": "Kod bloklarının önizlemesinde satır numaralarını göster", "Show line numbers for preview code blocks": "Kod bloklarının önizlemesinde satır numaralarını göster",
"LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter", "LaTeX Inline Open Delimiter": "LaTeX Inline Open Delimiter",
@@ -82,14 +82,14 @@
"You can choose to enable or disable this option.": "Bu seçeneği etkinleştirmeyi veya devre dışı bırakmayı seçebilirsiniz.", "You can choose to enable or disable this option.": "Bu seçeneği etkinleştirmeyi veya devre dışı bırakmayı seçebilirsiniz.",
"Enable analytics to help improve Boostnote": "Boostnote'un geliştirilmesine katkıda bulunmak için analizleri etkinleştirin", "Enable analytics to help improve Boostnote": "Boostnote'un geliştirilmesine katkıda bulunmak için analizleri etkinleştirin",
"Crowdfunding": "Kitle Fonlaması", "Crowdfunding": "Kitle Fonlaması",
"Dear everyone,": "Sevgili herkes,", "Dear Boostnote users,": "Sevgili herkes,",
"Thank you for using Boostnote!": "Boostnote'u kullandığınız için teşekkürler!", "Thank you for using Boostnote!": "Boostnote'u kullandığınız için teşekkürler!",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote, 200 farklı ülke ve bölgede, harika bir geliştirici topluluğu tarafından kullanılmaktadır.", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "Boostnote, 200 farklı ülke ve bölgede, harika bir geliştirici topluluğu tarafından kullanılmaktadır.",
"To continue supporting this growth, and to satisfy community expectations,": "Bu büyümeyi desteklemeye devam etmek ve topluluk beklentilerini karşılamak için,", "To support our growing userbase, and satisfy community expectations,": "Bu büyümeyi desteklemeye devam etmek ve topluluk beklentilerini karşılamak için,",
"we would like to invest more time and resources in this project.": "bu projeye daha fazla zaman ve kaynak yatırmak istiyoruz.", "we would like to invest more time and resources in this project.": "bu projeye daha fazla zaman ve kaynak yatırmak istiyoruz.",
"If you like this project and see its potential, you can help by supporting us on OpenCollective!": "Bu projeyi beğeniyor ve potansiyel görüyorsanız, OpenCollective üzerinden bizi destekleyerek katkıda bulunabilirsiniz!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "Bu projeyi beğeniyor ve potansiyel görüyorsanız, OpenCollective üzerinden bizi destekleyerek katkıda bulunabilirsiniz!",
"Thanks,": "Teşekkürler,", "Thanks,": "Teşekkürler,",
"Boostnote maintainers": "Boostnote'un bakımını yapanlar", "The Boostnote Team": "Boostnote'un bakımını yapanlar",
"Support via OpenCollective": "OpenCollective aracılığıyla destekle", "Support via OpenCollective": "OpenCollective aracılığıyla destekle",
"Language": "Dil", "Language": "Dil",
"English": "İngilizce", "English": "İngilizce",
@@ -140,7 +140,7 @@
"Polish": "Lehçe", "Polish": "Lehçe",
"Portuguese": "Portekizce", "Portuguese": "Portekizce",
"Spanish": "İspanyolca", "Spanish": "İspanyolca",
"You have to save!": "Kaydetmelisiniz!", "Unsaved Changes!": "Kaydetmelisiniz!",
"UserName": "KullanıcıAdı", "UserName": "KullanıcıAdı",
"Password": "Şifre", "Password": "Şifre",
"Russian": "Rusça", "Russian": "Rusça",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "打印", "Print": "打印",
"Your preferences for Boostnote": "个性设置", "Your preferences for Boostnote": "个性设置",
"Storages": "本地存储", "Storage Locations": "本地存储",
"Add Storage Location": "添加一个本地存储位置", "Add Storage Location": "添加一个本地存储位置",
"Add Folder": "新建文件夹", "Add Folder": "新建文件夹",
"Open Storage folder": "打开本地存储文件夹", "Open Storage folder": "打开本地存储文件夹",
@@ -56,7 +56,7 @@
"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 单行开头分隔符", "LaTeX Inline Open Delimiter": "LaTeX 单行开头分隔符",
@@ -84,14 +84,14 @@
"You can choose to enable or disable this option.": "你可以选择开启或不开启这个功能", "You can choose to enable or disable this option.": "你可以选择开启或不开启这个功能",
"Enable analytics to help improve Boostnote": "允许对数据进行分析,帮助我们改进 Boostnote", "Enable analytics to help improve Boostnote": "允许对数据进行分析,帮助我们改进 Boostnote",
"Crowdfunding": "众筹", "Crowdfunding": "众筹",
"Dear everyone,": "亲爱的用户:", "Dear Boostnote users,": "亲爱的用户:",
"Thank you for using Boostnote!": "谢谢你使用 Boostnote", "Thank you for using Boostnote!": "谢谢你使用 Boostnote",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大约有200个不同的国家和地区的优秀开发者们都在使用 Boostnote", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大约有200个不同的国家和地区的优秀开发者们都在使用 Boostnote",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "如果你喜欢这款软件并且看好它的潜力, 请在 OpenCollective 上支持我们!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "如果你喜欢这款软件并且看好它的潜力, 请在 OpenCollective 上支持我们!",
"Thanks,": "十分感谢!", "Thanks,": "十分感谢!",
"Boostnote maintainers": "Boostnote 的维护人员", "The Boostnote Team": "Boostnote 的维护人员",
"Support via OpenCollective": "在 OpenCollective 上支持我们", "Support via OpenCollective": "在 OpenCollective 上支持我们",
"Language": "语言", "Language": "语言",
"English": "English", "English": "English",
@@ -143,7 +143,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "你必须保存一下!", "Unsaved Changes!": "你必须保存一下!",
"Russian": "Russian", "Russian": "Russian",
"Editor Rulers": "Editor Rulers", "Editor Rulers": "Editor Rulers",
"Enable": "开启", "Enable": "开启",

View File

@@ -20,7 +20,7 @@
".html": ".html", ".html": ".html",
"Print": "列印", "Print": "列印",
"Your preferences for Boostnote": "Boostnote 偏好設定", "Your preferences for Boostnote": "Boostnote 偏好設定",
"Storages": "儲存空間", "Storage Locations": "儲存空間",
"Add Storage Location": "新增儲存位置", "Add Storage Location": "新增儲存位置",
"Add Folder": "新增資料夾", "Add Folder": "新增資料夾",
"Open Storage folder": "開啟儲存資料夾", "Open Storage folder": "開啟儲存資料夾",
@@ -55,7 +55,7 @@
"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 單行開頭符號", "LaTeX Inline Open Delimiter": "LaTeX 單行開頭符號",
@@ -82,14 +82,14 @@
"You can choose to enable or disable this option.": "你可以選擇啟用或停用這項功能", "You can choose to enable or disable this option.": "你可以選擇啟用或停用這項功能",
"Enable analytics to help improve Boostnote": "允許數據分析以協助我們改進 Boostnote", "Enable analytics to help improve Boostnote": "允許數據分析以協助我們改進 Boostnote",
"Crowdfunding": "群眾募資", "Crowdfunding": "群眾募資",
"Dear everyone,": "親愛的用戶:", "Dear Boostnote users,": "親愛的用戶:",
"Thank you for using Boostnote!": "謝謝你使用 Boostnote", "Thank you for using Boostnote!": "謝謝你使用 Boostnote",
"Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大約有 200 個不同的國家和地區的優秀開發者們都在使用 Boostnote", "Boostnote is used in about 200 different countries and regions by an awesome community of developers.": "大約有 200 個不同的國家和地區的優秀開發者們都在使用 Boostnote",
"To continue supporting this growth, and to 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 like this project and see its potential, you can help by supporting us on OpenCollective!": "如果你喜歡這款軟體並且看好它的潛力, 請在 OpenCollective 上支持我們!", "If you use Boostnote and see its potential, help us out by supporting the project on OpenCollective!": "如果你喜歡這款軟體並且看好它的潛力, 請在 OpenCollective 上支持我們!",
"Thanks,": "十分感謝!", "Thanks,": "十分感謝!",
"Boostnote maintainers": "Boostnote 的維護人員", "The Boostnote Team": "Boostnote 的維護人員",
"Support via OpenCollective": "在 OpenCollective 上支持我們", "Support via OpenCollective": "在 OpenCollective 上支持我們",
"Language": "語言", "Language": "語言",
"English": "English", "English": "English",
@@ -140,7 +140,7 @@
"Polish": "Polish", "Polish": "Polish",
"Portuguese": "Portuguese", "Portuguese": "Portuguese",
"Spanish": "Spanish", "Spanish": "Spanish",
"You have to save!": "你必須儲存一下!", "Unsaved Changes!": "你必須儲存一下!",
"Russian": "Russian", "Russian": "Russian",
"Editor Rulers": "編輯器中顯示垂直尺規", "Editor Rulers": "編輯器中顯示垂直尺規",
"Enable": "啟用", "Enable": "啟用",

View File

@@ -58,6 +58,7 @@
"electron-config": "^1.0.0", "electron-config": "^1.0.0",
"electron-gh-releases": "^2.0.2", "electron-gh-releases": "^2.0.2",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
"file-uri-to-path": "^1.0.0",
"file-url": "^2.0.2", "file-url": "^2.0.2",
"filenamify": "^2.0.0", "filenamify": "^2.0.0",
"flowchart.js": "^1.6.5", "flowchart.js": "^1.6.5",
@@ -81,6 +82,7 @@
"markdown-it-named-headers": "^0.0.4", "markdown-it-named-headers": "^0.0.4",
"markdown-it-plantuml": "^1.1.0", "markdown-it-plantuml": "^1.1.0",
"markdown-it-smartarrows": "^1.0.1", "markdown-it-smartarrows": "^1.0.1",
"markdown-toc": "^1.2.0",
"mdurl": "^1.0.1", "mdurl": "^1.0.1",
"mermaid": "^8.0.0-rc.8", "mermaid": "^8.0.0-rc.8",
"moment": "^2.10.3", "moment": "^2.10.3",
@@ -89,6 +91,7 @@
"node-ipc": "^8.1.0", "node-ipc": "^8.1.0",
"raphael": "^2.2.7", "raphael": "^2.2.7",
"react": "^15.5.4", "react": "^15.5.4",
"react-autosuggest": "^9.4.0",
"react-codemirror": "^0.3.0", "react-codemirror": "^0.3.0",
"react-debounce-render": "^4.0.1", "react-debounce-render": "^4.0.1",
"react-dom": "^15.0.2", "react-dom": "^15.0.2",

View File

@@ -1,10 +1,10 @@
:mega: The Boostnote team launches [IssueHunt](https://issuehunt.io/) for sustainable open-source ecosystem. :mega: The Boostnote team uses [IssueHunt](https://issuehunt.io/) for a sustainable open-source ecosystem.
![Boostnote app screenshot](./resources/repository/top.png) ![Boostnote app screenshot](./resources/repository/top.png)
<h4 align="center">Note-taking app for programmers. </h4> <h4 align="center">Note-taking app for programmers. </h4>
<h5 align="center">Apps available for Mac, Windows, Linux, Android and iOS.</h5> <h5 align="center">Apps available for Mac, Windows, Linux, Android, and iOS.</h5>
<h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules.</h5> <h5 align="center">Built with Electron, React + Redux, Webpack, and CSSModules.</h5>
[![Build Status](https://travis-ci.org/BoostIO/Boostnote.svg?branch=master)](https://travis-ci.org/BoostIO/Boostnote) [![Build Status](https://travis-ci.org/BoostIO/Boostnote.svg?branch=master)](https://travis-ci.org/BoostIO/Boostnote)
@@ -12,16 +12,17 @@
- [Rokt33r](https://github.com/rokt33r) - [Rokt33r](https://github.com/rokt33r)
- [Sosuke](https://github.com/sosukesuzuki) - [Sosuke](https://github.com/sosukesuzuki)
- [Kazz](https://github.com/kazup01) - [Kazz](https://github.com/kazup01)
- [ZeroX-DG](https://github.com/ZeroX-DG)
## Contributors ## Contributors
Thank you to all the people who already contributed to Boostnote! Thank you to all the people who have contributed to Boostnote!
<a href="https://github.com/BoostIO/Boostnote/graphs/contributors"><img src="https://opencollective.com/boostnoteio/contributors.svg?width=890" /></a> <a href="https://github.com/BoostIO/Boostnote/graphs/contributors"><img src="https://opencollective.com/boostnoteio/contributors.svg?width=890" /></a>
## Supporting Boostnote ## Supporting Boostnote
Boostnote is an open source project. It's an independent project with its ongoing development made possible entirely thanks to the support by these awesome backers. Boostnote is an open source project. It's an independent project with its ongoing development made possible thanks to the support by our amazing backers.
Any issues on Boostnote can be funded by anyone and that money will be distributed to contributors and maintainers. If you'd like to join them, please consider: Issues on Boostnote can be funded by anyone and the money will be distributed to contributors and maintainers. If you use Boostnote please consider becoming a backer:
[![issuehunt-image](https://github.com/BoostIO/issuehunt-materials/blob/master/issuehunt-badge@1x.png?raw=true)](https://issuehunt.io/repos/53266139) [![issuehunt-image](https://github.com/BoostIO/issuehunt-materials/blob/master/issuehunt-badge@1x.png?raw=true)](https://issuehunt.io/repos/53266139)

View File

@@ -0,0 +1,52 @@
const test = require('ava')
const exportStorage = require('browser/main/lib/dataApi/exportStorage')
global.document = require('jsdom').jsdom('<body></body>')
global.window = document.defaultView
global.navigator = window.navigator
const Storage = require('dom-storage')
const localStorage = window.localStorage = global.localStorage = new Storage(null, { strict: true })
const path = require('path')
const TestDummy = require('../fixtures/TestDummy')
const os = require('os')
const fs = require('fs')
const sander = require('sander')
test.beforeEach(t => {
t.context.storageDir = path.join(os.tmpdir(), 'test/export-storage')
t.context.storage = TestDummy.dummyStorage(t.context.storageDir)
t.context.exportDir = path.join(os.tmpdir(), 'test/export-storage-output')
try { fs.mkdirSync(t.context.exportDir) } catch (e) {}
localStorage.setItem('storages', JSON.stringify([t.context.storage.cache]))
})
test.serial('Export a storage', t => {
const storageKey = t.context.storage.cache.key
const folders = t.context.storage.json.folders
const notes = t.context.storage.notes
const exportDir = t.context.exportDir
const folderKeyToName = folders.reduce(
(acc, folder) => {
acc[folder.key] = folder.name
return acc
}, {})
return exportStorage(storageKey, 'md', exportDir)
.then(() => {
notes.forEach(note => {
const noteDir = path.join(exportDir, folderKeyToName[note.folder], `${note.title}.md`)
if (note.type === 'MARKDOWN_NOTE') {
t.true(fs.existsSync(noteDir))
t.is(fs.readFileSync(noteDir, 'utf8'), note.content)
} else if (note.type === 'SNIPPET_NOTE') {
t.false(fs.existsSync(noteDir))
}
})
})
})
test.afterEach.always(t => {
localStorage.clear()
sander.rimrafSync(t.context.storageDir)
sander.rimrafSync(t.context.exportDir)
})

View File

@@ -1,5 +1,23 @@
import browserEnv from 'browser-env' import browserEnv from 'browser-env'
browserEnv(['window', 'document']) browserEnv(['window', 'document', 'navigator'])
// for CodeMirror mockup
document.body.createTextRange = function () {
return {
setEnd: function () {},
setStart: function () {},
getBoundingClientRect: function () {
return {right: 0}
},
getClientRects: function () {
return {
length: 0,
left: 0,
right: 0
}
}
}
}
window.localStorage = { window.localStorage = {
// polyfill // polyfill

View File

@@ -14,7 +14,8 @@ test('findNoteTitle#find should return a correct title (string)', t => {
['hoge\n====\nfuga', 'hoge'], ['hoge\n====\nfuga', 'hoge'],
['====', '===='], ['====', '===='],
['```\n# hoge\n```', '```'], ['```\n# hoge\n```', '```'],
['hoge', 'hoge'] ['hoge', 'hoge'],
['---\nlayout: test\n---\n # hoge', '# hoge']
] ]
testCases.forEach(testCase => { testCases.forEach(testCase => {

View File

@@ -0,0 +1,668 @@
/**
* @fileoverview Unit test for browser/lib/markdown-toc-generator
*/
import CodeMirror from 'codemirror'
require('codemirror/addon/search/searchcursor.js')
const test = require('ava')
const markdownToc = require('browser/lib/markdown-toc-generator')
const EOL = require('os').EOL
test(t => {
/**
* Contains array of test cases in format :
* [
* test title
* input markdown,
* expected toc
* ]
* @type {*[]}
*/
const testCases = [
[
'***************************** empty note',
`
`,
`
<!-- toc -->
<!-- tocstop -->
`
],
[
'***************************** single level',
`
# one
`,
`
<!-- toc -->
- [one](#one)
<!-- tocstop -->
`
],
[
'***************************** two levels',
`
# one
# two
`,
`
<!-- toc -->
- [one](#one)
- [two](#two)
<!-- tocstop -->
`
],
[
'***************************** 3 levels with children',
`
# one
## one one
# two
## two two
# three
## three three
`,
`
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
- [three](#three)
* [three three](#three-three)
<!-- tocstop -->
`
],
[
'***************************** 3 levels, 3rd with 6 sub-levels',
`
# one
## one one
# two
## two two
# three
## three three
### three three three
#### three three three three
##### three three three three three
###### three three three three three three
`,
`
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
- [three](#three)
* [three three](#three-three)
+ [three three three](#three-three-three)
- [three three three three](#three-three-three-three)
* [three three three three three](#three-three-three-three-three)
+ [three three three three three three](#three-three-three-three-three-three)
<!-- tocstop -->
`
],
[
'***************************** multilevel with texts in between',
`
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
# three
this is a level three three text
this is a level three three text
## three three
this is a text
this is a text
### three three three
this is a text
this is a text
### three three three 2
this is a text
this is a text
#### three three three three
this is a text
this is a text
#### three three three three 2
this is a text
this is a text
##### three three three three three
this is a text
this is a text
##### three three three three three 2
this is a text
this is a text
###### three three three three three three
this is a text
this is a text
this is a text
`,
`
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
- [three](#three)
* [three three](#three-three)
+ [three three three](#three-three-three)
+ [three three three 2](#three-three-three-2)
- [three three three three](#three-three-three-three)
- [three three three three 2](#three-three-three-three-2)
* [three three three three three](#three-three-three-three-three)
* [three three three three three 2](#three-three-three-three-three-2)
+ [three three three three three three](#three-three-three-three-three-three)
<!-- tocstop -->
`
],
[
'***************************** outdated TOC',
`
<!-- toc -->
- [one](#one)
* [one one](#one-one)
<!-- tocstop -->
# one modified
## one one
`,
`
<!-- toc -->
- [one modified](#one-modified)
* [one one](#one-one)
<!-- tocstop -->
`
],
[
'***************************** properly generated case sensitive TOC',
`
# onE
## oNe one
`,
`
<!-- toc -->
- [onE](#onE)
* [oNe one](#oNe-one)
<!-- tocstop -->
`
],
[
'***************************** position of TOC is stable (do not use elements above toc marker)',
`
# title
this is a text
<!-- toc -->
- [onE](#onE)
* [oNe one](#oNe-one)
<!-- tocstop -->
# onE
## oNe one
`,
`
<!-- toc -->
- [onE](#onE)
* [oNe one](#oNe-one)
<!-- tocstop -->
`
],
[
'***************************** properly handle generation of not completed TOC',
`
# hoge
##
`,
`
<!-- toc -->
- [hoge](#hoge)
<!-- tocstop -->
`
]
]
testCases.forEach(testCase => {
const title = testCase[0]
const inputMd = testCase[1].trim()
const expectedToc = testCase[2].trim()
const generatedToc = markdownToc.generate(inputMd)
t.is(generatedToc, expectedToc, `generate test : ${title} , generated : ${EOL}${generatedToc}, expected : ${EOL}${expectedToc}`)
})
})
test(t => {
/**
* Contains array of test cases in format :
* [
* title
* cursor
* inputMd
* expectedMd
* ]
* @type {*[]}
*/
const testCases = [
[
`***************************** Empty note, cursor at the top`,
{line: 0, ch: 0},
``,
`
<!-- toc -->
<!-- tocstop -->
`
],
[
`***************************** Two level note,TOC at the beginning `,
{line: 0, ch: 0},
`
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Two level note, cursor just after 'header text' `,
{line: 1, ch: 12},
`
# header
header text
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header text
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Two level note, cursor at empty line under 'header text' `,
{line: 2, ch: 0},
`
# header
header text
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header text
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Two level note, cursor just before 'text' word`,
{line: 1, ch: 8},
`
# header
header text
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
text
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Already generated TOC without header file, regenerate TOC in place, no changes`,
{line: 13, ch: 0},
`
# header
header text
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header text
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Already generated TOC, needs updating in place`,
{line: 0, ch: 0},
`
# header
header text
<!-- toc -->
- [one](#one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header text
<!-- toc -->
- [This is the one](#This-is-the-one)
* [one one](#one-one)
- [two](#two)
* [two two](#two-two)
<!-- tocstop -->
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`
],
[
`***************************** Document with cursor at the last line, expecting empty TOC `,
{line: 13, ch: 30},
`
# header
header text
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
`,
`
# header
header text
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
<!-- toc -->
<!-- tocstop -->
`
],
[
`***************************** Empty, not actual TOC , should be supplemented with two new points beneath`,
{line: 0, ch: 0},
`
# header
header text
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
<!-- toc -->
<!-- tocstop -->
# new point included in toc
## new subpoint
`,
`
# header
header text
# This is the one
this is a level one text
this is a level one text
## one one
# two
this is a level two text
this is a level two text
## two two
this is a level two two text
this is a level two two text
<!-- toc -->
- [new point included in toc](#new-point-included-in-toc)
* [new subpoint](#new-subpoint)
<!-- tocstop -->
# new point included in toc
## new subpoint
`
]
]
testCases.forEach(testCase => {
const title = testCase[0]
const cursor = testCase[1]
const inputMd = testCase[2].trim()
const expectedMd = testCase[3].trim()
const editor = CodeMirror()
editor.setValue(inputMd)
editor.setCursor(cursor)
markdownToc.generateInEditor(editor)
t.is(expectedMd, editor.getValue(), `generateInEditor test : ${title} , generated : ${EOL}${editor.getValue()}, expected : ${EOL}${expectedMd}`)
})
})

View File

@@ -39,7 +39,7 @@ Generated by [AVA](https://ava.li).
> Snapshot 1 > Snapshot 1
`<pre class="code CodeMirror">␊ `<pre class="code CodeMirror" data-line="1">␊
<span class="filename">filename.js</span>␊ <span class="filename">filename.js</span>␊
<span class="lineNumber CodeMirror-gutters"><span class="CodeMirror-linenumber">2</span></span>␊ <span class="lineNumber CodeMirror-gutters"><span class="CodeMirror-linenumber">2</span></span>␊
<code class="js">var project = 'boostnote';␊ <code class="js">var project = 'boostnote';␊

View File

@@ -41,6 +41,7 @@ var config = {
'markdown-it-kbd', 'markdown-it-kbd',
'markdown-it-plantuml', 'markdown-it-plantuml',
'markdown-it-admonition', 'markdown-it-admonition',
'markdown-toc',
'devtron', 'devtron',
'@rokt33r/season', '@rokt33r/season',
{ {

133
yarn.lock
View File

@@ -188,6 +188,12 @@ ansi-escapes@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
ansi-red@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
dependencies:
ansi-wrap "0.1.0"
ansi-regex@^0.2.0, ansi-regex@^0.2.1: ansi-regex@^0.2.0, ansi-regex@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9"
@@ -218,6 +224,10 @@ ansi-styles@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
ansi-wrap@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
anymatch@^1.3.0: anymatch@^1.3.0:
version "1.3.2" version "1.3.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -255,7 +265,7 @@ argparse@^1.0.7, argparse@~1.0.3:
dependencies: dependencies:
sprintf-js "~1.0.2" sprintf-js "~1.0.2"
"argparse@~ 0.1.11": "argparse@~ 0.1.11", argparse@~0.1.15:
version "0.1.16" version "0.1.16"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c" resolved "https://registry.yarnpkg.com/argparse/-/argparse-0.1.16.tgz#cfd01e0fbba3d6caed049fbd758d40f65196f57c"
dependencies: dependencies:
@@ -459,6 +469,10 @@ auto-bind@^1.1.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.0.tgz#8b7e318aad53d43ba8a8ecaf0066d85d5f798cd6" resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.0.tgz#8b7e318aad53d43ba8a8ecaf0066d85d5f798cd6"
autolinker@~0.15.0:
version "0.15.3"
resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.15.3.tgz#342417d8f2f3461b14cf09088d5edf8791dc9832"
autoprefixer@^6.3.1: autoprefixer@^6.3.1:
version "6.7.7" version "6.7.7"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
@@ -1793,7 +1807,7 @@ codemirror@^5.39.0:
version "5.39.0" version "5.39.0"
resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.39.0.tgz#4654f7d2f7e525e04a62e72d9482348ccb37dce5" resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.39.0.tgz#4654f7d2f7e525e04a62e72d9482348ccb37dce5"
coffee-script@^1.10.0: coffee-script@^1.10.0, coffee-script@^1.12.4:
version "1.12.7" version "1.12.7"
resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53"
@@ -2666,6 +2680,10 @@ devtron@^1.1.0:
highlight.js "^9.3.0" highlight.js "^9.3.0"
humanize-plus "^1.8.1" humanize-plus "^1.8.1"
diacritics-map@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/diacritics-map/-/diacritics-map-0.1.0.tgz#6dfc0ff9d01000a2edf2865371cac316e94977af"
diff@^3.2.0: diff@^3.2.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -3502,6 +3520,10 @@ file-entry-cache@^2.0.0:
flat-cache "^1.2.1" flat-cache "^1.2.1"
object-assign "^4.0.1" object-assign "^4.0.1"
file-uri-to-path@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
file-url@^2.0.2: file-url@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae" resolved "https://registry.yarnpkg.com/file-url/-/file-url-2.0.2.tgz#e951784d79095127d3713029ab063f40818ca2ae"
@@ -4030,6 +4052,16 @@ graphlibrary@^2.2.0:
dependencies: dependencies:
lodash "^4.17.5" lodash "^4.17.5"
gray-matter@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e"
dependencies:
ansi-red "^0.1.1"
coffee-script "^1.12.4"
extend-shallow "^2.0.1"
js-yaml "^3.8.1"
toml "^2.3.2"
growly@^1.3.0: growly@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -5254,7 +5286,7 @@ js-yaml@^3.10.0, js-yaml@^3.5.1, js-yaml@^3.7.0:
argparse "^1.0.7" argparse "^1.0.7"
esprima "^4.0.0" esprima "^4.0.0"
js-yaml@^3.12.0: js-yaml@^3.12.0, js-yaml@^3.8.1:
version "3.12.0" version "3.12.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
dependencies: dependencies:
@@ -5494,6 +5526,12 @@ lazy-cache@^1.0.3:
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
lazy-cache@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
dependencies:
set-getter "^0.1.0"
lcid@^1.0.0: lcid@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@@ -5521,6 +5559,15 @@ linkify-it@~1.2.0, linkify-it@~1.2.2:
dependencies: dependencies:
uc.micro "^1.0.1" uc.micro "^1.0.1"
list-item@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/list-item/-/list-item-1.1.1.tgz#0c65d00e287cb663ccb3cb3849a77e89ec268a56"
dependencies:
expand-range "^1.8.1"
extend-shallow "^2.0.1"
is-number "^2.1.0"
repeat-string "^1.5.2"
load-json-file@^1.0.0: load-json-file@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -5790,6 +5837,27 @@ markdown-it@^6.0.1:
mdurl "~1.0.1" mdurl "~1.0.1"
uc.micro "^1.0.1" uc.micro "^1.0.1"
markdown-link@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/markdown-link/-/markdown-link-0.1.1.tgz#32c5c65199a6457316322d1e4229d13407c8c7cf"
markdown-toc@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/markdown-toc/-/markdown-toc-1.2.0.tgz#44a15606844490314afc0444483f9e7b1122c339"
dependencies:
concat-stream "^1.5.2"
diacritics-map "^0.1.0"
gray-matter "^2.1.0"
lazy-cache "^2.0.2"
list-item "^1.1.1"
markdown-link "^0.1.1"
minimist "^1.2.0"
mixin-deep "^1.1.3"
object.pick "^1.2.0"
remarkable "^1.7.1"
repeat-string "^1.6.1"
strip-color "^0.1.0"
match-at@^0.1.1: match-at@^0.1.1:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/match-at/-/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540" resolved "https://registry.yarnpkg.com/match-at/-/match-at-0.1.1.tgz#25d040d291777704d5e6556bbb79230ec2de0540"
@@ -6035,7 +6103,7 @@ minizlib@^1.1.0:
dependencies: dependencies:
minipass "^2.2.1" minipass "^2.2.1"
mixin-deep@^1.2.0: mixin-deep@^1.1.3, mixin-deep@^1.2.0:
version "1.3.1" version "1.3.1"
resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
dependencies: dependencies:
@@ -6359,6 +6427,10 @@ oauth-sign@~0.8.2:
version "0.8.2" version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
object-assign@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1" version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -6403,7 +6475,7 @@ object.omit@^2.0.0:
for-own "^0.1.4" for-own "^0.1.4"
is-extendable "^0.1.1" is-extendable "^0.1.1"
object.pick@^1.3.0: object.pick@^1.2.0, object.pick@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
dependencies: dependencies:
@@ -7197,6 +7269,22 @@ rcedit@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-1.1.0.tgz#ae21c28d4efdd78e95fcab7309a5dd084920b16a" resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-1.1.0.tgz#ae21c28d4efdd78e95fcab7309a5dd084920b16a"
react-autosuggest@^9.4.0:
version "9.4.2"
resolved "https://registry.yarnpkg.com/react-autosuggest/-/react-autosuggest-9.4.2.tgz#18cc0bebeebda3d24328e3da301f061a444ae223"
dependencies:
prop-types "^15.5.10"
react-autowhatever "^10.1.2"
shallow-equal "^1.0.0"
react-autowhatever@^10.1.2:
version "10.1.2"
resolved "https://registry.yarnpkg.com/react-autowhatever/-/react-autowhatever-10.1.2.tgz#200ffc41373b2189e3f6140ac7bdb82363a79fd3"
dependencies:
prop-types "^15.5.8"
react-themeable "^1.1.0"
section-iterator "^2.0.0"
react-codemirror@^0.3.0: react-codemirror@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-0.3.0.tgz#cd6bd6ef458ec1e035cfd8b3fe7b30c8c7883c6c" resolved "https://registry.yarnpkg.com/react-codemirror/-/react-codemirror-0.3.0.tgz#cd6bd6ef458ec1e035cfd8b3fe7b30c8c7883c6c"
@@ -7297,6 +7385,12 @@ react-test-renderer@^15.6.2:
fbjs "^0.8.9" fbjs "^0.8.9"
object-assign "^4.1.0" object-assign "^4.1.0"
react-themeable@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/react-themeable/-/react-themeable-1.1.0.tgz#7d4466dd9b2b5fa75058727825e9f152ba379a0e"
dependencies:
object-assign "^3.0.0"
react-transform-catch-errors@^1.0.2: react-transform-catch-errors@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/react-transform-catch-errors/-/react-transform-catch-errors-1.0.2.tgz#1b4d4a76e97271896fc16fe3086c793ec88a9eeb" resolved "https://registry.yarnpkg.com/react-transform-catch-errors/-/react-transform-catch-errors-1.0.2.tgz#1b4d4a76e97271896fc16fe3086c793ec88a9eeb"
@@ -7525,6 +7619,13 @@ release-zalgo@^1.0.0:
dependencies: dependencies:
es6-error "^4.0.1" es6-error "^4.0.1"
remarkable@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.1.tgz#aaca4972100b66a642a63a1021ca4bac1be3bff6"
dependencies:
argparse "~0.1.15"
autolinker "~0.15.0"
remove-trailing-separator@^1.0.1: remove-trailing-separator@^1.0.1:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -7799,6 +7900,10 @@ scope-css@^1.0.5:
version "1.1.0" version "1.1.0"
resolved "http://registry.npm.taobao.org/scope-css/download/scope-css-1.1.0.tgz#74eff45461bc9d3f3b29ed575b798cd722fa1256" resolved "http://registry.npm.taobao.org/scope-css/download/scope-css-1.1.0.tgz#74eff45461bc9d3f3b29ed575b798cd722fa1256"
section-iterator@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/section-iterator/-/section-iterator-2.0.0.tgz#bf444d7afeeb94ad43c39ad2fb26151627ccba2a"
semver-diff@^2.0.0: semver-diff@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
@@ -7856,6 +7961,12 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
set-getter@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
dependencies:
to-object-path "^0.3.0"
set-immediate-shim@^1.0.1: set-immediate-shim@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
@@ -7894,6 +8005,10 @@ sha.js@2.2.6:
version "2.2.6" version "2.2.6"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba"
shallow-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.0.0.tgz#508d1838b3de590ab8757b011b25e430900945f7"
shebang-command@^1.2.0: shebang-command@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -8298,6 +8413,10 @@ strip-bom@^2.0.0:
dependencies: dependencies:
is-utf8 "^0.2.0" is-utf8 "^0.2.0"
strip-color@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/strip-color/-/strip-color-0.1.0.tgz#106f65d3d3e6a2d9401cac0eb0ce8b8a702b4f7b"
strip-eof@^1.0.0: strip-eof@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
@@ -8579,6 +8698,10 @@ toggle-selection@^1.0.3:
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
toml@^2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb"
touch@0.0.3: touch@0.0.3:
version "0.0.3" version "0.0.3"
resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d" resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d"