Skip to content

Commit

Permalink
add prismjs for syntax highlight
Browse files Browse the repository at this point in the history
  • Loading branch information
Hetari committed Oct 1, 2024
1 parent e076445 commit 86b28b2
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 25 deletions.
18 changes: 18 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,13 @@
"vue": "^3.0.0"
},
"dependencies": {
"@types/prismjs": "^1.26.4",
"vue": "^3.0.0"
},
"devDependencies": {
"@types/node": "^22.7.4",
"@vitejs/plugin-vue": "^5.1.2",
"prismjs": "^1.29.0",
"semantic-release": "^24.1.2",
"typescript": "^5.5.3",
"vite": "^5.4.1",
Expand All @@ -64,4 +66,4 @@
"publishConfig": {
"access": "public"
}
}
}
11 changes: 1 addition & 10 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,7 @@

<template>
Test:
<code>
<pre>
<CodeBlock
class="my-class"
id="my-id"
code="'sss'" />
<CodeBlock code="'123'" />
<CodeBlock code="'123sds'"> s </CodeBlock>
</pre>
</code>
<CodeBlock code="console.log('Hello, World!');" />
End of App.vue
</template>

Expand Down
15 changes: 6 additions & 9 deletions src/components/code-block/CodeBlock.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,18 @@
<div
:class="class"
:id="id">
Vuejs Code Block
<code
:class="codeClass"
v-html="highlightedCode"></code>
<slot name="default"></slot>
</div>
{{ code }}

Slot here default:
<slot name="default"></slot>

Slot here trigger:
<slot name="trigger"></slot>
</template>

<script setup lang="ts">
import { defineComponent, toRefs } from 'vue';
import { defineComponent, ref, toRefs } from 'vue';
import { codeBlockProps, codeBlockInstance } from './types';
import { useCodeBlock } from './use-code-block';
import { highlightedCode } from './utils';
defineProps(codeBlockProps());
defineComponent<codeBlockInstance>({
Expand Down
10 changes: 8 additions & 2 deletions src/components/code-block/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ export const codeBlockProps = () =>
code: {
type: String as PropType<string>,
required: true
},
codeClass: {
type: String as PropType<string>,
required: false,
default: ''
}
} as const);

Expand Down Expand Up @@ -49,16 +54,17 @@ export interface UseCodeBlockProps {
class: MaybeRefOrGetter<string | null>;
id: MaybeRefOrGetter<string | null>;
code: MaybeRefOrGetter<string>;
codeClass: MaybeRefOrGetter<string>;
}

// Props goes here
// The type `PublicCodeBlockProps` allows optional properties from UseCodeBlockProps,
// but ensures that properties are required.
export type PublicCodeBlockProps = Partial<
// Omit properties from UseCodeBlockProps to make the remaining props optional
Omit<UseCodeBlockProps, 'code' | 'class' | 'id'>
Omit<UseCodeBlockProps, 'code' | 'class' | 'id' | 'codeClass'>
> &
// Then explicitly pick properties from UseCodeBlockProps to make them required
Pick<UseCodeBlockProps, 'code' | 'class' | 'id'>;
Pick<UseCodeBlockProps, 'code' | 'class' | 'id' | 'codeClass'>;

export type PropertyFunction<T> = () => T;
3 changes: 2 additions & 1 deletion src/components/code-block/use-code-block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ import { PublicCodeBlockProps } from './types';
const defaultProps = {
class: '',
id: '',
code: ''
code: '',
codeClass: ''
};

export function useCodeBlock(props: PublicCodeBlockProps) {
Expand Down
26 changes: 26 additions & 0 deletions src/components/code-block/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import 'prismjs/themes/prism.css';

import { computed } from 'vue';
import { highlight, languages } from 'prismjs';

export function highlightedCode(code: String, language: String) {
return computed(() => {
if (code === null || code === undefined) {
throw new Error('Code is null or undefined');
}

if (typeof code !== 'string') {
throw new Error('Code is not a string');
}

const prismLanguage = languages[language as string] || languages.markup;

if (!prismLanguage) {
throw new Error(
`Prism component for language "${language}" was not found. Did you forget to register it?`
);
}

return highlight(code, prismLanguage, language as string);
});
}
1 change: 1 addition & 0 deletions src/types/code-block.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ declare module 'code-block' {
class: string;
id: string;
code: string;
codeClass: string;
}

const CodeBlockType: DefineComponent<CodeBlockProps>;
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.tsbuildinfo
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"root":["./src/index.ts","./src/main.ts","./src/components/components.ts","./src/components/index.ts","./src/components/code-block/index.ts","./src/components/code-block/types.ts","./src/components/code-block/use-code-block.ts","./src/types/code-block.d.ts","./src/App.vue","./src/components/code-block/CodeBlock.vue"],"version":"5.6.2"}
{"root":["./src/index.ts","./src/main.ts","./src/components/components.ts","./src/components/index.ts","./src/components/code-block/index.ts","./src/components/code-block/types.ts","./src/components/code-block/use-code-block.ts","./src/components/code-block/utils.ts","./src/types/code-block.d.ts","./src/App.vue","./src/components/code-block/CodeBlock.vue"],"version":"5.6.2"}
2 changes: 1 addition & 1 deletion vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export default defineConfig({
formats: ['es', 'cjs'] // Output formats
},
rollupOptions: {
external: ['vue'], // Externalize dependencies
external: ['vue', 'prismjs/themes/prism.css'],
output: {
globals: {
vue: 'Vue' // Global variable for Vue
Expand Down

0 comments on commit 86b28b2

Please sign in to comment.