Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { h, defineComponent } from 'vue'
import { h, defineComponent, computed } from 'vue'
import Prism from 'prismjs'

export default defineComponent({
Expand All @@ -16,40 +16,45 @@ export default defineComponent({
}
},
setup(props, { slots, attrs }) {
const defaultSlot = (slots && slots.default && slots.default()) || []
const code =
props.code || (defaultSlot && defaultSlot.length)
? defaultSlot[0].children
: ''
const inline = props.inline
const language = props.language
const prismLanguage = Prism.languages[language]
const className = `language-${language}`
const defaultSlot = computed(() => (slots && slots.default && slots.default()) || []);
const code = computed(() => {
return props.code
|| (
defaultSlot.value && defaultSlot.value.length
? defaultSlot.value[0].children
: ''
)
);
const prismLanguage = computed(() => Prism.languages[props.language]);
const className = computed(() => `language-${props.language}`);

if (process.env.NODE_ENV === 'development' && !prismLanguage) {
throw new Error(
`Prism component for language "${language}" was not found, did you forget to register it? See all available ones: https://cdn.jsdelivr.net/npm/prismjs/components/`
)
}

const highlightedCode = computed(() => Prism.highlight(code.value, prismLanguage.value));

return () => {
if (inline) {
if (props.inline) {
return h('code', {
class: [className],
innerHTML: Prism.highlight(code, prismLanguage)
class: [className.value],
innerHTML: highlightedCode.value
})
}

return h(
'pre',
{
...attrs,
class: [attrs.class, className]
class: [attrs.class, className.value]
},
[
h('code', {
...attrs,
class: [attrs.class, className],
innerHTML: Prism.highlight(code, prismLanguage)
class: [attrs.class, className.value],
innerHTML: highlightedCode.value
})
]
)
Expand Down