markdown
This commit is contained in:
parent
38215f2cf9
commit
9c97bb431c
4 changed files with 144 additions and 96 deletions
93
src/client/pages/document.vue
Normal file
93
src/client/pages/document.vue
Normal file
|
@ -0,0 +1,93 @@
|
|||
<template>
|
||||
<div>
|
||||
<portal to="icon"><fa :icon="faFileAlt"/></portal>
|
||||
<portal to="title">{{ title }}</portal>
|
||||
<main class="_card">
|
||||
<div class="_content">
|
||||
<div v-html="body"/>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { faFileAlt } from '@fortawesome/free-solid-svg-icons'
|
||||
import MarkdownIt from 'markdown-it';
|
||||
|
||||
const markdown = MarkdownIt();
|
||||
|
||||
export default Vue.extend({
|
||||
metaInfo() {
|
||||
return {
|
||||
title: this.title,
|
||||
};
|
||||
},
|
||||
|
||||
components: {
|
||||
},
|
||||
|
||||
watch: {
|
||||
markdown() {
|
||||
this.updateText();
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
faFileAlt,
|
||||
title: '',
|
||||
body: '',
|
||||
markdown: `# ぽぺ
|
||||
ぽぺ **ぽぺ** _ぽぺーーーーーっ!_ \`ぽぺ\`
|
||||
|
||||
\`\`\`
|
||||
export default class Pope extends PopeBase
|
||||
{
|
||||
public Pope() {
|
||||
return 'ぽぺ';
|
||||
}
|
||||
}
|
||||
\`\`\``,
|
||||
}
|
||||
},
|
||||
|
||||
created() {
|
||||
this.updateText()
|
||||
},
|
||||
|
||||
methods: {
|
||||
updateText() {
|
||||
// markdown の全容をパースする
|
||||
const parsed = markdown.parse(this.markdown, {});
|
||||
if (parsed.length === 0)
|
||||
return;
|
||||
|
||||
const buf = [ ...parsed ]
|
||||
const headingTokens = [];
|
||||
let headingStart = 0;
|
||||
|
||||
// もっとも上にある見出しを抽出する
|
||||
while (buf[0].type !== 'heading_open') {
|
||||
buf.shift();
|
||||
headingStart++;
|
||||
}
|
||||
buf.shift();
|
||||
while (buf[0].type as string !== 'heading_close') {
|
||||
const token = buf.shift();
|
||||
if (token) {
|
||||
headingTokens.push(token);
|
||||
}
|
||||
}
|
||||
|
||||
// 抽出した見出しを除く部分をbodyとして抽出する
|
||||
const bodyTokens = [ ...parsed ]
|
||||
bodyTokens.splice(headingStart, headingTokens.length + 2);
|
||||
|
||||
// 各々レンダーする
|
||||
this.title = markdown.renderer.render(headingTokens, {}, {});
|
||||
this.body = markdown.renderer.render(bodyTokens, {}, {});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue