From ff059d1268fe2b4d752923ea23149ee34e7ab4b2 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 7 Feb 2020 19:15:08 +0900
Subject: [PATCH] wip docs

---
 locales/ja-JP.yml         |  1 +
 src/client/app.vue        |  9 +++++++--
 src/client/pages/docs.vue | 29 +++++++++++++++++++++++++++++
 src/client/router.ts      |  1 +
 src/server/web/index.ts   |  5 +++++
 5 files changed, 43 insertions(+), 2 deletions(-)
 create mode 100644 src/client/pages/docs.vue

diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 4d97952d96..ad7d90a8ef 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -354,6 +354,7 @@ reduceUiAnimation: "UIのアニメーションを減らす"
 share: "共有"
 notFound: "見つかりません"
 notFoundDescription: "指定されたURLに該当するページはありませんでした。"
+help: "ヘルプ"
 
 _2fa:
   registerDevice: "デバイスを登録"
diff --git a/src/client/app.vue b/src/client/app.vue
index 61fd1ec382..35ae6afc91 100644
--- a/src/client/app.vue
+++ b/src/client/app.vue
@@ -137,7 +137,7 @@
 
 <script lang="ts">
 import Vue from 'vue';
-import { faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faGamepad, faServer, faFileAlt, faSatellite, faInfoCircle } from '@fortawesome/free-solid-svg-icons';
+import { faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faGamepad, faServer, faFileAlt, faSatellite, faInfoCircle, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
 import { faBell, faEnvelope, faLaugh, faComments } from '@fortawesome/free-regular-svg-icons';
 import { v4 as uuid } from 'uuid';
 import i18n from './i18n';
@@ -258,7 +258,7 @@ export default Vue.extend({
 		help() {
 			this.$router.push('/docs/keyboard-shortcut');
 		},
-		
+
 		back() {
 			if (this.canBack) window.history.back();
 		},
@@ -486,6 +486,11 @@ export default Vue.extend({
 					to: '/games',
 					icon: faGamepad,
 				}, null] : []), {
+					type: 'link',
+					text: this.$t('help'),
+					to: '/docs',
+					icon: faQuestionCircle,
+				}, {
 					type: 'link',
 					text: this.$t('about'),
 					to: '/about',
diff --git a/src/client/pages/docs.vue b/src/client/pages/docs.vue
new file mode 100644
index 0000000000..049ef2ec02
--- /dev/null
+++ b/src/client/pages/docs.vue
@@ -0,0 +1,29 @@
+<template>
+<div>
+	<portal to="icon"><fa :icon="faQuestionCircle"/></portal>
+	<portal to="title">{{ $t('help') }}</portal>
+	<main class="_card">
+		<div class="_content">
+		</div>
+	</main>
+</div>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'
+
+export default Vue.extend({
+	metaInfo() {
+		return {
+			title: this.$t('help') as string,
+		};
+	},
+
+	data() {
+		return {
+			faQuestionCircle
+		}
+	},
+});
+</script>
diff --git a/src/client/router.ts b/src/client/router.ts
index 48eaa0f2e3..f32673f432 100644
--- a/src/client/router.ts
+++ b/src/client/router.ts
@@ -21,6 +21,7 @@ export const router = new VueRouter({
 		{ path: '/announcements', component: page('announcements') },
 		{ path: '/about', component: page('about') },
 		{ path: '/featured', component: page('featured') },
+		{ path: '/docs', component: page('docs') },
 		{ path: '/docs/:doc', component: page('doc'), props: true },
 		{ path: '/explore', component: page('explore') },
 		{ path: '/explore/tags/:tag', props: true, component: page('explore') },
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index 07674bf099..ae31139014 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -96,6 +96,11 @@ router.get('/api.json', async ctx => {
 	ctx.body = genOpenapiSpec();
 });
 
+router.get('/docs.json', async ctx => {
+	const lang = ctx.query.lang;
+	// TODO: glob mds and extract title
+});
+
 const getFeed = async (acct: string) => {
 	const { username, host } = parseAcct(acct);
 	const user = await Users.findOne({