diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-12-21 04:01:44 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-12-21 04:01:44 +0900 |
| commit | eaf0d5e637e0fd5be62b7ccf940ba1bcebeba786 (patch) | |
| tree | f0353688ff069002129ca58d9e285e79c5c7395c /src/web | |
| parent | #1021 (diff) | |
| download | sharkey-eaf0d5e637e0fd5be62b7ccf940ba1bcebeba786.tar.gz sharkey-eaf0d5e637e0fd5be62b7ccf940ba1bcebeba786.tar.bz2 sharkey-eaf0d5e637e0fd5be62b7ccf940ba1bcebeba786.zip | |
#1017 #155
Diffstat (limited to 'src/web')
| -rw-r--r-- | src/web/app/common/scripts/parse-search-query.ts | 41 | ||||
| -rw-r--r-- | src/web/app/desktop/router.ts | 4 | ||||
| -rw-r--r-- | src/web/app/desktop/tags/search-posts.tag | 6 | ||||
| -rw-r--r-- | src/web/app/desktop/tags/ui.tag | 2 | ||||
| -rw-r--r-- | src/web/app/mobile/router.ts | 4 | ||||
| -rw-r--r-- | src/web/app/mobile/tags/search-posts.tag | 6 | ||||
| -rw-r--r-- | src/web/app/mobile/tags/ui.tag | 2 | ||||
| -rw-r--r-- | src/web/docs/search.ja.pug | 38 |
8 files changed, 91 insertions, 12 deletions
diff --git a/src/web/app/common/scripts/parse-search-query.ts b/src/web/app/common/scripts/parse-search-query.ts new file mode 100644 index 0000000000..adcbfbb8fe --- /dev/null +++ b/src/web/app/common/scripts/parse-search-query.ts @@ -0,0 +1,41 @@ +export default function(qs: string) { + const q = { + text: '' + }; + + qs.split(' ').forEach(x => { + if (/^([a-z_]+?):(.+?)$/.test(x)) { + const [key, value] = x.split(':'); + switch (key) { + case 'user': + q['username'] = value; + break; + case 'reply': + q['include_replies'] = value == 'true'; + break; + case 'media': + q['with_media'] = value == 'true'; + break; + case 'until': + case 'since': + // YYYY-MM-DD + if (/^[0-9]+\-[0-9]+\-[0-9]+$/) { + const [yyyy, mm, dd] = value.split('-'); + q[`${key}_date`] = (new Date(parseInt(yyyy, 10), parseInt(mm, 10) - 1, parseInt(dd, 10))).getTime(); + } + break; + default: + q[key] = value; + break; + } + } else { + q.text += x + ' '; + } + }); + + if (q.text) { + q.text = q.text.trim(); + } + + return q; +} diff --git a/src/web/app/desktop/router.ts b/src/web/app/desktop/router.ts index 27b63ab2ef..ce68c4f2d1 100644 --- a/src/web/app/desktop/router.ts +++ b/src/web/app/desktop/router.ts @@ -16,7 +16,7 @@ export default (mios: MiOS) => { route('/i/messaging/:user', messaging); route('/i/mentions', mentions); route('/post::post', post); - route('/search::query', search); + route('/search', search); route('/:user', user.bind(null, 'home')); route('/:user/graphs', user.bind(null, 'graphs')); route('/:user/:post', post); @@ -47,7 +47,7 @@ export default (mios: MiOS) => { function search(ctx) { const el = document.createElement('mk-search-page'); - el.setAttribute('query', ctx.params.query); + el.setAttribute('query', ctx.querystring.substr(2)); mount(el); } diff --git a/src/web/app/desktop/tags/search-posts.tag b/src/web/app/desktop/tags/search-posts.tag index 52f765d1a1..c6b24837d2 100644 --- a/src/web/app/desktop/tags/search-posts.tag +++ b/src/web/app/desktop/tags/search-posts.tag @@ -33,6 +33,8 @@ </style> <script> + import parse from '../../common/scripts/parse-search-query'; + this.mixin('api'); this.query = this.opts.query; @@ -45,9 +47,7 @@ document.addEventListener('keydown', this.onDocumentKeydown); window.addEventListener('scroll', this.onScroll); - this.api('posts/search', { - query: this.query - }).then(posts => { + this.api('posts/search', parse(this.query)).then(posts => { this.update({ isLoading: false, isEmpty: posts.length == 0 diff --git a/src/web/app/desktop/tags/ui.tag b/src/web/app/desktop/tags/ui.tag index 059d88528d..3dfdeec01c 100644 --- a/src/web/app/desktop/tags/ui.tag +++ b/src/web/app/desktop/tags/ui.tag @@ -180,7 +180,7 @@ this.onsubmit = e => { e.preventDefault(); - this.page('/search:' + this.refs.q.value); + this.page('/search?q=' + encodeURIComponent(this.refs.q.value)); }; </script> </mk-ui-header-search> diff --git a/src/web/app/mobile/router.ts b/src/web/app/mobile/router.ts index d0c6add0b8..afb9aa6201 100644 --- a/src/web/app/mobile/router.ts +++ b/src/web/app/mobile/router.ts @@ -23,7 +23,7 @@ export default (mios: MiOS) => { route('/i/settings/authorized-apps', settingsAuthorizedApps); route('/post/new', newPost); route('/post::post', post); - route('/search::query', search); + route('/search', search); route('/:user', user.bind(null, 'overview')); route('/:user/graphs', user.bind(null, 'graphs')); route('/:user/followers', userFollowers); @@ -83,7 +83,7 @@ export default (mios: MiOS) => { function search(ctx) { const el = document.createElement('mk-search-page'); - el.setAttribute('query', ctx.params.query); + el.setAttribute('query', ctx.querystring.substr(2)); mount(el); } diff --git a/src/web/app/mobile/tags/search-posts.tag b/src/web/app/mobile/tags/search-posts.tag index 967764bc2c..023a35bf62 100644 --- a/src/web/app/mobile/tags/search-posts.tag +++ b/src/web/app/mobile/tags/search-posts.tag @@ -15,6 +15,8 @@ width calc(100% - 32px) </style> <script> + import parse from '../../common/scripts/parse-search-query'; + this.mixin('api'); this.max = 30; @@ -24,9 +26,7 @@ this.withMedia = this.opts.withMedia; this.init = new Promise((res, rej) => { - this.api('posts/search', { - query: this.query - }).then(posts => { + this.api('posts/search', parse(this.query)).then(posts => { res(posts); this.trigger('loaded'); }); diff --git a/src/web/app/mobile/tags/ui.tag b/src/web/app/mobile/tags/ui.tag index 621f89f336..77ad14530d 100644 --- a/src/web/app/mobile/tags/ui.tag +++ b/src/web/app/mobile/tags/ui.tag @@ -413,7 +413,7 @@ this.search = () => { const query = window.prompt('%i18n:mobile.tags.mk-ui-nav.search%'); if (query == null || query == '') return; - this.page('/search:' + query); + this.page('/search?q=' + encodeURIComponent(query)); }; </script> </mk-ui-nav> diff --git a/src/web/docs/search.ja.pug b/src/web/docs/search.ja.pug new file mode 100644 index 0000000000..f7ec9519f5 --- /dev/null +++ b/src/web/docs/search.ja.pug @@ -0,0 +1,38 @@ +h1 検索 + +p 投稿を検索することができます。 +p + | キーワードを半角スペースで区切ると、and検索になります。 + | 例えば、「git コミット」と検索すると、「gitで編集したファイルの特定の行だけコミットする方法がわからない」などがマッチします。 + +section + h2 オプション + p + | オプションを使用して、より高度な検索をすることもできます。 + | オプションを指定するには、「オプション名:値」という形式でクエリに含めます。 + p 利用可能なオプション一覧です: + + table + thead + tr + th 名前 + th 説明 + tbody + tr + td user + td ユーザー名。投稿者を限定します。 + tr + td reply + td 返信を含めるか否か。(trueかfalse) + tr + td media + td メディアが添付されているか。(trueかfalse) + tr + td until + td 上限の日時。(YYYY-MM-DD) + tr + td since + td 下限の日時。(YYYY-MM-DD) + + p 例えば、「@syuiloの2017年11月1日から2017年12月31日までの『Misskey』というテキストを含む返信ではない投稿」を検索したい場合、クエリは以下のようになります: + code user:syuilo since:2017-11-01 until:2017-12-31 reply:false Misskey |