diff options
-rw-r--r-- | components/Posts/PostLink.vue | 4 | ||||
-rw-r--r-- | pages/kronika/_year/_month/_day/_title/index.vue | 54 | ||||
-rwxr-xr-x | scripts/generateApi.js | 56 | ||||
-rwxr-xr-x | scripts/postbuild.sh | 2 |
4 files changed, 89 insertions, 27 deletions
diff --git a/components/Posts/PostLink.vue b/components/Posts/PostLink.vue index 54cd934..d3b34fc 100644 --- a/components/Posts/PostLink.vue +++ b/components/Posts/PostLink.vue @@ -1,11 +1,11 @@ <template> <div class="post-link"> - <a :href="route"> + <nuxt-link :to="route"> <div class="post-container"> <h4 class="post-title">{{ title }}</h4> <p class="post-description">{{ shortenedDescription }}...</p> </div> - </a> + </nuxt-link> </div> </template> diff --git a/pages/kronika/_year/_month/_day/_title/index.vue b/pages/kronika/_year/_month/_day/_title/index.vue index 9fab1d0..7990abe 100644 --- a/pages/kronika/_year/_month/_day/_title/index.vue +++ b/pages/kronika/_year/_month/_day/_title/index.vue @@ -11,42 +11,48 @@ </template> <script> -const md = require('markdown-it')() -import frontmatter from 'front-matter' -import k from '~/api' +import axios from 'axios' export default { head() { - return { - meta: [ - { - hid: 'og:title', - property: 'og:title', - content: this.attributes.title - }, - { - hid: 'og:type', - property: 'og:type', - content: 'article' - }, - { - hid: 'og:article:author', - property: 'og:article:author', - content: this.attributes.author - } - ] + if (this.attributes) { + return { + meta: [ + { + hid: 'og:title', + property: 'og:title', + content: this.attributes.title + }, + { + hid: 'og:type', + property: 'og:type', + content: 'article' + }, + { + hid: 'og:article:author', + property: 'og:article:author', + content: this.attributes.author + } + ] + } } }, async asyncData({ params }) { const { year, month, day, title } = params - const post = k.getPost(year, month, day, title) + const response = await axios + .get( + `${process.env.baseUrl}/api/posts/${year}/${month}/${day}/${title}.json` + ) + .catch(err => ({ notFound: true })) + + const post = response.data if (post === undefined) return { notFound: true } return { params, - attributes: post.content.meta, - content: post.content.html + attributes: post.meta, + content: post.content } }, data() { diff --git a/scripts/generateApi.js b/scripts/generateApi.js index 4b7426a..ad266cc 100755 --- a/scripts/generateApi.js +++ b/scripts/generateApi.js @@ -1,8 +1,64 @@ import fs from 'fs' import k from '../api' +import path from 'path' + +function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) { + const sep = path.sep + const initDir = path.isAbsolute(targetDir) ? sep : '' + const baseDir = isRelativeToScript ? __dirname : '.' + + return targetDir.split(sep).reduce((parentDir, childDir) => { + const curDir = path.resolve(baseDir, parentDir, childDir) + try { + fs.mkdirSync(curDir) + } catch (err) { + if (err.code === 'EEXIST') { + // curDir already exists! + return curDir + } + + // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows. + if (err.code === 'ENOENT') { + // Throw the original parentDir error on curDir `ENOENT` failure. + throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`) + } + + const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1 + if (!caughtErr || (caughtErr && targetDir === curDir)) { + throw err // Throw if it's just the last created dir. + } + } + + return curDir + }, initDir) +} let posts = k.getPosts() +posts.forEach(post => { + const { year, month, day } = post.date + const dir = `api/posts/${year}/${month}/${day}` + mkDirByPathSync(`./dist/${dir}`) + mkDirByPathSync(`./static/${dir}`) + console.log(`${dir}/${post.title}.json`) + const apiEntry = { + title: post.title, + date: `${year}-${month}-${day}`, + content: post.content.html, + meta: post.content.meta + } + fs.writeFile( + `./dist/${dir}/${post.title}.json`, + JSON.stringify(apiEntry), + err => (err ? console.log(err) : null) + ) + fs.writeFile( + `./static/${dir}/${post.title}.json`, + JSON.stringify(apiEntry), + err => (err ? console.log(err) : null) + ) +}) + posts = posts.map(({ date, title, content, route }) => { const { year, month, day } = date const { description, meta } = content diff --git a/scripts/postbuild.sh b/scripts/postbuild.sh index 6da3659..7b7b1e5 100755 --- a/scripts/postbuild.sh +++ b/scripts/postbuild.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -mkdir ./dist/api +mkdir -p ./dist/api mkdir ./static/api node -r esm ./scripts/generateApi.js |