diff --git a/package.json b/package.json
index 021ad6c..3a80407 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,6 @@
"astro": "astro"
},
"dependencies": {
- "@astrojs/markdoc": "^0.1.1",
"@astrojs/mdx": "^0.19.0",
"@astrojs/solid-js": "^2.1.0",
"astro": "^2.3.2",
@@ -18,7 +17,6 @@
"leaflet": "^1.9.3",
"leaflet.markercluster": "^1.5.3",
"lunr": "^2.3.9",
- "node-html-parser": "^6.1.5",
"rehype-katex": "^6.0.3",
"rehype-raw": "^6.1.1",
"rehype-stringify": "^9.0.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 35966a8..bc814af 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,9 +1,6 @@
lockfileVersion: '6.0'
dependencies:
- '@astrojs/markdoc':
- specifier: ^0.1.1
- version: 0.1.1(astro@2.3.2)
'@astrojs/mdx':
specifier: ^0.19.0
version: 0.19.0(astro@2.3.2)(rollup@3.21.0)
@@ -25,9 +22,6 @@ dependencies:
lunr:
specifier: ^2.3.9
version: 2.3.9
- node-html-parser:
- specifier: ^6.1.5
- version: 6.1.5
rehype-katex:
specifier: ^6.0.3
version: 6.0.3
@@ -121,23 +115,6 @@ packages:
vscode-uri: 3.0.7
dev: false
- /@astrojs/markdoc@0.1.1(astro@2.3.2):
- resolution: {integrity: sha512-NJgMTZWTCcL+4qmDim/wi53Mc6X7hk12hyI3JHWW7oiWVchdrvbdvG5i3c2bmT73+bMtG8XOEt2vvapQRixAKw==}
- engines: {node: '>=16.12.0'}
- peerDependencies:
- astro: ^2.2.0
- dependencies:
- '@markdoc/markdoc': 0.2.2
- astro: 2.3.2(sass@1.62.1)
- esbuild: 0.17.18
- gray-matter: 4.0.3
- kleur: 4.1.5
- zod: 3.21.4
- transitivePeerDependencies:
- - '@types/react'
- - react
- dev: false
-
/@astrojs/markdown-remark@2.1.4(astro@2.3.2):
resolution: {integrity: sha512-z5diCcFo2xkBAJ11KySAIKpZZkULZmzUvWsZ2VWIOrR6QrEgEfVl5jTpgPSedx4m+xUPuemlUviOotGB7ItNsQ==}
peerDependencies:
@@ -722,21 +699,6 @@ packages:
resolution: {integrity: sha512-4/RWEeXDO6bocPONheFe6gX/oQdP/bEpv0oL4HqjPP5DCenBSt0mHgahppY49N0CpsaqffdwPq+TlX9CYOq2Dw==}
dev: false
- /@markdoc/markdoc@0.2.2:
- resolution: {integrity: sha512-0TiD9jmA5h5znN4lxo7HECAu3WieU5g5vUsfByeucrdR/x88hEilpt16EydFyJwJddQ/3w5HQgW7Ovy62r4cyw==}
- engines: {node: '>=14.7.0'}
- peerDependencies:
- '@types/react': '*'
- react: '*'
- peerDependenciesMeta:
- '@types/react':
- optional: true
- react:
- optional: true
- optionalDependencies:
- '@types/markdown-it': 12.2.3
- dev: false
-
/@mdx-js/mdx@2.3.0:
resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==}
dependencies:
@@ -908,35 +870,16 @@ packages:
'@types/geojson': 7946.0.10
dev: true
- /@types/linkify-it@3.0.2:
- resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==}
- dev: false
- optional: true
-
/@types/lunr@2.3.4:
resolution: {integrity: sha512-j4x4XJwZvorEUbA519VdQ5b9AOU9TSvfi8tvxMAfP8XzNLtFex7A8vFQwqOx3WACbV0KMXbACV3cZl4/gynQ7g==}
dev: true
- /@types/markdown-it@12.2.3:
- resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==}
- requiresBuild: true
- dependencies:
- '@types/linkify-it': 3.0.2
- '@types/mdurl': 1.0.2
- dev: false
- optional: true
-
/@types/mdast@3.0.11:
resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==}
dependencies:
'@types/unist': 2.0.6
dev: false
- /@types/mdurl@1.0.2:
- resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
- dev: false
- optional: true
-
/@types/mdx@2.0.5:
resolution: {integrity: sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==}
dev: false
@@ -1170,10 +1113,6 @@ packages:
readable-stream: 3.6.2
dev: false
- /boolbase@1.0.0:
- resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- dev: false
-
/boxen@6.2.1:
resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -1363,21 +1302,6 @@ packages:
which: 2.0.2
dev: false
- /css-select@5.1.0:
- resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
- dependencies:
- boolbase: 1.0.0
- css-what: 6.1.0
- domhandler: 5.0.3
- domutils: 3.0.1
- nth-check: 2.1.1
- dev: false
-
- /css-what@6.1.0:
- resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
- engines: {node: '>= 6'}
- dev: false
-
/csstype@3.1.2:
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
dev: false
@@ -1438,33 +1362,6 @@ packages:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dev: false
- /dom-serializer@2.0.0:
- resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
- dependencies:
- domelementtype: 2.3.0
- domhandler: 5.0.3
- entities: 4.5.0
- dev: false
-
- /domelementtype@2.3.0:
- resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
- dev: false
-
- /domhandler@5.0.3:
- resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
- engines: {node: '>= 4'}
- dependencies:
- domelementtype: 2.3.0
- dev: false
-
- /domutils@3.0.1:
- resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==}
- dependencies:
- dom-serializer: 2.0.0
- domelementtype: 2.3.0
- domhandler: 5.0.3
- dev: false
-
/dset@3.1.2:
resolution: {integrity: sha512-g/M9sqy3oHe477Ar4voQxWtaPIFw1jTdKZuomOjhCcBx9nHUNn0pu6NopuFFrTh/TRZIKEj+76vLWFu9BNKk+Q==}
engines: {node: '>=4'}
@@ -1911,11 +1808,6 @@ packages:
space-separated-tokens: 2.0.2
dev: false
- /he@1.2.0:
- resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
- hasBin: true
- dev: false
-
/html-entities@2.3.3:
resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
dev: false
@@ -2815,13 +2707,6 @@ packages:
lodash: 4.17.21
dev: false
- /node-html-parser@6.1.5:
- resolution: {integrity: sha512-fAaM511feX++/Chnhe475a0NHD8M7AxDInsqQpz6x63GRF7xYNdS8Vo5dKsIVPgsOvG7eioRRTZQnWBrhDHBSg==}
- dependencies:
- css-select: 5.1.0
- he: 1.2.0
- dev: false
-
/node-releases@2.0.10:
resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==}
dev: false
@@ -2837,12 +2722,6 @@ packages:
path-key: 4.0.0
dev: false
- /nth-check@2.1.1:
- resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- dependencies:
- boolbase: 1.0.0
- dev: false
-
/onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
diff --git a/src/components/markdown/lyrics/Lyrics.astro b/src/components/markdown/lyrics/Lyrics.astro
index c5c57d3..20e8f62 100644
--- a/src/components/markdown/lyrics/Lyrics.astro
+++ b/src/components/markdown/lyrics/Lyrics.astro
@@ -1,10 +1,10 @@
---
import Ruby from "../Ruby.astro";
-import { transform } from "./transform";
+import { transform } from "../../../utils/songs/parse";
-const html = await Astro.slots.render('default');
-const lyrics = transform(html);
-const cols = Object.keys(lyrics[0]);
+const data = await Astro.slots.render('default');
+const lyrics = transform(data, true);
+const cols = lyrics.length ? Object.keys(lyrics[0]) : [];
---
diff --git a/src/components/markdown/lyrics/transform.ts b/src/components/markdown/lyrics/transform.ts
deleted file mode 100644
index c8af163..0000000
--- a/src/components/markdown/lyrics/transform.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import { Node, HTMLElement, parse } from 'node-html-parser';
-
-
-interface Stack {
- [key: string]: string[][];
-}
-
-interface Verse {
- [key: string]: string[];
-}
-
-
-function extractLines(nodes: Node[]): string[] {
- return nodes
- .map(node => node.text)
- .filter(text => text != '\n');
-}
-
-function createVerse(data: Stack, lang: string) {
- (lang in data)
- ? data[lang].push([])
- : data[lang] = [[]];
-}
-
-function toStack(html: string): Stack {
- const root = parse(html);
- const stack: Stack = {};
-
- const nodes = root.childNodes as HTMLElement[];
- nodes.reduce((lang, node) => {
- const tag = node.rawTagName;
-
- // Change language context
- if (tag.match(/h\d/))
- return node.text;
-
- // Parse list as verse
- if (tag === 'ul') {
- createVerse(stack, lang);
- const lines = extractLines(node.childNodes);
- stack[lang].at(-1)!.push(...lines);
- }
-
- return lang;
- }, '');
-
- return stack;
-}
-
-function reduceStack(stack: Stack): Verse[] {
- const langs = Object.keys(stack);
- const length = langs.map(lang => stack[lang].length).reduce((a, b) => Math.max(a, b));
- const verses: Verse[] = [];
-
- for (const _ of Array(length)) {
- const verse: Verse = {};
- for (const lang of langs) {
- const lines = stack[lang].pop();
- verse[lang] = lines ? lines : [];
- }
- verses.push(verse);
- }
- return verses.reverse();
-}
-
-export function transform(html: string) {
- return reduceStack(toStack(html));
-}
diff --git a/src/content/songs/black-eyes.mdoc b/src/content/songs/black-eyes.md
similarity index 97%
rename from src/content/songs/black-eyes.mdoc
rename to src/content/songs/black-eyes.md
index c55ab00..5ac778f 100644
--- a/src/content/songs/black-eyes.mdoc
+++ b/src/content/songs/black-eyes.md
@@ -11,7 +11,6 @@ album:
- Mei Ayakura
---
-{% lyrics %}
# Japanese
- 瞬きをして 切り取る時間
- 何気なくても 大切な今を
@@ -37,4 +36,3 @@ album:
- Kireina mama nokosareteku
- Itsuka omoidashite
- Iroasete shimattemo
-{% /lyrics %}
diff --git a/src/content/songs/dont-lose.mdoc b/src/content/songs/dont-lose.md
similarity index 94%
rename from src/content/songs/dont-lose.mdoc
rename to src/content/songs/dont-lose.md
index cbbf135..4ef1178 100644
--- a/src/content/songs/dont-lose.mdoc
+++ b/src/content/songs/dont-lose.md
@@ -7,7 +7,6 @@ album:
track: 7
---
-{% lyrics %}
# Japanese
- こんなにも 綺麗な月は
- どうしても 届かないけど
@@ -25,4 +24,3 @@ album:
- todo
- 「I」してた 閉じ込めるほどに
- だけどもう違うから
-{% /lyrics %}
diff --git a/src/content/songs/dream-again.mdoc b/src/content/songs/dream-again.md
similarity index 90%
rename from src/content/songs/dream-again.mdoc
rename to src/content/songs/dream-again.md
index d5cd695..9b59ac9 100644
--- a/src/content/songs/dream-again.mdoc
+++ b/src/content/songs/dream-again.md
@@ -7,8 +7,6 @@ album:
track: 5
---
-{% lyrics %}
# Japanese
- どこまでも続いていく階段 [降]{くだ}った途方もないほど
- 行きたい場所はもう決まっている 幻想の声のする所
-{% /lyrics %}
diff --git a/src/pages/songs/[...slug].astro b/src/pages/songs/[...slug].astro
index 4a2340d..a0ebb6e 100644
--- a/src/pages/songs/[...slug].astro
+++ b/src/pages/songs/[...slug].astro
@@ -2,7 +2,8 @@
import Base from "../../layouts/Base.astro";
import Song from "../../components/markdown/Song.astro";
import { CollectionEntry, getCollection } from "astro:content";
-import { ALBUMS } from "../../utils/songs";
+import { ALBUMS } from "../../utils/songs/data";
+import Lyrics from "../../components/markdown/lyrics/Lyrics.astro";
export async function getStaticPaths() {
return (await getCollection('songs'))
@@ -40,7 +41,7 @@ const metadata = {
-
+ {song.body}