openlyrics-parser
Version:
Parses and extracts data from OpenLyrics files, and creates them!
96 lines (95 loc) • 3.36 kB
JavaScript
import { XMLBuilder, XMLParser } from 'fast-xml-parser';
import { Builder } from './builder';
import { Parser } from './parser';
export * from './parser.model';
export const OpenLyricsParser = (fileContent) => {
const alwaysArray = [
'song.properties.titles.title',
'song.properties.titles.title.text',
'song.properties.authors.author',
'song.properties.comments.comment',
'song.properties.songbooks.songbook',
'song.properties.themes.theme',
'song.lyrics.verse',
'song.lyrics.verse.lines',
'song.lyrics.instrument',
'song.lyrics.instrument.lines',
'song.format.tags.tag',
];
const xmlParser = new XMLParser({
ignoreAttributes: false,
ignoreDeclaration: true,
attributeNamePrefix: '',
parseTagValue: true,
parseAttributeValue: true,
stopNodes: ['song.lyrics.verse.lines', 'song.lyrics.instrument.lines'],
isArray: (_name, jPath) => alwaysArray.includes(jPath),
tagValueProcessor: (_tagName, tagValue, jPath) => {
if (jPath === 'song.lyrics.verse.lines') {
return (tagValue
.replace(/<\/?br ?\/?>([\r\n])?/gi, '\n')
.replace(/<!--.+?-->/g, ''));
}
return null;
},
});
const parsedDoc = xmlParser.parse(fileContent);
const olParser = new Parser();
const meta = olParser.getSongMeta(parsedDoc.song);
const properties = olParser.getSongProperties(parsedDoc.song.properties);
const format = olParser.getSongFormat(parsedDoc.song.format);
const verses = olParser.getSongVerses(parsedDoc.song.lyrics.verse);
const instruments = olParser.getSongInstruments(parsedDoc.song.lyrics.instrument);
return {
meta,
properties,
format,
verses,
instruments,
};
};
export * from './builder.model';
export const OpenLyricsBuilder = (songData) => {
const olBuilder = new Builder();
const documentObj = {
'?xml': {
'@version': '1.0',
'@encoding': 'UTF-8',
},
'?xml-stylesheet': {
'@href': '../stylesheets/openlyrics.css',
'@type': 'text/css',
},
song: {
'@xmlns': 'http://openlyrics.info/namespace/2009/song',
'@xml:lang': '',
'@version': '0.9',
'@createdIn': '',
'@modifiedIn': '',
'@modifiedDate': '',
properties: {
titles: { title: [] },
},
format: {},
lyrics: {
verse: [],
},
},
};
olBuilder.overwriteMeta(documentObj, songData.meta);
olBuilder.overwriteProperties(documentObj, songData.properties);
olBuilder.overwriteFormats(documentObj, songData.format);
olBuilder.overwriteVerses(documentObj, songData.verses);
olBuilder.overwriteInstruments(documentObj, songData.instruments);
const builder = new XMLBuilder({
attributeNamePrefix: '@',
format: true,
ignoreAttributes: false,
processEntities: false,
suppressBooleanAttributes: false,
suppressUnpairedNode: false,
unpairedTags: ['songbook'],
});
const xmlString = builder.build(documentObj).trim();
return xmlString;
};