1
0
mirror of synced 2026-05-22 22:53:20 +00:00
Files
music-metadata/doc-gen/gen.ts

68 lines
2.2 KiB
TypeScript

import * as path from 'node:path';
import * as fs from 'node:fs';
import { fileURLToPath } from 'node:url';
import { commonTagsKeys, isSingleton } from '../lib/common/GenericTagTypes.js';
import { CombinedTagMapper } from '../lib/common/CombinedTagMapper.js';
import * as markDown from './MarkDown.js';
interface ITagInfoDict {
[key: string]: { description: string };
}
const combinedTagMapper = new CombinedTagMapper();
const filename = fileURLToPath(import.meta.url);
const dirname = path.dirname(filename);
function getNativeSourceTags(nativeType: string, commonTag: string): string[] {
const result: string[] = [];
const tagMapper = combinedTagMapper.tagMappers[nativeType];
Object.keys(tagMapper.tagMap).forEach(nativeTag => {
if (commonTag === tagMapper.tagMap[nativeTag]) {
result.push(nativeTag);
}
});
return result;
}
function write(out: fs.WriteStream) {
const json = fs.readFileSync(path.join(dirname, 'common.json'), {encoding: 'utf-8'});
const commonDescriptionDict: ITagInfoDict = JSON.parse(json);
const table = new markDown.Table();
table.header = new markDown.Row(['Common tag', 'n', 'Description']);
for (const nativeType in combinedTagMapper.tagMappers) {
table.header.values.push(nativeType);
}
for (const commonTagKey of commonTagsKeys) {
const tagInfo = commonDescriptionDict[commonTagKey];
if (!tagInfo)
throw new Error(`${commonTagKey} not found`);
// console.log('common-tag: key=%s, description=%s', commonTagKey, tagInfo.description)
const multiplicity = isSingleton(commonTagKey) ? '1' : '*';
const row = new markDown.Row([commonTagKey, multiplicity, tagInfo.description]);
for (const nativeType in combinedTagMapper.tagMappers) {
row.values.push(getNativeSourceTags(nativeType, commonTagKey).join(', '));
}
table.rows.push(row);
}
table.writeTo(out);
}
const txt = fs.createWriteStream(path.join(dirname, '..', 'doc', 'common_metadata.md'));
txt.write('# Common Metadata\n\n');
txt.write('Common tags, and _native_ to _common_ tag mappings. _n_ indicates the multiplicity.\n');
txt.write('The tag mapping is strongly inspired on the [MusicBrainz Picard tag-mapping](https://picard.musicbrainz.org/docs/mappings/).\n\n');
write(txt);