Skip to content

Commit ed0c8b7

Browse files
revert patching and adopt the code from https://github.com/montogeek/remark-refractor
1 parent 163d43a commit ed0c8b7

5 files changed

Lines changed: 154 additions & 96 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,16 +136,17 @@
136136
"postcss": "^8.5.8",
137137
"postcss-loader": "^8.2.0",
138138
"prettier": "^3.8.1",
139+
"prismjs": "^1.30.0",
139140
"react-refresh": "^0.18.0",
140141
"redirect-webpack-plugin": "^1.0.0",
142+
"refractor": "^5.0.0",
141143
"remark": "^15.0.1",
142144
"remark-autolink-headings": "7.0.1",
143145
"remark-emoji": "^5.0.2",
144146
"remark-extract-anchors": "1.1.1",
145147
"remark-frontmatter": "^5.0.0",
146148
"remark-gfm": "^4.0.1",
147149
"remark-html": "^16.0.1",
148-
"remark-refractor": "^1.0.0",
149150
"rimraf": "^6.1.2",
150151
"sass": "^1.97.3",
151152
"sass-loader": "^16.0.6",
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// inspired by https://github.com/montogeek/remark-refractor
2+
/* eslint-disable import/no-unresolved */
3+
import bash from "refractor/bash";
4+
import coffeescript from "refractor/coffeescript";
5+
import { refractor } from "refractor/core";
6+
import diff from "refractor/diff";
7+
import json from "refractor/json";
8+
import jsx from "refractor/jsx";
9+
import less from "refractor/less";
10+
import markdown from "refractor/markdown";
11+
import nginx from "refractor/nginx";
12+
import ruby from "refractor/ruby";
13+
import scss from "refractor/scss";
14+
import stylus from "refractor/stylus";
15+
import twig from "refractor/twig";
16+
import typescript from "refractor/typescript";
17+
import yaml from "refractor/yaml";
18+
import { visit } from "unist-util-visit";
19+
import jsLinksDetails from "./js-links-details.mjs";
20+
21+
refractor.register(bash);
22+
refractor.register(diff);
23+
refractor.register(yaml);
24+
refractor.register(json);
25+
refractor.register(typescript);
26+
refractor.register(nginx);
27+
refractor.register(ruby);
28+
refractor.register(scss);
29+
refractor.register(less);
30+
refractor.register(jsx);
31+
refractor.register(twig);
32+
refractor.register(markdown);
33+
refractor.register(coffeescript);
34+
refractor.register(stylus);
35+
refractor.register(jsLinksDetails);
36+
37+
function attacher({ include, exclude } = {}) {
38+
function visitor(node) {
39+
const { lang } = node;
40+
if (
41+
!lang ||
42+
(include && !include.includes(lang)) ||
43+
(exclude && exclude.includes(lang))
44+
) {
45+
return;
46+
}
47+
let { data } = node;
48+
if (!data) {
49+
node.data = data = {};
50+
}
51+
try {
52+
data.hChildren = refractor.highlight(node.value, lang).children;
53+
for (const child of data.hChildren) {
54+
if (
55+
child.properties &&
56+
child.properties.className.includes("keyword")
57+
) {
58+
if (child.children[1]) {
59+
child.properties.componentname = child.children[1].value.trim();
60+
}
61+
if (child.children[2]) {
62+
child.properties.url =
63+
child.children[2].children[0].value.replaceAll('"', "");
64+
}
65+
}
66+
}
67+
} catch (err) {
68+
if (refractor.registered(lang)) {
69+
console.warn("Prism failed to highlight:", err);
70+
}
71+
}
72+
data.hProperties ||= {};
73+
data.hProperties.className = [
74+
"hljs",
75+
...(data.hProperties.className || []),
76+
`language-${lang}`,
77+
];
78+
}
79+
80+
function transformer(tree) {
81+
visit(tree, "code", visitor);
82+
}
83+
84+
return transformer;
85+
}
86+
87+
export default attacher;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// inspired by https://github.com/montogeek/remark-refractor
2+
function jsLinksDetails(Prism) {
3+
Prism.languages["js-with-links"] = Prism.languages.extend("javascript");
4+
Prism.languages["js-with-links-details"] = Prism.languages.extend(
5+
"javascript",
6+
{
7+
keyword: {
8+
// pattern: /<[a-z]+>(.|\n)*?<\/[a-z]+>/gi, // <mode>
9+
// pattern: /<[a-z]+ url=\"([^\"]+)\">(.|\n)*?<\/[a-z]+>/gi, <mode url="">
10+
// pattern: /<([a-z]+ \"([^\"]+)\")>(.|\n)*?<\/[a-z]+>/gi, // <mode "url">
11+
pattern: /<([a-z]+) "([^"]+)">(.|\n?)*<\/\1>/gi, // <mode "url"> with backreference
12+
greedy: true,
13+
inside: {
14+
tag: {
15+
pattern: /(<default>|<\/default>)/,
16+
greedy: true,
17+
inside: {
18+
rest: Prism.languages.js,
19+
},
20+
},
21+
rest: Prism.languages.js,
22+
},
23+
},
24+
},
25+
);
26+
}
27+
jsLinksDetails.displayName = "jslinks";
28+
jsLinksDetails.aliases = ["js-with-links", "js-with-links-details"];
29+
30+
export default jsLinksDetails;

webpack.common.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import { createRequire } from "node:module";
22
import path from "node:path";
33
import { fileURLToPath } from "node:url";
44
// eslint-disable-next-line import/no-extraneous-dependencies
5-
import hastscript from "hastscript";
5+
import { h as hastscript } from "hastscript";
66
import MiniCssExtractPlugin from "mini-css-extract-plugin";
77
import autolink from "remark-autolink-headings";
88
import remarkEmoji from "remark-emoji";
99
import frontmatter from "remark-frontmatter";
1010
import gfm from "remark-gfm";
11-
import refractor from "remark-refractor";
1211
import webpack from "webpack";
1312
import cleanup from "./src/remark-plugins/remark-cleanup-readme/index.mjs";
1413
import aside from "./src/remark-plugins/remark-custom-asides/index.mjs";
14+
import refractor from "./src/remark-plugins/remark-refractor/index.mjs";
1515
import remarkRemoveDuplicateH1 from "./src/remark-plugins/remark-remove-duplicate-h1/index.mjs";
1616
import remarkRemoveHeadingId from "./src/remark-plugins/remark-remove-heading-id/index.mjs";
1717
import remarkResponsiveTable from "./src/remark-plugins/remark-responsive-table/remark-responsive-table.mjs";

0 commit comments

Comments
 (0)