UNPKG

openlyrics-parser

Version:

Parses and extracts data from OpenLyrics files, and creates them!

115 lines (114 loc) 4.36 kB
"use strict"; 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;