1
0
mirror of https://github.com/Luzifer/wiki.git synced 2024-09-16 14:18:29 +00:00
wiki/src/view.vue
Knut Ahlers a70eb9306a
Port frontend to Vue 3 / Bootstrap 5.3
and update dependencies

Signed-off-by: Knut Ahlers <knut@ahlers.me>
2024-01-30 15:46:01 +01:00

126 lines
2.4 KiB
Vue

<template>
<div class="container">
<div class="row">
<div
ref="content"
class="col relAnchor"
>
<router-link
v-if="$route.params.page"
class="btn btn-secondary btn-sm editBtn"
:to="{ name: 'edit', params: { page: $route.params.page } }"
>
<i class="fas fa-edit" />
</router-link>
<md-render
:content="content"
:prerender="prerender"
@rendered="rendered"
/>
</div>
</div>
</div>
</template>
<script>
/* global Prism */
import mdRender from './markdown.vue'
export default {
components: {
mdRender,
},
data() {
return {
content: '',
}
},
methods: {
intLinkClick(evt) {
const link = evt.target
this.$router.push({ name: 'view', params: { page: link.dataset.page } })
return false
},
loadPage(pageName) {
console.debug(`Loading ${pageName}...`)
return fetch(`/_content/${pageName}`)
.then(resp => {
if (resp.status === 404) {
this.$router.push({ name: 'edit', params: { page: pageName } })
return
}
return resp.json()
})
.then(data => {
if (!data) {
return
}
this.content = data.content
})
.catch(err => {
console.error(err)
})
},
prerender(mdtext) {
// replace [[Internal]] links
mdtext = mdtext.replace(
new RegExp(/\[\[([^\]]+)\]\]/, 'g'),
'<a class="intLink" data-page="$1" href="$1">$1</a>',
)
return mdtext
},
rendered() {
// Give the DOM a moment to update before manipulating further
window.setTimeout(() => {
// Add listeners to internal links
const links = this.$refs.content.getElementsByClassName('intLink')
for (const link of links) {
link.onclick = this.intLinkClick
}
// Highlight code blocks
Prism.highlightAll()
}, 100)
},
},
mounted() {
this.loadPage(this.$route.params.page)
},
name: 'WikiView',
watch: {
'$route'(to, from) {
if (to.params.page === from.params.page) {
return
}
this.loadPage(to.params.page)
},
},
}
</script>
<style>
.editBtn {
position: absolute;
right: 5px;
top: 5px;
}
.relAnchor {
position: relative;
}
</style>