next-blurhash-previews 0.0.1 → 0.0.3-beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.prettierrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "arrowParens": "avoid"
3
+ }
@@ -0,0 +1,55 @@
1
+ import sharp from "sharp";
2
+ import fetch from "node-fetch";
3
+ import { encode, isBlurhashValid } from "blurhash";
4
+
5
+ import path from "path";
6
+ const __dirname = process.cwd();
7
+
8
+ export async function getSharpImage(imgPath) {
9
+ if (/^http/.test(imgPath)) {
10
+ const buffer = await fetch(imgPath)
11
+ .then(fetchResponse => fetchResponse.arrayBuffer())
12
+ .then(ab => Buffer.from(ab));
13
+
14
+ return sharp(buffer);
15
+ } else {
16
+ return sharp(imgPath);
17
+ }
18
+ }
19
+
20
+ export async function getBlurhash(path) {
21
+ const blurhashImage = await getSharpImage(path);
22
+ const dimensions = await blurhashImage.metadata();
23
+
24
+ const { width, height } = dimensions;
25
+
26
+ return new Promise((res, rej) => {
27
+ blurhashImage
28
+ .raw()
29
+ .ensureAlpha()
30
+ .toBuffer((err, buffer) => {
31
+ try {
32
+ if (err) {
33
+ console.log("Error getting buffer", err);
34
+ } else {
35
+ const blurhash = encode(
36
+ new Uint8ClampedArray(buffer),
37
+ width,
38
+ height,
39
+ 4,
40
+ 4
41
+ );
42
+ if (isBlurhashValid(blurhash)) {
43
+ return res({ blurhash, w: width, h: height });
44
+ } else {
45
+ console.log("FAIL");
46
+ return rej("FAIL");
47
+ }
48
+ }
49
+ } catch (err) {
50
+ console.log("FAIL", err);
51
+ return rej("FAIL", err);
52
+ }
53
+ });
54
+ });
55
+ }
@@ -2,24 +2,54 @@
2
2
 
3
3
  import fs from "fs";
4
4
  import path, { dirname } from "path";
5
+ import { fileURLToPath } from "url";
6
+
5
7
  import { reporter } from "vfile-reporter";
6
8
  import { remark } from "remark";
9
+ import glob from "glob";
10
+ import colors from "colors";
7
11
 
8
- import retextSentenceSpacing from "../plugin.js";
12
+ import { blurhashPlugin } from "./remark-plugin.js";
9
13
 
10
- import { fileURLToPath } from "url";
11
- const __filename = fileURLToPath(import.meta.url);
14
+ const directoryProcess = process.cwd();
15
+
16
+ const allArgs = process.argv;
17
+ const inputGlob = allArgs.at(-1);
18
+
19
+ const files = glob.sync(inputGlob, { root: directoryProcess });
12
20
 
13
- const __dirname = dirname(__filename);
14
- const buffer = fs.readFileSync(path.join(__dirname, "example.md"));
21
+ const publicPath = path.resolve(directoryProcess, "public");
22
+
23
+ if (fs.existsSync(publicPath)) {
24
+ run();
25
+ } else {
26
+ console.log(
27
+ colors.red(
28
+ `\nERROR: Could not find Next's public directory to resolve images from. Looking for:\n\n${publicPath}\n\nEnsure you run this command from your Next application.\n`
29
+ )
30
+ );
31
+ }
32
+
33
+ async function runFile(file) {
34
+ const buffer = fs.readFileSync(file);
35
+
36
+ return new Promise(res => {
37
+ remark()
38
+ .use(blurhashPlugin(publicPath))
39
+ .process(buffer)
40
+ .then(outputFile => {
41
+ fs.writeFileSync(file, outputFile.toString());
42
+ res();
43
+ });
44
+ });
45
+ }
15
46
 
16
47
  async function run() {
17
- remark()
18
- .use(retextSentenceSpacing)
19
- .process(buffer)
20
- .then((file) => {
21
- fs.writeFileSync("output.md", file.toString());
22
- });
48
+ for (const file of files) {
49
+ console.log(colors.blue(`Processing file: ${file}\n`));
50
+ await runFile(file);
51
+ console.log(colors.blue(`${file} finished\n`));
52
+ }
23
53
  }
24
54
 
25
- run();
55
+ //run();
@@ -0,0 +1,63 @@
1
+ import path from "path";
2
+ import { visitParents } from "unist-util-visit-parents";
3
+ import prettier from "prettier";
4
+
5
+ import colors from "colors";
6
+
7
+ import { getBlurhash } from "./generateBlurhash.js";
8
+
9
+ export const blurhashPlugin = publicPath => () => {
10
+ return (tree, file, done) => {
11
+ let outstanding = 0;
12
+
13
+ visitParents(tree, "image", async (node, ancestors) => {
14
+ let { url: imagePath, alt } = node;
15
+
16
+ const originalImg = imagePath;
17
+ if (!/http/.test(imagePath)) {
18
+ imagePath = path.resolve(publicPath, imagePath);
19
+ }
20
+
21
+ console.log(colors.blue(`Attempting ${imagePath}...`));
22
+
23
+ try {
24
+ outstanding++;
25
+
26
+ const blurHash = await getBlurhash(imagePath);
27
+
28
+ console.log(
29
+ colors.green(`Finished processing ${imagePath}\n\t`, blurHash)
30
+ );
31
+
32
+ const parent = ancestors[ancestors.length - 1];
33
+ const index = parent.children.indexOf(node);
34
+
35
+ const newNode = `
36
+ <blurhash-image url="${originalImg}" preview='${JSON.stringify(blurHash)}'>
37
+ <img alt="${alt || ""}" src="${originalImg}" slot="image" />
38
+ <canvas width="${blurHash.w}" height="${blurHash.h}" slot="preview"></canvas>
39
+ </blurhash-image>`.trim();
40
+
41
+ parent.children[index] = {
42
+ type: "html",
43
+ value: prettier.format(newNode, { parser: "html" }).trimEnd(),
44
+ };
45
+ } catch (er) {
46
+ console.log(colors.red(`Error processing ${imagePath}\n\t`, er));
47
+ } finally {
48
+ outstanding--;
49
+ setTimeout(() => {
50
+ if (outstanding === 0) {
51
+ done();
52
+ }
53
+ }, 1);
54
+ }
55
+ });
56
+
57
+ setTimeout(() => {
58
+ if (outstanding === 0) {
59
+ done();
60
+ }
61
+ }, 1);
62
+ };
63
+ };
@@ -3,17 +3,15 @@ import { decode } from "../node_modules/blurhash/dist/esm/index";
3
3
  type blurhash = { w: number; h: number; blurhash: string };
4
4
 
5
5
  class ImageWithPreview extends HTMLElement {
6
- isReady: boolean = false;
7
- loaded: boolean = false;
8
6
  sd: ShadowRoot;
9
7
  mo?: MutationObserver;
10
8
 
11
- static observedAttributes = ["preview", "url"];
9
+ static observedAttributes = ["preview"];
12
10
 
13
- get imgEl(): any {
11
+ get #imgEl(): any {
14
12
  return this.querySelector("img");
15
13
  }
16
- get canvasEl(): any {
14
+ get #canvasEl(): any {
17
15
  return this.querySelector("canvas");
18
16
  }
19
17
 
@@ -24,65 +22,50 @@ class ImageWithPreview extends HTMLElement {
24
22
  this.sd.innerHTML = `<slot name="preview"></slot>`;
25
23
  }
26
24
 
27
- checkReady = () => {
28
- if (this.imgEl && this.canvasEl) {
29
- this.ready();
25
+ #checkReady = () => {
26
+ if (this.#imgEl && this.#canvasEl) {
30
27
  this.mo?.disconnect();
28
+
29
+ if (this.#imgEl.complete) {
30
+ this.#imgLoad();
31
+ } else {
32
+ this.#updatePreview();
33
+ this.#imgEl.addEventListener("load", this.#imgLoad);
34
+ }
35
+
36
+ return true;
31
37
  }
32
- return this.isReady;
33
38
  };
34
39
 
35
40
  connectedCallback() {
36
- if (!this.checkReady()) {
37
- this.mo = new MutationObserver(this.checkReady);
38
- this.mo.observe(this, { subtree: true, childList: true, attributes: false });
41
+ if (!this.#checkReady()) {
42
+ this.mo = new MutationObserver(this.#checkReady);
43
+ this.mo.observe(this, {
44
+ subtree: true,
45
+ childList: true,
46
+ attributes: false,
47
+ });
39
48
  }
40
49
  }
41
50
 
42
- ready() {
43
- this.isReady = true;
44
- this.updatePreview();
45
- if (this.imgEl.complete) {
46
- this.onImageLoad();
47
- }
48
- this.imgEl.addEventListener("load", this.onImageLoad);
49
- }
50
-
51
- attributeChangedCallback(name, oldValue, newValue) {
52
- if (!this.isReady) {
53
- return;
54
- }
51
+ #imgLoad = () => {
52
+ this.sd.innerHTML = `<slot name="image"></slot>`;
53
+ };
55
54
 
56
- if (name === "preview") {
57
- this.updatePreview();
58
- } else if (name === "url") {
59
- this.loaded = false;
55
+ attributeChangedCallback(name) {
56
+ if (this.#canvasEl && name === "preview") {
57
+ this.#updatePreview();
60
58
  }
61
-
62
- this.render();
63
59
  }
64
60
 
65
- updatePreview() {
61
+ #updatePreview() {
66
62
  const previewObj = JSON.parse(this.getAttribute("preview")!);
67
- updateBlurHashPreview(this.canvasEl, previewObj);
68
- }
69
-
70
- onImageLoad = () => {
71
- if (this.getAttribute("url") !== this.imgEl.src) {
72
- setTimeout(() => {
73
- this.loaded = true;
74
- this.render();
75
- }, 1500);
76
- }
77
- };
78
-
79
- render() {
80
- this.sd.innerHTML = `<slot name="${this.loaded ? "image" : "preview"}"></slot>`;
63
+ updateBlurHashPreview(this.#canvasEl, previewObj);
81
64
  }
82
65
  }
83
66
 
84
- if (!customElements.get("uikit-image")) {
85
- customElements.define("uikit-image", ImageWithPreview);
67
+ if (!customElements.get("blurhash-image")) {
68
+ customElements.define("blurhash-image", ImageWithPreview);
86
69
  }
87
70
 
88
71
  function updateBlurHashPreview(canvasEl: HTMLCanvasElement, preview: blurhash) {
@@ -1,7 +1,15 @@
1
- import { useEffect, useRef } from "react";
1
+ import React, { useEffect, useRef } from "react";
2
+
3
+ declare global {
4
+ namespace JSX {
5
+ interface IntrinsicElements {
6
+ ["blurhash-image"]: any;
7
+ }
8
+ }
9
+ }
2
10
 
3
11
  export const ImageWithPreview = (props: any) => {
4
- const wcRef = useRef(null);
12
+ const wcRef = useRef<any>(null);
5
13
 
6
14
  const { preview } = props;
7
15
  const { w, h } = JSON.parse(preview);
@@ -11,9 +19,9 @@ export const ImageWithPreview = (props: any) => {
11
19
  }, []);
12
20
 
13
21
  return (
14
- <uikit-image ref={wcRef} {...props}>
22
+ <blurhash-image ref={wcRef} {...props}>
15
23
  <img style={{ display: "none" }} />
16
24
  <canvas width={w} height={h}></canvas>
17
- </uikit-image>
25
+ </blurhash-image>
18
26
  );
19
27
  };
@@ -0,0 +1,11 @@
1
+ ![A](./img1.png)
2
+
3
+ <some-component>
4
+ <p>Hello</p>
5
+ </some-component>
6
+
7
+ Yo
8
+
9
+ ![external image](https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg)
10
+
11
+ ![](./img1.png)
@@ -0,0 +1,10 @@
1
+ ![A](./img1.png)
2
+
3
+ <some-component>
4
+ <p>Hello</p>
5
+ </some-component>
6
+
7
+ Yo
8
+
9
+ ![external image](https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg)
10
+
@@ -0,0 +1,10 @@
1
+ ![A](./img1.png)
2
+
3
+ <some-component>
4
+ <p>Hello</p>
5
+ </some-component>
6
+
7
+ Yo
8
+
9
+ ![external image](https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg)
10
+
@@ -0,0 +1,10 @@
1
+ ![A](./img1.png)
2
+
3
+ <some-component>
4
+ <p>Hello</p>
5
+ </some-component>
6
+
7
+ Yo
8
+
9
+ ![external image](https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg)
10
+
@@ -21,10 +21,17 @@
21
21
  }
22
22
  },
23
23
  "..": {
24
- "version": "0.0.4",
24
+ "version": "0.0.1",
25
25
  "license": "ISC",
26
26
  "dependencies": {
27
+ "@types/react": "^18.0.15",
28
+ "@types/react-dom": "^18.0.6",
29
+ "@vitejs/plugin-react": "^1.3.2",
27
30
  "blurhash": "^1.1.5",
31
+ "colors": "^1.4.0",
32
+ "glob": "^8.0.3",
33
+ "next": "^12.2.0",
34
+ "node-fetch": "^3.2.6",
28
35
  "node-html-parser": "^5.3.3",
29
36
  "prettier": "^2.7.1",
30
37
  "remark": "^14.0.2",
@@ -33,10 +40,11 @@
33
40
  "to-vfile": "^7.2.3",
34
41
  "unist-util-visit": "^4.1.0",
35
42
  "unist-util-visit-parents": "^5.1.0",
36
- "vfile-reporter": "^7.0.4"
43
+ "vfile-reporter": "^7.0.4",
44
+ "vite": "^2.9.13"
37
45
  },
38
46
  "bin": {
39
- "next-static-markdown-previews": "index.js"
47
+ "next-blurhash-markdown": "bin/markdown-sync.js"
40
48
  }
41
49
  },
42
50
  "node_modules/@babel/runtime": {
@@ -2167,7 +2175,7 @@
2167
2175
  }
2168
2176
  }
2169
2177
  },
2170
- "node_modules/next-static-image-previews": {
2178
+ "node_modules/next-blurhash-previews": {
2171
2179
  "resolved": "..",
2172
2180
  "link": true
2173
2181
  },
@@ -4481,10 +4489,17 @@
4481
4489
  "use-sync-external-store": "1.1.0"
4482
4490
  }
4483
4491
  },
4484
- "next-static-image-previews": {
4492
+ "next-blurhash-previews": {
4485
4493
  "version": "file:..",
4486
4494
  "requires": {
4495
+ "@types/react": "^18.0.15",
4496
+ "@types/react-dom": "^18.0.6",
4497
+ "@vitejs/plugin-react": "^1.3.2",
4487
4498
  "blurhash": "^1.1.5",
4499
+ "colors": "^1.4.0",
4500
+ "glob": "^8.0.3",
4501
+ "next": "^12.2.0",
4502
+ "node-fetch": "^3.2.6",
4488
4503
  "node-html-parser": "^5.3.3",
4489
4504
  "prettier": "^2.7.1",
4490
4505
  "remark": "^14.0.2",
@@ -4493,7 +4508,8 @@
4493
4508
  "to-vfile": "^7.2.3",
4494
4509
  "unist-util-visit": "^4.1.0",
4495
4510
  "unist-util-visit-parents": "^5.1.0",
4496
- "vfile-reporter": "^7.0.4"
4511
+ "vfile-reporter": "^7.0.4",
4512
+ "vite": "^2.9.13"
4497
4513
  }
4498
4514
  },
4499
4515
  "object-assign": {
@@ -1,7 +1,5 @@
1
1
  import Document, { Html, Head, Main, NextScript } from "next/document";
2
- import { imagePreviewBootstrap, src } from "next-static-image-previews";
3
-
4
- import Script from "next/script";
2
+ import { imagePreviewBootstrap, src } from "next-blurhash-previews";
5
3
 
6
4
  export default class MyDocument extends Document {
7
5
  render() {
@@ -11,16 +11,37 @@ export default function Home() {
11
11
  <div className={styles.container}>
12
12
  Root
13
13
  <br />
14
- <button onClick={() => setVal((x) => x + 1)}>Refresh</button>
14
+ <button onClick={() => setVal(x => x + 1)}>Refresh</button>
15
15
  {val}
16
- <uikit-image key={val} url="/dynamo-introduction/img1.png" preview='{ "w": 364, "h": 196, "blurhash": "L8S6SsD*%gt7IVM|tRRj~qWBM{NG" }'>
17
- <img slot="image" src="/dynamo-introduction/img1.png" />
18
- <canvas slot="preview" width="364" height="196"></canvas>
19
- </uikit-image>
20
- <uikit-image key={val + 9} url="/dynamo-introduction/img5a.png" preview='{ "w": 2244, "h": 622, "blurhash": "LnPGmj_zIA:KS}j[s:ay-VWVRjay" }'>
21
- <img slot="image" src="/dynamo-introduction/img5a.png" />
22
- <canvas slot="preview" width="2244" height="622"></canvas>
23
- </uikit-image>
16
+ <div style={{ display: "flex" }}>
17
+ <blurhash-image
18
+ key={val}
19
+ url="/dynamo-introduction/img1.png"
20
+ preview='{ "w": 364, "h": 196, "blurhash": "L8S6SsD*%gt7IVM|tRRj~qWBM{NG" }'
21
+ >
22
+ <img slot="image" src="/dynamo-introduction/img1.png" />
23
+ <canvas slot="preview" width="364" height="196"></canvas>
24
+ </blurhash-image>
25
+ <blurhash-image
26
+ key={val + 2}
27
+ url="/dynamo-introduction/img5a.png"
28
+ preview='{ "w": 500, "h": 139, "blurhash": "LnPGmj_zIA:KS}j[s:ay-VWVRjay" }'
29
+ >
30
+ <img slot="image" src="/dynamo-introduction/img5a.png" />
31
+ <canvas slot="preview" width="500" height="139"></canvas>
32
+ </blurhash-image>
33
+ <blurhash-image
34
+ key={val + 5}
35
+ url="https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg"
36
+ preview='{ "w": 106, "h": 160, "blurhash": "U38|kkTJ01}A;{Or57;N01NG+?IW01rX^NAW" }'
37
+ >
38
+ <img
39
+ slot="image"
40
+ src="https://d193qjyckdxivp.cloudfront.net/medium-covers/573d1b97120426ef0078aa92/fcb820e4-36e3-4741-a3de-6994c46a66cc.jpg"
41
+ />
42
+ <canvas slot="preview" width="106" height="160"></canvas>
43
+ </blurhash-image>
44
+ </div>
24
45
  </div>
25
46
  );
26
47
  }
Binary file
Binary file
@@ -0,0 +1,3 @@
1
+ .container {
2
+ margin: 15px;
3
+ }
@@ -1122,11 +1122,15 @@
1122
1122
  "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
1123
1123
  "version" "1.4.0"
1124
1124
 
1125
- "next-static-image-previews@file:/Users/arackis/Documents/git/next-static-image-previews":
1125
+ "next-blurhash-previews@file:/Users/arackis/Documents/git/next-blurhash-previews":
1126
1126
  "resolved" "file:.."
1127
- "version" "0.0.4"
1127
+ "version" "0.0.1"
1128
1128
  dependencies:
1129
+ "@types/react" "^18.0.15"
1130
+ "@types/react-dom" "^18.0.6"
1131
+ "@vitejs/plugin-react" "^1.3.2"
1129
1132
  "blurhash" "^1.1.5"
1133
+ "next" "^12.2.0"
1130
1134
  "node-html-parser" "^5.3.3"
1131
1135
  "prettier" "^2.7.1"
1132
1136
  "remark" "^14.0.2"
@@ -1136,6 +1140,7 @@
1136
1140
  "unist-util-visit" "^4.1.0"
1137
1141
  "unist-util-visit-parents" "^5.1.0"
1138
1142
  "vfile-reporter" "^7.0.4"
1143
+ "vite" "^2.9.13"
1139
1144
 
1140
1145
  "next@12.2.0":
1141
1146
  "integrity" "sha512-B4j7D3SHYopLYx6/Ark0fenwIar9tEaZZFAaxmKjgcMMexhVJzB3jt7X+6wcdXPPMeUD6r09weUtnDpjox/vIA=="
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "next-blurhash-previews",
3
- "version": "0.0.1",
3
+ "version": "0.0.3-beta2",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
7
- "next-static-markdown-previews": "./bin/markdown-sync.js"
7
+ "next-blurhash-markdown": "./bin/markdown-sync.js"
8
8
  },
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "build": "vite build",
12
- "build-watch": "vite build -w"
12
+ "build-watch": "vite build -w",
13
+ "prepare": "npm run build"
13
14
  },
14
15
  "type": "module",
15
16
  "repository": {
@@ -27,8 +28,10 @@
27
28
  "@types/react-dom": "^18.0.6",
28
29
  "@vitejs/plugin-react": "^1.3.2",
29
30
  "blurhash": "^1.1.5",
31
+ "colors": "^1.4.0",
32
+ "glob": "^8.0.3",
30
33
  "next": "^12.2.0",
31
- "node-html-parser": "^5.3.3",
34
+ "node-fetch": "^3.2.6",
32
35
  "prettier": "^2.7.1",
33
36
  "remark": "^14.0.2",
34
37
  "retext": "^8.1.0",
@@ -4,9 +4,18 @@ export default function writeBootstrapScript() {
4
4
  return {
5
5
  name: "write-bootstrap-script",
6
6
  closeBundle() {
7
- let BootstrapModule = fs.readFileSync("./components/imagePreviewBootstrap.tsx", "utf8");
8
- const bootstrapScript = fs.readFileSync("./build/ImageWithPreview.js", "utf8");
9
- BootstrapModule = BootstrapModule.replace("/*HERE*/", bootstrapScript.replace(/[\r\n]\s*$/, "").replace(/`/g, "\\`")).replace(/\${/g, "\\${");
7
+ let BootstrapModule = fs.readFileSync(
8
+ "./components/imagePreviewBootstrap.tsx",
9
+ "utf8"
10
+ );
11
+ const bootstrapScript = fs.readFileSync(
12
+ "./build/imageWithPreview.js",
13
+ "utf8"
14
+ );
15
+ BootstrapModule = BootstrapModule.replace(
16
+ "/*HERE*/",
17
+ bootstrapScript.replace(/[\r\n]\s*$/, "").replace(/`/g, "\\`")
18
+ ).replace(/\${/g, "\\${");
10
19
  fs.writeFileSync("./imagePreviewBootstrap.js", BootstrapModule);
11
20
  },
12
21
  };
package/vite.config.ts CHANGED
@@ -7,9 +7,9 @@ export default defineConfig({
7
7
  target: "es2022",
8
8
  outDir: "./build",
9
9
  lib: {
10
- entry: "components/ImageWithPreview.tsx",
10
+ entry: "components/imageWithPreview.tsx",
11
11
  formats: ["cjs"],
12
- fileName: () => "ImageWithPreview.js",
12
+ fileName: () => "imageWithPreview.js",
13
13
  name: "imageWithPreview",
14
14
  },
15
15
  //minify: false,
package/example.md DELETED
@@ -1,9 +0,0 @@
1
- ![A](./img1.png)
2
-
3
- <some-component>
4
- <p>Hello</p>
5
- </some-component>
6
-
7
- Yo
8
-
9
- ![Query execution plan](/img5.png)
package/output.md DELETED
@@ -1,15 +0,0 @@
1
- <div>
2
- <img />
3
- <span>Hey there 2</span>
4
- </div>
5
-
6
- <some-component>
7
- <p>Hello</p>
8
- </some-component>
9
-
10
- Yo
11
-
12
- <div>
13
- <img />
14
- <span>Hey there 2</span>
15
- </div>
package/plugin.js DELETED
@@ -1,78 +0,0 @@
1
- import fs from "fs";
2
- import path, { dirname } from "path";
3
-
4
- import sharp from "sharp";
5
- import { encode, isBlurhashValid } from "blurhash";
6
-
7
- import { visit } from "unist-util-visit";
8
- import { visitParents } from "unist-util-visit-parents";
9
-
10
- import HTMLParser from "node-html-parser";
11
- import prettier from "prettier";
12
-
13
- import { fileURLToPath } from "url";
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
-
17
- export default function retextSentenceSpacing() {
18
- return (tree, file, done) => {
19
- visitParents(tree, "image", async (node, ancestors) => {
20
- const { url } = node;
21
-
22
- //const resolvedPath = path.join(process.cwd(), url);
23
- const resolvedPath = path.join(__dirname, url);
24
- console.log(resolvedPath);
25
-
26
- const image = sharp(resolvedPath);
27
- const dimensions = await image.metadata();
28
-
29
- const { width, height } = dimensions;
30
- console.log(height, width);
31
-
32
- image
33
- .raw()
34
- .ensureAlpha()
35
- .toBuffer((err, buffer) => {
36
- console.log("got buffer");
37
- try {
38
- if (err) {
39
- console.log("Error getting buffer", err);
40
- } else {
41
- const blurhash = encode(new Uint8ClampedArray(buffer), width, height, 4, 4);
42
- if (isBlurhashValid(blurhash)) {
43
- console.log({ blurhash, w: width, h: height });
44
- } else {
45
- return console.log("FAIL");
46
- }
47
- }
48
- } catch (err) {
49
- return console.log("FAIL", err);
50
- }
51
- });
52
-
53
- const parent = ancestors[ancestors.length - 1];
54
- const index = parent.children.indexOf(node);
55
-
56
- const newNode = HTMLParser.parse(`<div>
57
- <img />
58
- <span>Hey there 2</span>
59
- </div>`);
60
-
61
- parent.children[index] = {
62
- type: "html",
63
- value: prettier.format(newNode.outerHTML, { parser: "html" }).trimEnd(),
64
- };
65
-
66
- setTimeout(() => {
67
- done();
68
- }, 3000);
69
- //parent.children[index] = replacement;
70
-
71
- // parent.children.push({
72
- // type: "html",
73
- // value: `<div><img /><span>Hey there</span></div>`,
74
- // position: node.position,
75
- // });
76
- });
77
- };
78
- }