diff --git a/src/lib/lyrics/parser.ts b/src/lib/lyrics/parser.ts index 1db4671..328f5aa 100644 --- a/src/lib/lyrics/parser.ts +++ b/src/lib/lyrics/parser.ts @@ -26,7 +26,7 @@ interface ParserScriptItem { singer?: string; } -export interface ScriptItem extends ParserScriptItem{ +export interface ScriptItem extends ParserScriptItem { end: number; chorus?: string; } @@ -64,10 +64,10 @@ interface IDTag { } function convertTimeToMs({ - mins, - secs, - decimals - }: { + mins, + secs, + decimals +}: { mins?: number | string; secs?: number | string; decimals?: string; @@ -180,11 +180,11 @@ function lrcLine( ['script_item', { start: r[0], text: joinTokens(r[1]) } as ParserScriptItem] // TODO: Complete this ) : apply( seq( - squareTS, + squareTS, opt_sc(padded(singerIndicator)), rep_sc( seq( - opt_sc(angleTS), + opt_sc(angleTS), trimmed(rep_sc(anythingTyped(['char', '[', ']']))) ) ), @@ -214,10 +214,10 @@ function lrcLine( } return ret as ScriptWordsItem; // TODO: Complete this }); - + const singer = singerPart?.text; const translation = translatePart === undefined ? undefined : joinTokens(translatePart); - + return ['script_item', { start, text, words, singer, translation } as ParserScriptItem]; }), apply(lrcTag, (r) => ['lrc_tag', r as IDTag]), @@ -247,7 +247,7 @@ export function parseLRC( ]); const lines = input - .split('\n') + .split(/\r\n|\r|\n/gu) .filter((line) => line.trim().length > 0) .map((line) => tokenizer.parse(line)); diff --git a/src/test/lrcParser.test.ts b/src/test/lrcParser.test.ts index 791c31a..f3193a2 100644 --- a/src/test/lrcParser.test.ts +++ b/src/test/lrcParser.test.ts @@ -9,15 +9,22 @@ describe('LRC parser test', () => { const test02Text = test02Buffer.toString('utf-8'); const test03Buffer = fs.readFileSync('./src/test/resources/test-03.lrc'); const test03Text = test03Buffer.toString('utf-8'); - it('Parses test-01.lrc', () => { - const result = parseLRC(test01Text, { wordDiv: '', strict: true }); - expect(result.ar).toBe("洛天依"); - expect(result.ti).toBe("中华少女·终"); - expect(result.al).toBe("中华少女"); - expect(result["tool"]).toBe("歌词滚动姬 https://lrc-maker.github.io"); - expect(result.scripts!![1].text).toBe("因果与恩怨牵杂等谁来诊断"); - expect(result.scripts!![1].start).toBe(49000 + 588); + const lf_alternatives = ['\n', '\r\n', '\r']; + + it('Parses test-01.lrc', () => { + for (const lf of lf_alternatives) { + const text = test01Text.replaceAll('\n', lf); + + const result = parseLRC(text, { wordDiv: '', strict: true }); + + expect(result.ar).toBe("洛天依"); + expect(result.ti).toBe("中华少女·终"); + expect(result.al).toBe("中华少女"); + expect(result["tool"]).toBe("歌词滚动姬 https://lrc-maker.github.io"); + expect(result.scripts!![1].text).toBe("因果与恩怨牵杂等谁来诊断"); + expect(result.scripts!![1].start).toBe(49000 + 588); + } }) it('Parses test-02.lrc', () => { const result = parseLRC(test02Text, { wordDiv: ' ', strict: true });