From 983f453afd128715d6a7af5258bbccaa0b95ba93 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Thu, 4 May 2017 10:36:05 -0700 Subject: [PATCH 01/11] Add findTitle as a module --- browser/lib/findNoteTitle.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 browser/lib/findNoteTitle.js diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js new file mode 100644 index 00000000..10250a6e --- /dev/null +++ b/browser/lib/findNoteTitle.js @@ -0,0 +1,32 @@ +export function find (value) { + let splitted = value.split('\n') + let title = null + let isMarkdownInCode = false + + for (let i = 0; i < splitted.length; i++) { + let trimmedLine = splitted[i].trim() + if (trimmedLine.match('```')) { + isMarkdownInCode = !isMarkdownInCode + } else if (isMarkdownInCode === false && trimmedLine.match(/^# +/)) { + title = trimmedLine.substring(1, trimmedLine.length).trim() + break + } + } + + if (title == null) { + title = '' + for (let i = 0; i < splitted.length; i++) { + let trimmedLine = splitted[i].trim() + if (trimmedLine.length > 0) { + title = trimmedLine + break + } + } + } + + return title +} + +export default { + find +} From 0bc9c6fb5aece79997221c0c895c4218aa70e5af Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 15:23:11 +0900 Subject: [PATCH 02/11] Change to use the module instead of a function findTitle() implemented inside the file --- browser/main/Detail/MarkdownNoteDetail.js | 41 ++--------------------- browser/main/Detail/SnippetNoteDetail.js | 31 ++--------------- 2 files changed, 4 insertions(+), 68 deletions(-) diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 8c63f952..b154c222 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.find(note.content)) note.updatedAt = new Date() this.setState({ diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 14ffe326..2fa96b01 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.find(note.description) this.setState({ note From ffc4ca1dd48e96ed5c4e71ea8bbca9046a683c1b Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Thu, 4 May 2017 10:45:19 -0700 Subject: [PATCH 03/11] Add an unit test for findNoteTitle --- tests/lib/find-title-test.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tests/lib/find-title-test.js diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js new file mode 100644 index 00000000..b701c410 --- /dev/null +++ b/tests/lib/find-title-test.js @@ -0,0 +1,22 @@ +/** + * @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\nhoge', 'hoge'], + ['# hoge_hoge_hoge', 'hoge_hoge_hoge'], + ['```\n# hoge\n```\n# fuga', 'fuga'] + ] + + testCases.forEach(testCase => { + const [input, expected] = testCase + t.is(findNoteTitle.find(input), expected, `Test for find() input: ${input} expected: ${expected}`) + }) +}) + From 19f8930f5af65b31102ffb72ffad7bed82ab399a Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Thu, 4 May 2017 17:21:27 -0700 Subject: [PATCH 04/11] Fix to use strict equal --- browser/lib/findNoteTitle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js index 10250a6e..7dfbcfb3 100644 --- a/browser/lib/findNoteTitle.js +++ b/browser/lib/findNoteTitle.js @@ -13,7 +13,7 @@ export function find (value) { } } - if (title == null) { + if (title === null) { title = '' for (let i = 0; i < splitted.length; i++) { let trimmedLine = splitted[i].trim() From 20411a2fd54765d27b2424948b6d6df9719d100e Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Fri, 5 May 2017 22:03:55 -0700 Subject: [PATCH 05/11] Change the function name of findNoteTitle.js from find to findNoteTitle --- browser/lib/findNoteTitle.js | 4 ++-- browser/main/Detail/MarkdownNoteDetail.js | 4 ++-- browser/main/Detail/SnippetNoteDetail.js | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js index 7dfbcfb3..23c48342 100644 --- a/browser/lib/findNoteTitle.js +++ b/browser/lib/findNoteTitle.js @@ -1,4 +1,4 @@ -export function find (value) { +export function findNoteTitle (value) { let splitted = value.split('\n') let title = null let isMarkdownInCode = false @@ -28,5 +28,5 @@ export function find (value) { } export default { - find + findNoteTitle } diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index b154c222..59276f55 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -12,7 +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' +import { findNoteTitle } from 'browser/lib/findNoteTitle' const electron = require('electron') const { remote } = electron @@ -87,7 +87,7 @@ class MarkdownNoteDetail extends React.Component { note.content = this.refs.content.value note.tags = this.refs.tags.value - note.title = markdown.strip(findNoteTitle.find(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 2fa96b01..5e6a3278 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -15,7 +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' +import { findNoteTitle } from 'browser/lib/findNoteTitle' function pass (name) { switch (name) { @@ -82,7 +82,7 @@ class SnippetNoteDetail extends React.Component { note.tags = this.refs.tags.value note.description = this.refs.description.value note.updatedAt = new Date() - note.title = findNoteTitle.find(note.description) + note.title = findNoteTitle(note.description) this.setState({ note From d4865adf6a40b6945fb65af3ff0c638627c251c1 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Fri, 5 May 2017 22:10:52 -0700 Subject: [PATCH 06/11] Change findNoteTitle.find() to findNoteTitle.findNoteTitle() in test --- tests/lib/find-title-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js index b701c410..55061b15 100644 --- a/tests/lib/find-title-test.js +++ b/tests/lib/find-title-test.js @@ -3,7 +3,7 @@ */ const test = require('ava') -const findNoteTitle = require('browser/lib/findNoteTitle') +const { findNoteTitle } = require('browser/lib/findNoteTitle') // Unit test test('findNoteTitle#find should return a correct title (string)', t => { @@ -16,7 +16,7 @@ test('findNoteTitle#find should return a correct title (string)', t => { testCases.forEach(testCase => { const [input, expected] = testCase - t.is(findNoteTitle.find(input), expected, `Test for find() input: ${input} expected: ${expected}`) + t.is(findNoteTitle(input), expected, `Test for find() input: ${input} expected: ${expected}`) }) }) From 908cd7a890cfbc8badfc081f5f206dea14df9e3c Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 15:27:22 +0900 Subject: [PATCH 07/11] Edit the method --- browser/lib/findNoteTitle.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js index 23c48342..e7e54868 100644 --- a/browser/lib/findNoteTitle.js +++ b/browser/lib/findNoteTitle.js @@ -3,18 +3,22 @@ export function findNoteTitle (value) { let title = null let isMarkdownInCode = false - for (let i = 0; i < splitted.length; i++) { - let trimmedLine = splitted[i].trim() + 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(/^# +/)) { - title = trimmedLine.substring(1, trimmedLine.length).trim() - break + } 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) { - title = '' + if (title == null) { for (let i = 0; i < splitted.length; i++) { let trimmedLine = splitted[i].trim() if (trimmedLine.length > 0) { @@ -22,6 +26,9 @@ export function findNoteTitle (value) { break } } + if (title == null) { + title = '' + } } return title From 005d8f84fd31971779e7680fbf5ebb76535ce987 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 15:43:48 +0900 Subject: [PATCH 08/11] Change for to some --- browser/lib/findNoteTitle.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js index e7e54868..e7253db3 100644 --- a/browser/lib/findNoteTitle.js +++ b/browser/lib/findNoteTitle.js @@ -19,16 +19,14 @@ export function findNoteTitle (value) { }) if (title == null) { - for (let i = 0; i < splitted.length; i++) { - let trimmedLine = splitted[i].trim() + title = '' + splitted.some((line, index) => { + let trimmedLine = splitted[index].trim() if (trimmedLine.length > 0) { title = trimmedLine - break + return true } - } - if (title == null) { - title = '' - } + }) } return title From 2bbe7056d180b3601a6c96f703a3e146982f0904 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 15:43:54 +0900 Subject: [PATCH 09/11] Add test cases --- tests/lib/find-title-test.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js index 55061b15..3e02273d 100644 --- a/tests/lib/find-title-test.js +++ b/tests/lib/find-title-test.js @@ -9,9 +9,11 @@ const { findNoteTitle } = require('browser/lib/findNoteTitle') test('findNoteTitle#find should return a correct title (string)', t => { // [input, expected] const testCases = [ - ['# hoge\nhoge', 'hoge'], + ['# hoge\nfuga', 'hoge'], ['# hoge_hoge_hoge', 'hoge_hoge_hoge'], - ['```\n# hoge\n```\n# fuga', 'fuga'] + ['```\n# hoge\n```\n# fuga', 'fuga'], + ['```\n# hoge\n```', '```'], + ['hoge', 'hoge'], ] testCases.forEach(testCase => { From 0f71139eba0991d15fb216fbc856fc7a20514074 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 15:51:21 +0900 Subject: [PATCH 10/11] Delete a comma pointed by eslint --- tests/lib/find-title-test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js index 3e02273d..e2aad48b 100644 --- a/tests/lib/find-title-test.js +++ b/tests/lib/find-title-test.js @@ -13,7 +13,7 @@ test('findNoteTitle#find should return a correct title (string)', t => { ['# hoge_hoge_hoge', 'hoge_hoge_hoge'], ['```\n# hoge\n```\n# fuga', 'fuga'], ['```\n# hoge\n```', '```'], - ['hoge', 'hoge'], + ['hoge', 'hoge'] ] testCases.forEach(testCase => { From 99228f2e60f41ac29ea788696e6fcbc7d1db4b22 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 23 May 2017 16:51:58 +0900 Subject: [PATCH 11/11] :recycle: Refactor findeTitle() --- browser/lib/findNoteTitle.js | 22 +++++++++------------- tests/lib/find-title-test.js | 7 ++++--- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/browser/lib/findNoteTitle.js b/browser/lib/findNoteTitle.js index e7253db3..46238caf 100644 --- a/browser/lib/findNoteTitle.js +++ b/browser/lib/findNoteTitle.js @@ -1,29 +1,25 @@ export function findNoteTitle (value) { let splitted = value.split('\n') let title = null - let isMarkdownInCode = false + let isInsideCodeBlock = 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() - } + isInsideCodeBlock = !isInsideCodeBlock + } + if (isInsideCodeBlock === false && (trimmedLine.match(/^# +/) || trimmedNextLine.match(/^=+$/))) { + title = trimmedLine return true } }) - if (title == null) { + if (title === null) { title = '' - splitted.some((line, index) => { - let trimmedLine = splitted[index].trim() - if (trimmedLine.length > 0) { - title = trimmedLine + splitted.some((line) => { + if (line.trim().length > 0) { + title = line.trim() return true } }) diff --git a/tests/lib/find-title-test.js b/tests/lib/find-title-test.js index e2aad48b..2c91a3dc 100644 --- a/tests/lib/find-title-test.js +++ b/tests/lib/find-title-test.js @@ -9,9 +9,10 @@ const { findNoteTitle } = require('browser/lib/findNoteTitle') test('findNoteTitle#find should return a correct title (string)', t => { // [input, expected] const testCases = [ - ['# hoge\nfuga', 'hoge'], - ['# hoge_hoge_hoge', 'hoge_hoge_hoge'], - ['```\n# hoge\n```\n# fuga', 'fuga'], + ['# hoge\nfuga', '# hoge'], + ['# hoge_hoge_hoge', '# hoge_hoge_hoge'], + ['hoge\n====\nfuga', 'hoge'], + ['====', '===='], ['```\n# hoge\n```', '```'], ['hoge', 'hoge'] ]