This commit is contained in:
syuilo 2020-02-07 19:43:37 +09:00
parent 77a778acf1
commit fc76f7874e
4 changed files with 58 additions and 3 deletions

View File

@ -44,6 +44,7 @@
"@types/cbor": "5.0.0", "@types/cbor": "5.0.0",
"@types/dateformat": "3.0.1", "@types/dateformat": "3.0.1",
"@types/double-ended-queue": "2.1.1", "@types/double-ended-queue": "2.1.1",
"@types/glob": "7.1.1",
"@types/gulp": "4.0.6", "@types/gulp": "4.0.6",
"@types/gulp-mocha": "0.0.32", "@types/gulp-mocha": "0.0.32",
"@types/gulp-rename": "0.0.33", "@types/gulp-rename": "0.0.33",
@ -128,6 +129,7 @@
"fibers": "4.0.2", "fibers": "4.0.2",
"file-type": "13.1.2", "file-type": "13.1.2",
"fluent-ffmpeg": "2.1.2", "fluent-ffmpeg": "2.1.2",
"glob": "7.1.6",
"gulp": "4.0.2", "gulp": "4.0.2",
"gulp-clean-css": "4.2.0", "gulp-clean-css": "4.2.0",
"gulp-dart-sass": "0.9.1", "gulp-dart-sass": "0.9.1",

View File

@ -4,6 +4,11 @@
<portal to="title">{{ $t('help') }}</portal> <portal to="title">{{ $t('help') }}</portal>
<main class="_card"> <main class="_card">
<div class="_content"> <div class="_content">
<ul>
<li v-for="doc in docs" :key="doc.path">
<router-link :to="`/docs/${doc.path}`">{{ doc.title }}</router-link>
</li>
</ul>
</div> </div>
</main> </main>
</div> </div>
@ -12,6 +17,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons' import { faQuestionCircle } from '@fortawesome/free-solid-svg-icons'
import { url, lang } from '../config';
export default Vue.extend({ export default Vue.extend({
metaInfo() { metaInfo() {
@ -22,8 +28,15 @@ export default Vue.extend({
data() { data() {
return { return {
docs: [],
faQuestionCircle faQuestionCircle
} }
}, },
created() {
fetch(`${url}/docs.json?lang=${lang}`).then(res => res.json()).then(docs => {
this.docs = docs;
});
},
}); });
</script> </script>

View File

@ -3,12 +3,15 @@
*/ */
import * as os from 'os'; import * as os from 'os';
import * as fs from 'fs';
import ms = require('ms'); import ms = require('ms');
import * as Koa from 'koa'; import * as Koa from 'koa';
import * as Router from '@koa/router'; import * as Router from '@koa/router';
import * as send from 'koa-send'; import * as send from 'koa-send';
import * as favicon from 'koa-favicon'; import * as favicon from 'koa-favicon';
import * as views from 'koa-views'; import * as views from 'koa-views';
import * as glob from 'glob';
import * as MarkdownIt from 'markdown-it';
import packFeed from './feed'; import packFeed from './feed';
import { fetchMeta } from '../../misc/fetch-meta'; import { fetchMeta } from '../../misc/fetch-meta';
@ -20,6 +23,11 @@ import getNoteSummary from '../../misc/get-note-summary';
import { ensure } from '../../prelude/ensure'; import { ensure } from '../../prelude/ensure';
import { getConnection } from 'typeorm'; import { getConnection } from 'typeorm';
import redis from '../../db/redis'; import redis from '../../db/redis';
import locales = require('../../../locales');
const markdown = MarkdownIt({
html: true
});
const client = `${__dirname}/../../client/`; const client = `${__dirname}/../../client/`;
@ -98,7 +106,39 @@ router.get('/api.json', async ctx => {
router.get('/docs.json', async ctx => { router.get('/docs.json', async ctx => {
const lang = ctx.query.lang; const lang = ctx.query.lang;
// TODO: glob mds and extract title if (!Object.keys(locales).includes(lang)) {
ctx.body = [];
return;
}
const paths = glob.sync(__dirname + `/../../../src/docs/*.${lang}.md`);
const docs: { path: string; title: string; }[] = [];
for (const path of paths) {
const md = fs.readFileSync(path, { encoding: 'utf8' });
const parsed = markdown.parse(md, {});
if (parsed.length === 0) return;
const buf = [...parsed];
const headingTokens = [];
// もっとも上にある見出しを抽出する
while (buf[0].type !== 'heading_open') {
buf.shift();
}
buf.shift();
while (buf[0].type as string !== 'heading_close') {
const token = buf.shift();
if (token) {
headingTokens.push(token);
}
}
docs.push({
path: path.split('/').pop()!.split('.')[0],
title: markdown.renderer.render(headingTokens, {}, {})
});
}
ctx.body = docs;
}); });
const getFeed = async (acct: string) => { const getFeed = async (acct: string) => {

View File

@ -285,7 +285,7 @@
"@types/glob" "*" "@types/glob" "*"
"@types/node" "*" "@types/node" "*"
"@types/glob@*": "@types/glob@*", "@types/glob@7.1.1":
version "7.1.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
@ -4246,7 +4246,7 @@ glob@7.1.3:
once "^1.3.0" once "^1.3.0"
path-is-absolute "^1.0.0" path-is-absolute "^1.0.0"
glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: glob@7.1.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.1.6" version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==