Skip to content

Commit 996b744

Browse files
committed
Termコンポーネントを書くための[[用語]]記法を導入
1 parent 2ac1f9c commit 996b744

File tree

5 files changed

+138
-13
lines changed

5 files changed

+138
-13
lines changed

docs/1-trial-session/04-javascript/index.mdx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ title: JavaScriptことはじめ
44

55
import helloWorldByJavascriptVideo from "./hello-world-by-javascript.mp4";
66

7-
## <Term>JavaScript</Term>
7+
## [[JavaScript]]
88

99
{/* prettier-ignore */}
10-
<Term>HTML</Term>がウェブサイトの構造を表す言語だとすれば、<Term>**JavaScript**</Term>はウェブサイトに振る舞いを与える言語といえます。ブラウザさえあれば環境に関係なく同じように実行可能な、強力なプログラミング言語です。
10+
[[HTML]]がウェブサイトの構造を表す言語だとすれば、[[**JavaScript**]]はウェブサイトに振る舞いを与える言語といえます。ブラウザさえあれば環境に関係なく同じように実行可能な、強力なプログラミング言語です。
1111

1212
![Web開発で用いられる言語](../02-html/web-development-languages.drawio.svg)
1313

14-
## <Term>JavaScript</Term>でHello World!
14+
## [[JavaScript]]でHello World!
1515

16-
プログラミングの世界では、まず画面に`Hello World!`と表示させることが慣例になっています。<Term>JavaScript</Term>を用いて画面に`Hello World!`を表示してみましょう。
16+
プログラミングの世界では、まず画面に`Hello World!`と表示させることが慣例になっています。[[JavaScript]]を用いて画面に`Hello World!`を表示してみましょう。
1717

1818
まずは、`index.html`を次のように書き換えます。
1919

@@ -40,26 +40,26 @@ document.write("Hello World!");
4040

4141
<video src={helloWorldByJavascriptVideo} controls />
4242

43-
## <Term>JavaScript</Term>が動く仕組み
43+
## [[JavaScript]]が動く仕組み
4444

45-
<Term>HTML</Term>ファイルの中に、以下のような記述があります。
45+
[[HTML]]ファイルの中に、以下のような記述があります。
4646

4747
```html title="index.html"
4848
<script src="./script.js"></script>
4949
```
5050

51-
まず、この記述によって、`script.js`ファイルがブラウザによって読み込まれます。この`script.js`に記述されているのが<Term>JavaScript</Term>です。
51+
まず、この記述によって、`script.js`ファイルがブラウザによって読み込まれます。この`script.js`に記述されているのが[[JavaScript]]です。
5252

5353
:::info
5454

55-
この講座の中では、`script`<Term>要素</Term>を常に **`body`<Term>要素</Term>の末尾** に記述するようにします。これは、<Term>JavaScript</Term>が読み込まれるタイミングで他のすべての<Term>HTML要素</Term>がすでに表示されていることを保証するためです。
55+
この講座の中では、`script`[[要素]]を常に **`body`[[要素]]の末尾** に記述するようにします。これは、[[JavaScript]]が読み込まれるタイミングで他のすべての[[HTML要素]]がすでに表示されていることを保証するためです。
5656

5757
:::
5858

59-
## <Term>JavaScript</Term> の基本文法
59+
## [[JavaScript]] の基本文法
6060

6161
{/* prettier-ignore */}
62-
<Term>JavaScript</Term>のプログラムで、セミコロンで区切られた部分を<Term>文</Term>と呼びます。<Term>JavaScript</Term>の実行環境は、プログラム中に含まれる<Term>文</Term>を上から下に向けて順番に実行していきます。
62+
[[JavaScript]]のプログラムで、セミコロンで区切られた部分を[[]]と呼びます。[[JavaScript]]の実行環境は、プログラム中に含まれる[[]]を上から下に向けて順番に実行していきます。
6363
`document.write`はブラウザの画面に出力するための命令です。
6464

6565
```javascript title="script.js"

docusaurus.config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type * as Preset from "@docusaurus/preset-classic";
44
import { execSync } from "node:child_process";
55
import math from "remark-math";
66
import katex from "rehype-katex";
7+
import remarkTerm from "./src/remark/remark-term";
78

89
const config: Config = {
910
title: "ut.code(); Learn",
@@ -46,7 +47,7 @@ const config: Config = {
4647
showLastUpdateTime: true,
4748
sidebarPath: "./sidebars.ts",
4849
editUrl: "https://github.com/ut-code/utcode-learn/blob/master/",
49-
remarkPlugins: [math],
50+
remarkPlugins: [math, remarkTerm],
5051
rehypePlugins: [katex],
5152
},
5253
theme: {

package-lock.json

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
"@tippyjs/react": "^4.2.6",
2323
"clsx": "^2.1.1",
2424
"hast-util-is-element": "^3.0.0",
25+
"mdast-util-mdx-jsx": "^3.2.0",
26+
"mdast-util-phrasing": "^4.1.0",
2527
"outdent": "^0.8.0",
2628
"prism-react-renderer": "^2.4.1",
2729
"react": "^19.1.1",
@@ -31,7 +33,8 @@
3133
"react-slick": "^0.31.0",
3234
"rehype-katex": "^7.0.1",
3335
"remark-math": "^6.0.0",
34-
"slick-carousel": "^1.8.1"
36+
"slick-carousel": "^1.8.1",
37+
"unified": "^11.0.5"
3538
},
3639
"browserslist": {
3740
"production": [
@@ -52,6 +55,7 @@
5255
"@docusaurus/module-type-aliases": "^3.9.1",
5356
"@docusaurus/tsconfig": "^3.9.1",
5457
"@docusaurus/types": "^3.9.1",
58+
"@types/mdast": "^4.0.4",
5559
"@types/react-slick": "^0.23.13",
5660
"prettier": "^3.6.2",
5761
"typescript": "^5.9.3"

src/remark/remark-term.ts

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import type { Plugin } from "unified";
2+
import type { Nodes, Root, RootContent } from "mdast";
3+
import "mdast-util-mdx-jsx";
4+
import { phrasing } from "mdast-util-phrasing";
5+
6+
const remarkTerm: Plugin<[], Root> = () => (tree) => transform(tree);
7+
8+
export default remarkTerm;
9+
10+
function isParent(node: Nodes) {
11+
return "children" in node;
12+
}
13+
14+
function transform(node: Nodes) {
15+
if (!isParent(node)) return;
16+
17+
for (const child of node.children) {
18+
transform(child);
19+
}
20+
21+
node.children = transformChildren(
22+
node.children.flatMap((child) => transformChild(child)),
23+
);
24+
}
25+
26+
function transformChild(node: RootContent): RootContent[] {
27+
if (node.type !== "text") return [node];
28+
29+
const transformedChildren: RootContent[] = [];
30+
let text = node.value;
31+
32+
if (text.startsWith("]]")) {
33+
transformedChildren.push({ type: "text", value: "]]" });
34+
text = text.slice(2);
35+
}
36+
37+
if (text.endsWith("[[")) {
38+
text = text.slice(0, -2);
39+
}
40+
41+
for (const segmentedText of text.split(/(\[\[.*?\]\])/)) {
42+
if (segmentedText === "") {
43+
continue;
44+
}
45+
if (segmentedText.startsWith("[[")) {
46+
transformedChildren.push({
47+
type: "mdxJsxTextElement",
48+
name: "Term",
49+
attributes: [],
50+
children: [
51+
{
52+
type: "text",
53+
value: segmentedText.slice(2, -2),
54+
},
55+
],
56+
});
57+
} else {
58+
transformedChildren.push({
59+
type: "text",
60+
value: segmentedText,
61+
});
62+
}
63+
}
64+
65+
if (node.value.endsWith("[[")) {
66+
transformedChildren.push({ type: "text", value: "[[" });
67+
}
68+
69+
return transformedChildren;
70+
}
71+
72+
function transformChildren(children: RootContent[]): RootContent[] {
73+
const transformedChildren: RootContent[] = [];
74+
75+
let i = 0;
76+
while (i < children.length) {
77+
const openingBracket = children[i];
78+
const innerElement = children[i + 1];
79+
const closingBracket = children[i + 2];
80+
if (
81+
openingBracket.type !== "text" ||
82+
openingBracket.value !== "[[" ||
83+
!innerElement
84+
) {
85+
transformedChildren.push(openingBracket);
86+
i++;
87+
continue;
88+
}
89+
90+
if (
91+
!closingBracket ||
92+
closingBracket.type !== "text" ||
93+
closingBracket.value !== "]]"
94+
) {
95+
transformedChildren.push(openingBracket, innerElement);
96+
i += 2;
97+
continue;
98+
}
99+
100+
if (!phrasing(innerElement)) {
101+
transformedChildren.push(openingBracket, innerElement, closingBracket);
102+
i += 3;
103+
continue;
104+
}
105+
106+
transformedChildren.push({
107+
type: "mdxJsxTextElement",
108+
name: "Term",
109+
attributes: [],
110+
children: [innerElement],
111+
});
112+
i += 3;
113+
}
114+
115+
return transformedChildren;
116+
}

0 commit comments

Comments
 (0)