UNPKG

openlyrics-parser

Version:

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

96 lines (95 loc) 3.36 kB
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; };