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.data.title}

- + {song.body}