From 15c23630980a2520c9dcd20a3dffe38a1c256511 Mon Sep 17 00:00:00 2001 From: Rokt33r Date: Thu, 3 Dec 2015 06:44:52 +0900 Subject: [PATCH] =?UTF-8?q?Search=20input=E3=81=ABRegExp=20operator?= =?UTF-8?q?=E3=81=8C=E5=85=A5=E3=82=8B=E3=81=A8=E4=BD=BF=E3=81=88=E3=81=AA?= =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=9F=E5=95=8F=E9=A1=8C=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser/finder/index.js | 16 ++++++++++++---- browser/main/HomePage.js | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/browser/finder/index.js b/browser/finder/index.js index f845bbcf..33413062 100644 --- a/browser/finder/index.js +++ b/browser/finder/index.js @@ -152,6 +152,14 @@ function buildFilter (key) { return {type: TEXT_FILTER, value: key} } +function isContaining (target, needle) { + return target.match(new RegExp(_.escapeRegExp(needle))) +} + +function startsWith (target, needle) { + return target.match(new RegExp('^' + _.escapeRegExp(needle))) +} + function remap (state) { let { articles, folders, status } = state @@ -168,10 +176,10 @@ function remap (state) { let targetFolders if (folders != null) { let exactTargetFolders = folders.filter(folder => { - return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`))) + return _.find(folderExactFilters, filter => isContaining(folder.name, filter.value)) }) let fuzzyTargetFolders = folders.filter(folder => { - return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`))) + return _.find(folderFilters, filter => startsWith(folder.name, filter.value)) }) targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders) @@ -184,7 +192,7 @@ function remap (state) { if (textFilters.length > 0) { articles = textFilters.reduce((articles, textFilter) => { return articles.filter(article => { - return article.title.match(new RegExp(textFilter.value, 'i')) || article.content.match(new RegExp(textFilter.value, 'i')) + return isContaining(article.title, textFilter.value) || isContaining(article.content, textFilter.value) }) }, articles) } @@ -192,7 +200,7 @@ function remap (state) { if (tagFilters.length > 0) { articles = tagFilters.reduce((articles, tagFilter) => { return articles.filter(article => { - return _.find(article.tags, tag => tag.match(new RegExp(tagFilter.value, 'i'))) + return _.find(article.tags, tag => isContaining(tag, tagFilter.value)) }) }, articles) } diff --git a/browser/main/HomePage.js b/browser/main/HomePage.js index ccbad0df..cc0c127a 100644 --- a/browser/main/HomePage.js +++ b/browser/main/HomePage.js @@ -7,6 +7,7 @@ import ArticleList from './HomePage/ArticleList' import ArticleDetail from './HomePage/ArticleDetail' import _ from 'lodash' import { isModalOpen, closeModal } from 'boost/modal' + const electron = require('electron') const BrowserWindow = electron.remote.BrowserWindow @@ -171,6 +172,14 @@ function buildFilter (key) { return {type: TEXT_FILTER, value: key} } +function isContaining (target, needle) { + return target.match(new RegExp(_.escapeRegExp(needle))) +} + +function startsWith (target, needle) { + return target.match(new RegExp('^' + _.escapeRegExp(needle))) +} + function remap (state) { let { user, folders, articles, status } = state @@ -199,10 +208,10 @@ function remap (state) { let targetFolders if (folders != null) { let exactTargetFolders = folders.filter(folder => { - return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`))) + return _.findWhere(folderExactFilters, {value: folder.name}) }) let fuzzyTargetFolders = folders.filter(folder => { - return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`))) + return _.find(folderFilters, filter => startsWith(folder.name, filter.value)) }) targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders) @@ -215,7 +224,7 @@ function remap (state) { if (textFilters.length > 0) { articles = textFilters.reduce((articles, textFilter) => { return articles.filter(article => { - return article.title.match(new RegExp(textFilter.value, 'i')) || article.content.match(new RegExp(textFilter.value, 'i')) + return isContaining(article.title, textFilter.value) || isContaining(article.content, textFilter.value) }) }, articles) } @@ -223,7 +232,7 @@ function remap (state) { if (tagFilters.length > 0) { articles = tagFilters.reduce((articles, tagFilter) => { return articles.filter(article => { - return _.find(article.tags, tag => tag.match(new RegExp(tagFilter.value, 'i'))) + return _.find(article.tags, tag => isContaining(tag, tagFilter.value)) }) }, articles) }