diff --git a/.gitignore b/.gitignore
index 5cf9d71..b66e922 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,6 @@ pnpm-debug.log*
# jetbrains setting folder
.idea/
-.vercel/
-.netlify/
.vercel
+.netlify
+.wrangler
diff --git a/package.json b/package.json
index 7dd14a2..7863f3c 100644
--- a/package.json
+++ b/package.json
@@ -21,8 +21,11 @@
"astro-seo": "^0.8.4",
"cheerio": "1.0.0-rc.12",
"dayjs": "^1.11.12",
+ "flourite": "^1.3.0",
"lru-cache": "^11.0.0",
"ofetch": "^1.3.4",
+ "prismjs": "^1.29.0",
+ "prismjs-components-importer": "^0.2.0",
"sanitize-html": "^2.13.0"
},
"devDependencies": {
@@ -31,6 +34,7 @@
"@astrojs/netlify": "^5.4.0",
"@astrojs/node": "^8.3.2",
"@astrojs/vercel": "^7.7.2",
+ "@types/prismjs": "^1.26.4",
"astro-eslint-parser": "^1.0.2",
"autoprefixer": "^10.4.20",
"cssnano": "^7.0.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index fff0b33..f9cc6d9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -26,12 +26,21 @@ importers:
dayjs:
specifier: ^1.11.12
version: 1.11.12
+ flourite:
+ specifier: ^1.3.0
+ version: 1.3.0
lru-cache:
specifier: ^11.0.0
version: 11.0.0
ofetch:
specifier: ^1.3.4
version: 1.3.4
+ prismjs:
+ specifier: ^1.29.0
+ version: 1.29.0
+ prismjs-components-importer:
+ specifier: ^0.2.0
+ version: 0.2.0(prismjs@1.29.0)
sanitize-html:
specifier: ^2.13.0
version: 2.13.0
@@ -51,6 +60,9 @@ importers:
'@astrojs/vercel':
specifier: ^7.7.2
version: 7.7.2(astro@4.12.3(@types/node@22.0.0)(typescript@5.5.4))
+ '@types/prismjs':
+ specifier: ^1.26.4
+ version: 1.26.4
astro-eslint-parser:
specifier: ^1.0.2
version: 1.0.2(typescript@5.5.4)
@@ -1647,6 +1659,9 @@ packages:
'@types/pg@8.6.1':
resolution: {integrity: sha1-CZRQuNyXfoGXpE9SKc7e+VyHR/k=}
+ '@types/prismjs@1.26.4':
+ resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==}
+
'@types/shimmer@1.2.0':
resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==}
@@ -2739,6 +2754,10 @@ packages:
resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
engines: {node: '>=8'}
+ flourite@1.3.0:
+ resolution: {integrity: sha512-iuhWXuX07QwHMnJ1Irh4sD1bk/QFMHg8jVgWsjSAqoIqgIyJtRPnUNKyZAPXrw7pQkDvxb5AIz2KPihEoyVcqw==}
+ engines: {node: '>=16'}
+
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
@@ -3909,6 +3928,11 @@ packages:
printable-characters@1.0.42:
resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==}
+ prismjs-components-importer@0.2.0:
+ resolution: {integrity: sha512-2WJBqocATZOOoApIH9y6QmZG7dkQsX9BKexbW6LjMZ9QBAxoDsmoAKTzOt3g9xgpTQVEydmkS4I4tSlguJ52Kg==}
+ peerDependencies:
+ prismjs: 1.28.0
+
prismjs@1.29.0:
resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
engines: {node: '>=6'}
@@ -6246,6 +6270,8 @@ snapshots:
pg-protocol: 1.6.1
pg-types: 2.2.0
+ '@types/prismjs@1.26.4': {}
+
'@types/shimmer@1.2.0': {}
'@types/unist@2.0.10': {}
@@ -7668,6 +7694,8 @@ snapshots:
flattie@1.1.1: {}
+ flourite@1.3.0: {}
+
fraction.js@4.3.7: {}
fresh@0.5.2: {}
@@ -9030,6 +9058,10 @@ snapshots:
printable-characters@1.0.42: {}
+ prismjs-components-importer@0.2.0(prismjs@1.29.0):
+ dependencies:
+ prismjs: 1.29.0
+
prismjs@1.29.0: {}
progress@2.0.3: {}
diff --git a/src/components/item.astro b/src/components/item.astro
index bb49ece..f7bd399 100644
--- a/src/components/item.astro
+++ b/src/components/item.astro
@@ -1,5 +1,6 @@
---
import '../assets/item.css'
+import 'prismjs/themes/prism.css'
import dayjs from '../lib/dayjs'
import { getEnv } from '../lib/env'
diff --git a/src/lib/prism.js b/src/lib/prism.js
new file mode 100644
index 0000000..f9efe72
--- /dev/null
+++ b/src/lib/prism.js
@@ -0,0 +1,29 @@
+import prism from 'prismjs'
+
+import 'prismjs-components-importer/cjs/prism-c'
+import 'prismjs-components-importer/cjs/prism-clojure'
+import 'prismjs-components-importer/cjs/prism-cpp'
+import 'prismjs-components-importer/cjs/prism-csharp'
+import 'prismjs-components-importer/cjs/prism-css'
+import 'prismjs-components-importer/cjs/prism-dart'
+import 'prismjs-components-importer/cjs/prism-docker'
+import 'prismjs-components-importer/cjs/prism-elixir'
+import 'prismjs-components-importer/cjs/prism-go'
+import 'prismjs-components-importer/cjs/prism-markup'
+import 'prismjs-components-importer/cjs/prism-java'
+import 'prismjs-components-importer/cjs/prism-javascript'
+import 'prismjs-components-importer/cjs/prism-json'
+import 'prismjs-components-importer/cjs/prism-julia'
+import 'prismjs-components-importer/cjs/prism-kotlin'
+import 'prismjs-components-importer/cjs/prism-lua'
+import 'prismjs-components-importer/cjs/prism-markdown'
+import 'prismjs-components-importer/cjs/prism-pascal'
+import 'prismjs-components-importer/cjs/prism-php'
+import 'prismjs-components-importer/cjs/prism-python'
+import 'prismjs-components-importer/cjs/prism-ruby'
+import 'prismjs-components-importer/cjs/prism-rust'
+import 'prismjs-components-importer/cjs/prism-sql'
+import 'prismjs-components-importer/cjs/prism-typescript'
+import 'prismjs-components-importer/cjs/prism-yaml'
+
+export default prism
diff --git a/src/lib/telegram/index.js b/src/lib/telegram/index.js
index de237da..c487bc9 100644
--- a/src/lib/telegram/index.js
+++ b/src/lib/telegram/index.js
@@ -1,6 +1,8 @@
import { $fetch } from 'ofetch'
import * as cheerio from 'cheerio'
import { LRUCache } from 'lru-cache'
+import flourite from 'flourite'
+import prism from '../prism'
import { getEnv } from '../env'
const cache = new LRUCache({
@@ -108,6 +110,17 @@ function modifyHTMLContent($, content, { index } = {}) {
?.wrap('')
?.before(``)
})
+ $(content).find('pre').each((_index, pre) => {
+ try {
+ const code = $(pre).text()
+ const language = flourite(code, { shiki: true })?.language
+ const highlightedCode = prism.highlight(code, prism.languages[language], language)
+ $(pre).html(`${highlightedCode}`)
+ }
+ catch (error) {
+ console.error(error)
+ }
+ })
return content
}