openlyrics-parser
Version:
Parses and extracts data from OpenLyrics files, and creates them!
115 lines (114 loc) • 4.36 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.OpenLyricsBuilder = exports.OpenLyricsParser = void 0;
const fast_xml_parser_1 = require("fast-xml-parser");
const builder_1 = require("./builder");
const parser_1 = require("./parser");
__exportStar(require("./parser.model"), exports);
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 fast_xml_parser_1.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_1.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,
};
};
exports.OpenLyricsParser = OpenLyricsParser;
__exportStar(require("./builder.model"), exports);
const OpenLyricsBuilder = (songData) => {
const olBuilder = new builder_1.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 fast_xml_parser_1.XMLBuilder({
attributeNamePrefix: '@',
format: true,
ignoreAttributes: false,
processEntities: false,
suppressBooleanAttributes: false,
suppressUnpairedNode: false,
unpairedTags: ['songbook'],
});
const xmlString = builder.build(documentObj).trim();
return xmlString;
};
exports.OpenLyricsBuilder = OpenLyricsBuilder;