diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js new file mode 100644 index 00000000..46238caf --- /dev/null +++ b/browser/lib/findNoteTitle.js @@ -0,0 +1,33 @@ +export function findNoteTitle (value) { + let splitted = value.split('\n') + let title = null + let isInsideCodeBlock = false + + splitted.some((line, index) => { + let trimmedLine = line.trim() + let trimmedNextLine = splitted[index + 1] === undefined ? '' : splitted[index + 1].trim() + if (trimmedLine.match('```')) { + isInsideCodeBlock = !isInsideCodeBlock + } + if (isInsideCodeBlock === false && (trimmedLine.match(/^# +/) || trimmedNextLine.match(/^=+$/))) { + title = trimmedLine + return true + } + }) + + if (title === null) { + title = '' + splitted.some((line) => { + if (line.trim().length > 0) { + title = line.trim() + return true + } + }) + } + + return title +} + +export default { + findNoteTitle +} diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index a8a0d4bd..6113264e 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -12,6 +12,7 @@ import ee from 'browser/main/lib/eventEmitter' import markdown from 'browser/lib/markdown' import StatusBar from '../StatusBar' import _ from 'lodash' +import { findNoteTitle } from 'browser/lib/findNoteTitle' const electron = require('electron') const { remote } = electron @@ -63,44 +64,6 @@ class MarkdownNoteDetail extends React.Component { ee.off('topbar:togglelockbutton', this.toggleLockButton) } - findTitle (value) { - let splitted = value.split('\n') - let title = null - let isMarkdownInCode = false - - splitted.some((line, index) => { - let trimmedLine = line.trim() - let trimmedNextLine = splitted[index + 1] === undefined ? '' : splitted[index + 1].trim() - if (trimmedLine.match('```')) { - isMarkdownInCode = !isMarkdownInCode - } else if (isMarkdownInCode === false && (trimmedLine.match(/^# +/) || trimmedNextLine.match('='))) { - if (trimmedNextLine.match('=')) { - title = trimmedLine.substring(0, trimmedLine.length).trim() - } else { - title = trimmedLine.substring(1, trimmedLine.length).trim() - } - return true - } - }) - - if (title == null) { - for (let i = 0; i < splitted.length; i++) { - let trimmedLine = splitted[i].trim() - if (trimmedLine.length > 0) { - title = trimmedLine - break - } - } - if (title == null) { - title = '' - } - } - - title = markdown.strip(title) - - return title - } - getPercentageOfCompleteTodo (noteContent) { let splitted = noteContent.split('\n') let numberOfTodo = 0 @@ -124,7 +87,7 @@ class MarkdownNoteDetail extends React.Component { note.content = this.refs.content.value note.tags = this.refs.tags.value - note.title = this.findTitle(note.content) + note.title = markdown.strip(findNoteTitle(note.content)) note.updatedAt = new Date() this.setState({ diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 14ffe326..5e6a3278 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -15,6 +15,7 @@ import StatusBar from '../StatusBar' import context from 'browser/lib/context' import ConfigManager from 'browser/main/lib/ConfigManager' import _ from 'lodash' +import { findNoteTitle } from 'browser/lib/findNoteTitle' function pass (name) { switch (name) { @@ -75,41 +76,13 @@ class SnippetNoteDetail extends React.Component { if (this.saveQueue != null) this.saveNow() } - findTitle (value) { - let splitted = value.split('\n') - let title = null - - for (let i = 0; i < splitted.length; i++) { - let trimmedLine = splitted[i].trim() - if (trimmedLine.match(/^# .+/)) { - title = trimmedLine.substring(1, trimmedLine.length).trim() - break - } - } - - if (title == null) { - for (let i = 0; i < splitted.length; i++) { - let trimmedLine = splitted[i].trim() - if (trimmedLine.length > 0) { - title = trimmedLine - break - } - } - if (title == null) { - title = '' - } - } - - return title - } - handleChange (e) { let { note } = this.state note.tags = this.refs.tags.value note.description = this.refs.description.value note.updatedAt = new Date() - note.title = this.findTitle(note.description) + note.title = findNoteTitle(note.description) this.setState({ note diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js new file mode 100644 index 00000000..2c91a3dc --- /dev/null +++ b/tests/lib/find-title-test.js @@ -0,0 +1,25 @@ +/** + * @fileoverview Unit test for browser/lib/findTitle + */ + +const test = require('ava') +const { findNoteTitle } = require('browser/lib/findNoteTitle') + +// Unit test +test('findNoteTitle#find should return a correct title (string)', t => { + // [input, expected] + const testCases = [ + ['# hoge\nfuga', '# hoge'], + ['# hoge_hoge_hoge', '# hoge_hoge_hoge'], + ['hoge\n====\nfuga', 'hoge'], + ['====', '===='], + ['```\n# hoge\n```', '```'], + ['hoge', 'hoge'] + ] + + testCases.forEach(testCase => { + const [input, expected] = testCase + t.is(findNoteTitle(input), expected, `Test for find() input: ${input} expected: ${expected}`) + }) +}) +