diff --git a/src/plugins/rehype-picture-webp.mjs b/src/plugins/rehype-picture-webp.mjs
index c23442c..fd36a9a 100644
--- a/src/plugins/rehype-picture-webp.mjs
+++ b/src/plugins/rehype-picture-webp.mjs
@@ -1,4 +1,14 @@
import { visit } from "unist-util-visit";
+import { R2_BASE } from "../config/r2.mjs";
+
+const WIDTHS = [480, 800, 1200];
+const SIZES = "(max-width: 640px) 100vw, (max-width: 1024px) 80vw, 1200px";
+
+function buildTransformUrl(src, width) {
+ // Extract path từ full URL
+ const path = src.replace(R2_BASE, "");
+ return `${R2_BASE}/cdn-cgi/image/width=${width},format=auto,onerror=redirect${path}`;
+}
export function rehypePictureWebp() {
return (tree) => {
@@ -9,27 +19,37 @@ export function rehypePictureWebp() {
const src = node.properties?.src || "";
// Chỉ xử lý ảnh từ R2
- if (!src.includes("media.balodeplao.com")) return;
- if (!/\.(jpe?g|png)$/i.test(src)) return;
+ if (!src.startsWith(R2_BASE)) return;
- /* const webpSrc = src.replace(/\.(jpe?g|png)$/i, ".webp"); */
+ // Tạo srcset với nhiều width
+ const srcset = WIDTHS.map(
+ (w) => `${buildTransformUrl(src, w)} ${w}w`,
+ ).join(", ");
+
+ const defaultSrc = buildTransformUrl(src, 800);
- // Wrap
thành với WebP source + fallback
parent.children[index] = {
type: "element",
tagName: "picture",
properties: {},
children: [
- /* {
+ {
type: "element",
tagName: "source",
- properties: { type: "image/webp", srcSet: webpSrc },
+ properties: {
+ type: "image/webp",
+ srcSet: srcset,
+ sizes: SIZES,
+ },
children: [],
- }, */
+ },
{
...node,
properties: {
...node.properties,
+ src: defaultSrc,
+ srcSet: srcset,
+ sizes: SIZES,
loading: "lazy",
decoding: "async",
},