@refrakt-md/media 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +24 -2
- package/dist/config.js.map +1 -1
- package/dist/duration.d.ts +15 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +62 -0
- package/dist/duration.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -14
- package/dist/index.js.map +1 -1
- package/dist/schema/audio.d.ts +19 -5
- package/dist/schema/audio.d.ts.map +1 -1
- package/dist/schema/audio.js +20 -3
- package/dist/schema/audio.js.map +1 -1
- package/dist/tags/audio.d.ts +3 -0
- package/dist/tags/audio.d.ts.map +1 -0
- package/dist/tags/audio.js +89 -0
- package/dist/tags/audio.js.map +1 -0
- package/dist/tags/playlist.d.ts +3 -0
- package/dist/tags/playlist.d.ts.map +1 -0
- package/dist/tags/playlist.js +245 -0
- package/dist/tags/playlist.js.map +1 -0
- package/dist/tags/track.d.ts +3 -0
- package/dist/tags/track.d.ts.map +1 -0
- package/dist/tags/track.js +118 -0
- package/dist/tags/track.js.map +1 -0
- package/dist/types.d.ts +6 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +29 -6
- package/dist/types.js.map +1 -1
- package/package.json +4 -4
- package/dist/tags/music-playlist.d.ts +0 -3
- package/dist/tags/music-playlist.d.ts.map +0 -1
- package/dist/tags/music-playlist.js +0 -87
- package/dist/tags/music-playlist.js.map +0 -1
- package/dist/tags/music-recording.d.ts +0 -17
- package/dist/tags/music-recording.d.ts.map +0 -1
- package/dist/tags/music-recording.js +0 -96
- package/dist/tags/music-recording.js.map +0 -1
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA0B7C,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
export const config = {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
Playlist: {
|
|
3
|
+
block: 'playlist',
|
|
4
|
+
modifiers: {
|
|
5
|
+
type: { source: 'meta', default: 'album' },
|
|
6
|
+
},
|
|
7
|
+
structure: {
|
|
8
|
+
header: {
|
|
9
|
+
tag: 'div', before: true,
|
|
10
|
+
children: [
|
|
11
|
+
{ tag: 'span', ref: 'type-badge', metaText: 'type' },
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
Track: { block: 'track', parent: 'Playlist' },
|
|
17
|
+
Audio: {
|
|
18
|
+
block: 'audio',
|
|
19
|
+
modifiers: {
|
|
20
|
+
waveform: { source: 'meta', default: 'false' },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
// Legacy aliases
|
|
24
|
+
MusicPlaylist: { block: 'playlist' },
|
|
25
|
+
MusicRecording: { block: 'track', parent: 'MusicPlaylist' },
|
|
4
26
|
};
|
|
5
27
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAA+B;IACjD,aAAa,EAAE,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAA+B;IACjD,QAAQ,EAAE;QACT,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE;YACV,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;SAC1C;QACD,SAAS,EAAE;YACV,MAAM,EAAE;gBACP,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;gBACxB,QAAQ,EAAE;oBACT,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;iBACpD;aACD;SACD;KACD;IACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE;IAC7C,KAAK,EAAE;QACN,KAAK,EAAE,OAAO;QACd,SAAS,EAAE;YACV,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;SAC9C;KACD;IAED,iBAAiB;IACjB,aAAa,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;IACpC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE;CAC3D,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a duration string into seconds.
|
|
3
|
+
* Supports: mm:ss, h:mm:ss, ISO 8601 (PT5M55S)
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseDuration(value: string): number;
|
|
6
|
+
/**
|
|
7
|
+
* Format seconds into a human-readable duration string.
|
|
8
|
+
* Returns mm:ss or h:mm:ss.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatDuration(seconds: number): string;
|
|
11
|
+
/**
|
|
12
|
+
* Convert seconds to ISO 8601 duration.
|
|
13
|
+
*/
|
|
14
|
+
export declare function toIso8601(seconds: number): string;
|
|
15
|
+
//# sourceMappingURL=duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD"}
|
package/dist/duration.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as Duration from 'iso8601-duration';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a duration string into seconds.
|
|
4
|
+
* Supports: mm:ss, h:mm:ss, ISO 8601 (PT5M55S)
|
|
5
|
+
*/
|
|
6
|
+
export function parseDuration(value) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return 0;
|
|
9
|
+
// ISO 8601 format (PT5M55S)
|
|
10
|
+
if (value.startsWith('PT') || value.startsWith('P')) {
|
|
11
|
+
try {
|
|
12
|
+
const d = Duration.parse(value);
|
|
13
|
+
return (d.hours ?? 0) * 3600 + (d.minutes ?? 0) * 60 + (d.seconds ?? 0);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// h:mm:ss or mm:ss
|
|
20
|
+
const parts = value.split(':').map(Number);
|
|
21
|
+
if (parts.some(isNaN))
|
|
22
|
+
return 0;
|
|
23
|
+
if (parts.length === 3) {
|
|
24
|
+
return parts[0] * 3600 + parts[1] * 60 + parts[2];
|
|
25
|
+
}
|
|
26
|
+
if (parts.length === 2) {
|
|
27
|
+
return parts[0] * 60 + parts[1];
|
|
28
|
+
}
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Format seconds into a human-readable duration string.
|
|
33
|
+
* Returns mm:ss or h:mm:ss.
|
|
34
|
+
*/
|
|
35
|
+
export function formatDuration(seconds) {
|
|
36
|
+
if (seconds <= 0)
|
|
37
|
+
return '0:00';
|
|
38
|
+
const h = Math.floor(seconds / 3600);
|
|
39
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
40
|
+
const s = Math.floor(seconds % 60);
|
|
41
|
+
if (h > 0) {
|
|
42
|
+
return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
|
|
43
|
+
}
|
|
44
|
+
return `${m}:${s.toString().padStart(2, '0')}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Convert seconds to ISO 8601 duration.
|
|
48
|
+
*/
|
|
49
|
+
export function toIso8601(seconds) {
|
|
50
|
+
const h = Math.floor(seconds / 3600);
|
|
51
|
+
const m = Math.floor((seconds % 3600) / 60);
|
|
52
|
+
const s = Math.floor(seconds % 60);
|
|
53
|
+
let result = 'PT';
|
|
54
|
+
if (h > 0)
|
|
55
|
+
result += `${h}H`;
|
|
56
|
+
if (m > 0)
|
|
57
|
+
result += `${m}M`;
|
|
58
|
+
if (s > 0 || result === 'PT')
|
|
59
|
+
result += `${s}S`;
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,eAAO,MAAM,KAAK,EAAE,WAkEnB,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,30 +1,67 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { playlist } from './tags/playlist.js';
|
|
2
|
+
import { track } from './tags/track.js';
|
|
3
|
+
import { audio } from './tags/audio.js';
|
|
3
4
|
import { config } from './config.js';
|
|
4
5
|
export const media = {
|
|
5
6
|
name: 'media',
|
|
6
7
|
displayName: 'Media',
|
|
7
|
-
version: '0.
|
|
8
|
+
version: '0.8.0',
|
|
8
9
|
runes: {
|
|
10
|
+
'playlist': {
|
|
11
|
+
transform: playlist,
|
|
12
|
+
description: 'Playlist with track listing — albums, podcasts, audiobooks, mixes',
|
|
13
|
+
reinterprets: { heading: 'playlist name', list: 'track listing', image: 'cover art' },
|
|
14
|
+
seoType: 'MusicPlaylist',
|
|
15
|
+
fixture: `{% playlist type="album" artist="Pink Floyd" %}
|
|
16
|
+
# The Dark Side of the Moon
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+
|
|
20
|
+
1. **Speak to Me** (1:13)
|
|
21
|
+
2. **Breathe** (2:43)
|
|
22
|
+
3. **On the Run** (3:36)
|
|
23
|
+
{% /playlist %}`,
|
|
24
|
+
},
|
|
25
|
+
'track': {
|
|
26
|
+
transform: track,
|
|
27
|
+
description: 'Individual track with metadata — for use inside playlist or standalone',
|
|
28
|
+
seoType: 'MusicRecording',
|
|
29
|
+
fixture: `{% track src="/audio/breathe.mp3" artist="Pink Floyd" duration="PT2M43S" %}
|
|
30
|
+
Breathe
|
|
31
|
+
{% /track %}`,
|
|
32
|
+
},
|
|
33
|
+
'audio': {
|
|
34
|
+
transform: audio,
|
|
35
|
+
description: 'Audio player — standalone or connected to a playlist',
|
|
36
|
+
fixture: `{% audio src="/audio/interview.mp3" title="Interview" waveform %}
|
|
37
|
+
Recorded on January 15, 2025.
|
|
38
|
+
|
|
39
|
+
1. Introduction (0:00)
|
|
40
|
+
2. Early career (4:30)
|
|
41
|
+
3. Founding the company (18:00)
|
|
42
|
+
{% /audio %}`,
|
|
43
|
+
},
|
|
44
|
+
// Legacy aliases
|
|
9
45
|
'music-playlist': {
|
|
10
|
-
transform:
|
|
11
|
-
|
|
12
|
-
|
|
46
|
+
transform: playlist,
|
|
47
|
+
aliases: ['music-playlist'],
|
|
48
|
+
description: 'Music playlist with track listing (legacy name — use playlist)',
|
|
13
49
|
seoType: 'MusicPlaylist',
|
|
14
|
-
fixture: `{% music-playlist
|
|
50
|
+
fixture: `{% music-playlist %}
|
|
15
51
|
# Album Title
|
|
16
52
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- Track One | 3:42
|
|
20
|
-
- Track Two | 4:15
|
|
53
|
+
- **Track One** (3:42)
|
|
54
|
+
- **Track Two** (4:15)
|
|
21
55
|
{% /music-playlist %}`,
|
|
22
56
|
},
|
|
23
57
|
'music-recording': {
|
|
24
|
-
transform:
|
|
25
|
-
|
|
58
|
+
transform: track,
|
|
59
|
+
aliases: ['music-recording'],
|
|
60
|
+
description: 'Individual music track metadata (legacy name — use track)',
|
|
26
61
|
seoType: 'MusicRecording',
|
|
27
|
-
fixture: `{% music-recording
|
|
62
|
+
fixture: `{% music-recording src="/audio/track.mp3" artist="Artist" duration="PT3M" %}
|
|
63
|
+
Track Name
|
|
64
|
+
{% /music-recording %}`,
|
|
28
65
|
},
|
|
29
66
|
},
|
|
30
67
|
theme: {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,KAAK,GAAgB;IAChC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,OAAO;IACpB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE;QACL,UAAU,EAAE;YACV,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,mEAAmE;YAChF,YAAY,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE;YACrF,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE;;;;;;;;gBAQC;SACX;QACD,OAAO,EAAE;YACP,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,wEAAwE;YACrF,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;;aAEF;SACR;QACD,OAAO,EAAE;YACP,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,sDAAsD;YACnE,OAAO,EAAE;;;;;;aAMF;SACR;QAED,iBAAiB;QACjB,gBAAgB,EAAE;YAChB,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,WAAW,EAAE,gEAAgE;YAC7E,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE;;;;;sBAKO;SACjB;QACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,CAAC,iBAAiB,CAAC;YAC5B,WAAW,EAAE,2DAA2D;YACxE,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;;uBAEQ;SAClB;KACF;IACD,KAAK,EAAE;QACL,KAAK,EAAE,MAA4D;KACpE;CACF,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
package/dist/schema/audio.d.ts
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import { PageSection } from "@refrakt-md/types";
|
|
2
|
-
export declare class
|
|
2
|
+
export declare class Track {
|
|
3
3
|
name: string;
|
|
4
|
-
|
|
4
|
+
artist: string;
|
|
5
5
|
duration: string;
|
|
6
|
-
|
|
6
|
+
src: string;
|
|
7
|
+
url: string;
|
|
8
|
+
date: string;
|
|
9
|
+
number: number | undefined;
|
|
10
|
+
trackType: string;
|
|
7
11
|
}
|
|
8
|
-
export declare class
|
|
12
|
+
export declare class Playlist extends PageSection {
|
|
9
13
|
image: string | undefined;
|
|
10
|
-
|
|
14
|
+
artist: string;
|
|
15
|
+
playlistType: string;
|
|
16
|
+
track: Track[];
|
|
11
17
|
}
|
|
18
|
+
export declare class Audio {
|
|
19
|
+
src: string;
|
|
20
|
+
title: string;
|
|
21
|
+
artist: string;
|
|
22
|
+
waveform: boolean;
|
|
23
|
+
}
|
|
24
|
+
export { Track as MusicRecording };
|
|
25
|
+
export { Playlist as MusicPlaylist };
|
|
12
26
|
//# sourceMappingURL=audio.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/schema/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/schema/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,KAAK;IAChB,IAAI,EAAE,MAAM,CAAM;IAClB,MAAM,EAAE,MAAM,CAAM;IACpB,QAAQ,EAAE,MAAM,CAAM;IACtB,GAAG,EAAE,MAAM,CAAM;IACjB,GAAG,EAAE,MAAM,CAAM;IACjB,IAAI,EAAE,MAAM,CAAM;IAClB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAU;CAC5B;AAED,qBAAa,QAAS,SAAQ,WAAW;IACvC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IACtC,MAAM,EAAE,MAAM,CAAM;IACpB,YAAY,EAAE,MAAM,CAAW;IAC/B,KAAK,EAAE,KAAK,EAAE,CAAM;CACrB;AAED,qBAAa,KAAK;IAChB,GAAG,EAAE,MAAM,CAAM;IACjB,KAAK,EAAE,MAAM,CAAM;IACnB,MAAM,EAAE,MAAM,CAAM;IACpB,QAAQ,EAAE,OAAO,CAAS;CAC3B;AAGD,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,CAAC;AACnC,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,CAAC"}
|
package/dist/schema/audio.js
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
import { PageSection } from "@refrakt-md/types";
|
|
2
|
-
export class
|
|
2
|
+
export class Track {
|
|
3
3
|
constructor() {
|
|
4
4
|
this.name = '';
|
|
5
|
-
this.
|
|
5
|
+
this.artist = '';
|
|
6
6
|
this.duration = '';
|
|
7
|
+
this.src = '';
|
|
8
|
+
this.url = '';
|
|
9
|
+
this.date = '';
|
|
10
|
+
this.trackType = 'song';
|
|
7
11
|
}
|
|
8
12
|
}
|
|
9
|
-
export class
|
|
13
|
+
export class Playlist extends PageSection {
|
|
10
14
|
constructor() {
|
|
11
15
|
super(...arguments);
|
|
12
16
|
this.image = undefined;
|
|
17
|
+
this.artist = '';
|
|
18
|
+
this.playlistType = 'album';
|
|
13
19
|
this.track = [];
|
|
14
20
|
}
|
|
15
21
|
}
|
|
22
|
+
export class Audio {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.src = '';
|
|
25
|
+
this.title = '';
|
|
26
|
+
this.artist = '';
|
|
27
|
+
this.waveform = false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Legacy aliases
|
|
31
|
+
export { Track as MusicRecording };
|
|
32
|
+
export { Playlist as MusicPlaylist };
|
|
16
33
|
//# sourceMappingURL=audio.js.map
|
package/dist/schema/audio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/schema/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/schema/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,KAAK;IAAlB;QACE,SAAI,GAAW,EAAE,CAAC;QAClB,WAAM,GAAW,EAAE,CAAC;QACpB,aAAQ,GAAW,EAAE,CAAC;QACtB,QAAG,GAAW,EAAE,CAAC;QACjB,QAAG,GAAW,EAAE,CAAC;QACjB,SAAI,GAAW,EAAE,CAAC;QAElB,cAAS,GAAW,MAAM,CAAC;IAC7B,CAAC;CAAA;AAED,MAAM,OAAO,QAAS,SAAQ,WAAW;IAAzC;;QACE,UAAK,GAAuB,SAAS,CAAC;QACtC,WAAM,GAAW,EAAE,CAAC;QACpB,iBAAY,GAAW,OAAO,CAAC;QAC/B,UAAK,GAAY,EAAE,CAAC;IACtB,CAAC;CAAA;AAED,MAAM,OAAO,KAAK;IAAlB;QACE,QAAG,GAAW,EAAE,CAAC;QACjB,UAAK,GAAW,EAAE,CAAC;QACnB,WAAM,GAAW,EAAE,CAAC;QACpB,aAAQ,GAAY,KAAK,CAAC;IAC5B,CAAC;CAAA;AAED,iBAAiB;AACjB,OAAO,EAAE,KAAK,IAAI,cAAc,EAAE,CAAC;AACnC,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/tags/audio.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAOvC,eAAO,MAAM,KAAK,gBA0FhB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
const { Tag } = Markdoc;
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable, asNodes, RenderableNodeCursor } from '@refrakt-md/runes';
|
|
4
|
+
import { schema } from '../types.js';
|
|
5
|
+
import { parseDuration } from '../duration.js';
|
|
6
|
+
export const audio = createContentModelSchema({
|
|
7
|
+
attributes: {
|
|
8
|
+
src: { type: String, required: false },
|
|
9
|
+
playlist: { type: String, required: false },
|
|
10
|
+
title: { type: String, required: false },
|
|
11
|
+
artist: { type: String, required: false },
|
|
12
|
+
waveform: { type: Boolean, required: false },
|
|
13
|
+
chapters: { type: String, required: false },
|
|
14
|
+
},
|
|
15
|
+
contentModel: {
|
|
16
|
+
type: 'sequence',
|
|
17
|
+
fields: [
|
|
18
|
+
{ name: 'description', match: 'paragraph', optional: true, greedy: true },
|
|
19
|
+
{
|
|
20
|
+
name: 'chapterList',
|
|
21
|
+
match: 'list',
|
|
22
|
+
optional: true,
|
|
23
|
+
description: 'Inline chapter markers',
|
|
24
|
+
itemModel: {
|
|
25
|
+
fields: [
|
|
26
|
+
{ name: 'label', match: 'strong', optional: true },
|
|
27
|
+
{ name: 'time', match: 'text', optional: true,
|
|
28
|
+
pattern: /\((\d+:\d+(?::\d+)?)\)/ },
|
|
29
|
+
{ name: 'text', match: 'text', pattern: 'remainder', optional: false },
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
transform(resolved, attrs, config) {
|
|
36
|
+
const src = attrs.src ?? '';
|
|
37
|
+
const playlistId = attrs.playlist ?? '';
|
|
38
|
+
const title = attrs.title ?? '';
|
|
39
|
+
const artist = attrs.artist ?? '';
|
|
40
|
+
const waveform = attrs.waveform ?? false;
|
|
41
|
+
const chaptersUrl = attrs.chapters ?? '';
|
|
42
|
+
// Build player data
|
|
43
|
+
const playerData = {};
|
|
44
|
+
if (src)
|
|
45
|
+
playerData.src = src;
|
|
46
|
+
if (title)
|
|
47
|
+
playerData.name = title;
|
|
48
|
+
if (artist)
|
|
49
|
+
playerData.artist = artist;
|
|
50
|
+
if (playlistId)
|
|
51
|
+
playerData.playlist = playlistId;
|
|
52
|
+
// Process inline chapters
|
|
53
|
+
const chapterData = resolved.chapterListData ?? [];
|
|
54
|
+
if (chapterData.length > 0) {
|
|
55
|
+
playerData.chapters = chapterData.map(ch => ({
|
|
56
|
+
name: ch.label || ch.text || '',
|
|
57
|
+
time: ch.time ? parseDuration(ch.time) : 0,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
// Transform description
|
|
61
|
+
const descNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.description), config));
|
|
62
|
+
// Meta tags for identity transform
|
|
63
|
+
const waveformMeta = waveform ? new Tag('meta', { content: 'true' }) : null;
|
|
64
|
+
const children = [];
|
|
65
|
+
if (waveformMeta)
|
|
66
|
+
children.push(waveformMeta);
|
|
67
|
+
// Player element with JSON data
|
|
68
|
+
const audioEl = new Tag('rf-audio', {
|
|
69
|
+
waveform: String(waveform),
|
|
70
|
+
...(playlistId ? { playlist: playlistId } : {}),
|
|
71
|
+
...(chaptersUrl ? { chapters: chaptersUrl } : {}),
|
|
72
|
+
}, [
|
|
73
|
+
new Tag('script', { type: 'application/json' }, [JSON.stringify(src ? [playerData] : [])]),
|
|
74
|
+
]);
|
|
75
|
+
children.push(audioEl);
|
|
76
|
+
// Add description
|
|
77
|
+
if (descNodes.count() > 0) {
|
|
78
|
+
children.push(descNodes.wrap('div', { 'data-name': 'description' }).next());
|
|
79
|
+
}
|
|
80
|
+
return createComponentRenderable(schema.Audio, {
|
|
81
|
+
tag: 'div',
|
|
82
|
+
properties: {
|
|
83
|
+
...(waveformMeta ? { waveform: waveformMeta } : {}),
|
|
84
|
+
},
|
|
85
|
+
children,
|
|
86
|
+
});
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/tags/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playlist.d.ts","sourceRoot":"","sources":["../../src/tags/playlist.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAUvC,eAAO,MAAM,QAAQ,gBA2NnB,CAAC"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
const { Tag } = Markdoc;
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable, asNodes, pageSectionProperties, RenderableNodeCursor } from '@refrakt-md/runes';
|
|
4
|
+
import { schema } from '../types.js';
|
|
5
|
+
import { parseDuration } from '../duration.js';
|
|
6
|
+
const playlistType = ['album', 'podcast', 'audiobook', 'series', 'mix'];
|
|
7
|
+
const contentType = ['auto', 'lyrics', 'chapters'];
|
|
8
|
+
export const playlist = createContentModelSchema({
|
|
9
|
+
attributes: {
|
|
10
|
+
type: { type: String, required: false, matches: playlistType.slice() },
|
|
11
|
+
artist: { type: String, required: false },
|
|
12
|
+
player: { type: Boolean, required: false },
|
|
13
|
+
content: { type: String, required: false, matches: contentType.slice() },
|
|
14
|
+
id: { type: String, required: false },
|
|
15
|
+
},
|
|
16
|
+
contentModel: {
|
|
17
|
+
type: 'sequence',
|
|
18
|
+
fields: [
|
|
19
|
+
{ name: 'title', match: 'heading', optional: false,
|
|
20
|
+
template: '# Playlist Name', description: 'Playlist title' },
|
|
21
|
+
{ name: 'cover', match: 'image', optional: true,
|
|
22
|
+
template: '', description: 'Cover artwork' },
|
|
23
|
+
{ name: 'description', match: 'paragraph', optional: true,
|
|
24
|
+
template: 'A description of this playlist.', description: 'Playlist description' },
|
|
25
|
+
{
|
|
26
|
+
name: 'tracks',
|
|
27
|
+
match: 'list',
|
|
28
|
+
optional: false,
|
|
29
|
+
description: 'Track listing',
|
|
30
|
+
template: '- **Track Name** (3:45)\n- **Another Track** (4:20)',
|
|
31
|
+
itemModel: {
|
|
32
|
+
fields: [
|
|
33
|
+
{ name: 'name', match: 'strong', optional: false },
|
|
34
|
+
{ name: 'src', match: 'link', optional: true, extract: 'href' },
|
|
35
|
+
{ name: 'artist', match: 'em', optional: true },
|
|
36
|
+
{ name: 'duration', match: 'text', optional: true,
|
|
37
|
+
pattern: /\((\d+:\d+(?::\d+)?)\)/ },
|
|
38
|
+
{ name: 'date', match: 'text', optional: true,
|
|
39
|
+
pattern: /—\s*(.+)$/ },
|
|
40
|
+
{ name: 'description', match: 'paragraph', optional: true, greedy: true },
|
|
41
|
+
{
|
|
42
|
+
name: 'cuePoints',
|
|
43
|
+
match: 'list',
|
|
44
|
+
optional: true,
|
|
45
|
+
itemModel: {
|
|
46
|
+
fields: [
|
|
47
|
+
{ name: 'time', match: 'text', optional: true,
|
|
48
|
+
pattern: /\(?(\d+:\d+(?::\d+)?)\)?/ },
|
|
49
|
+
{ name: 'label', match: 'strong', optional: true },
|
|
50
|
+
{ name: 'text', match: 'text', pattern: 'remainder', optional: false },
|
|
51
|
+
{ name: 'description', match: 'paragraph', optional: true, greedy: true },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{ name: 'body', match: 'any', optional: true, greedy: true },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
transform(resolved, attrs, config) {
|
|
62
|
+
const playlistTypeValue = attrs.type ?? 'album';
|
|
63
|
+
const artistValue = attrs.artist ?? '';
|
|
64
|
+
const hasPlayer = attrs.player ?? false;
|
|
65
|
+
const contentMode = attrs.content ?? 'auto';
|
|
66
|
+
const idValue = attrs.id ?? '';
|
|
67
|
+
// Transform title
|
|
68
|
+
const titleNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.title), config));
|
|
69
|
+
// Transform cover image
|
|
70
|
+
const coverNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.cover), {
|
|
71
|
+
...config,
|
|
72
|
+
nodes: {
|
|
73
|
+
...config.nodes,
|
|
74
|
+
paragraph: {
|
|
75
|
+
render: 'p',
|
|
76
|
+
transform(node, cfg) {
|
|
77
|
+
const img = Array.from(node.walk()).find((n) => n.type === 'image');
|
|
78
|
+
if (img)
|
|
79
|
+
return Markdoc.transform(img, cfg);
|
|
80
|
+
return new Tag('p', {}, node.transformChildren(cfg));
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}));
|
|
85
|
+
// Transform description
|
|
86
|
+
const descNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.description), config));
|
|
87
|
+
// Build track items from itemModel extracted data
|
|
88
|
+
const tracksData = resolved.tracksData ?? [];
|
|
89
|
+
const trackChildren = tracksData.map((track, index) => {
|
|
90
|
+
const name = track.name ?? '';
|
|
91
|
+
const src = track.src ?? '';
|
|
92
|
+
const artist = track.artist ?? artistValue;
|
|
93
|
+
const duration = track.duration ?? '';
|
|
94
|
+
const date = track.date?.trim() ?? '';
|
|
95
|
+
const cuePoints = track.cuePoints ?? [];
|
|
96
|
+
const trackNameTag = new Tag('span', { 'data-name': 'track-name', property: 'name' }, [name]);
|
|
97
|
+
const trackChildren = [trackNameTag];
|
|
98
|
+
if (artist) {
|
|
99
|
+
trackChildren.push(new Tag('span', { 'data-name': 'track-artist', property: 'byArtist' }, [artist]));
|
|
100
|
+
}
|
|
101
|
+
if (duration) {
|
|
102
|
+
trackChildren.push(new Tag('span', { 'data-name': 'track-duration' }, [duration]));
|
|
103
|
+
const durationSeconds = parseDuration(duration);
|
|
104
|
+
trackChildren.push(new Tag('meta', { property: 'duration', content: `PT${durationSeconds}S` }));
|
|
105
|
+
}
|
|
106
|
+
if (date) {
|
|
107
|
+
trackChildren.push(new Tag('span', { 'data-name': 'track-meta', property: 'datePublished' }, [date]));
|
|
108
|
+
}
|
|
109
|
+
// Build cue point elements
|
|
110
|
+
if (cuePoints.length > 0) {
|
|
111
|
+
const cueListTag = buildCuePoints(cuePoints, contentMode);
|
|
112
|
+
if (cueListTag)
|
|
113
|
+
trackChildren.push(cueListTag);
|
|
114
|
+
}
|
|
115
|
+
const trackAttrs = { 'data-rune': 'track', typeof: 'MusicRecording' };
|
|
116
|
+
if (src)
|
|
117
|
+
trackAttrs['data-src'] = src;
|
|
118
|
+
return new Tag('li', trackAttrs, trackChildren);
|
|
119
|
+
});
|
|
120
|
+
const tracksOl = new Tag('ol', { 'data-name': 'tracks' }, trackChildren);
|
|
121
|
+
// Build header
|
|
122
|
+
const headerChildren = [];
|
|
123
|
+
if (titleNodes.count() > 0) {
|
|
124
|
+
const headingCursor = titleNodes.headings().limit(1);
|
|
125
|
+
if (headingCursor.count() > 0) {
|
|
126
|
+
const titleTag = headingCursor.next();
|
|
127
|
+
titleTag.attributes['data-name'] = 'title';
|
|
128
|
+
headerChildren.push(titleTag);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (coverNodes.count() > 0) {
|
|
132
|
+
headerChildren.push(...coverNodes.toArray());
|
|
133
|
+
}
|
|
134
|
+
if (descNodes.count() > 0) {
|
|
135
|
+
headerChildren.push(...descNodes.toArray());
|
|
136
|
+
}
|
|
137
|
+
const header = headerChildren.length > 0
|
|
138
|
+
? new Tag('div', { 'data-name': 'header' }, headerChildren)
|
|
139
|
+
: null;
|
|
140
|
+
// Build player element (when player attribute is set)
|
|
141
|
+
let playerEl = null;
|
|
142
|
+
if (hasPlayer) {
|
|
143
|
+
const playerData = tracksData.map(track => {
|
|
144
|
+
const item = {
|
|
145
|
+
name: track.name ?? '',
|
|
146
|
+
};
|
|
147
|
+
if (track.src)
|
|
148
|
+
item.src = track.src;
|
|
149
|
+
if (track.artist || artistValue)
|
|
150
|
+
item.artist = track.artist ?? artistValue;
|
|
151
|
+
if (track.duration) {
|
|
152
|
+
item.duration = parseDuration(track.duration ?? '');
|
|
153
|
+
}
|
|
154
|
+
return item;
|
|
155
|
+
});
|
|
156
|
+
playerEl = new Tag('div', { 'data-name': 'player' }, [
|
|
157
|
+
new Tag('rf-audio', { waveform: 'false' }, [
|
|
158
|
+
new Tag('script', { type: 'application/json' }, [JSON.stringify(playerData)]),
|
|
159
|
+
]),
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
// Meta tags for identity transform modifiers
|
|
163
|
+
const typeMeta = new Tag('meta', { content: playlistTypeValue });
|
|
164
|
+
const hasPlayerMeta = hasPlayer ? new Tag('meta', { content: 'true' }) : null;
|
|
165
|
+
const artistMeta = artistValue ? new Tag('meta', { content: artistValue }) : null;
|
|
166
|
+
const children = [typeMeta];
|
|
167
|
+
if (hasPlayerMeta)
|
|
168
|
+
children.push(hasPlayerMeta);
|
|
169
|
+
if (artistMeta)
|
|
170
|
+
children.push(artistMeta);
|
|
171
|
+
if (idValue)
|
|
172
|
+
children.push(new Tag('meta', { 'data-field': 'id', content: idValue }));
|
|
173
|
+
if (header)
|
|
174
|
+
children.push(header);
|
|
175
|
+
if (playerEl)
|
|
176
|
+
children.push(playerEl);
|
|
177
|
+
children.push(tracksOl);
|
|
178
|
+
// Transform any remaining body content
|
|
179
|
+
if (resolved.body) {
|
|
180
|
+
const bodyNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.body), config));
|
|
181
|
+
if (bodyNodes.count() > 0) {
|
|
182
|
+
children.push(...bodyNodes.toArray());
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const sectionProps = pageSectionProperties(titleNodes);
|
|
186
|
+
const trackItems = new RenderableNodeCursor(trackChildren);
|
|
187
|
+
// Extract cover image for schema
|
|
188
|
+
const coverImgCursor = coverNodes.count() > 0 ? coverNodes.tag('img').limit(1) : null;
|
|
189
|
+
const coverSchemaTag = coverImgCursor && coverImgCursor.count() > 0 ? coverImgCursor.next() : undefined;
|
|
190
|
+
return createComponentRenderable(schema.Playlist, {
|
|
191
|
+
tag: 'section',
|
|
192
|
+
property: 'contentSection',
|
|
193
|
+
properties: {
|
|
194
|
+
...sectionProps,
|
|
195
|
+
type: typeMeta,
|
|
196
|
+
...(artistMeta ? { artist: artistMeta } : {}),
|
|
197
|
+
track: trackItems,
|
|
198
|
+
},
|
|
199
|
+
schema: {
|
|
200
|
+
name: sectionProps.headline,
|
|
201
|
+
...(coverSchemaTag ? { image: coverSchemaTag } : {}),
|
|
202
|
+
...(artistMeta ? { byArtist: artistMeta } : {}),
|
|
203
|
+
track: trackItems,
|
|
204
|
+
},
|
|
205
|
+
children,
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
/**
|
|
210
|
+
* Build cue point list (chapters or lyrics) from extracted itemModel data.
|
|
211
|
+
*/
|
|
212
|
+
function buildCuePoints(cuePoints, contentMode) {
|
|
213
|
+
if (cuePoints.length === 0)
|
|
214
|
+
return null;
|
|
215
|
+
// Detect content type: lyrics have timestamp at start with short text
|
|
216
|
+
const isLyrics = contentMode === 'lyrics' || (contentMode === 'auto' && cuePoints.every(cp => cp.time && typeof cp.text === 'string' && cp.text.length < 100));
|
|
217
|
+
if (isLyrics) {
|
|
218
|
+
const lyricItems = cuePoints.map(cp => {
|
|
219
|
+
const attrs = {};
|
|
220
|
+
if (cp.time)
|
|
221
|
+
attrs['data-time'] = String(parseDuration(cp.time));
|
|
222
|
+
return new Tag('li', attrs, [
|
|
223
|
+
new Tag('p', { 'data-name': 'lyric' }, [cp.text ?? '']),
|
|
224
|
+
]);
|
|
225
|
+
});
|
|
226
|
+
return new Tag('ol', { 'data-name': 'lyrics' }, lyricItems);
|
|
227
|
+
}
|
|
228
|
+
// Chapters
|
|
229
|
+
const chapterItems = cuePoints.map(cp => {
|
|
230
|
+
const attrs = {};
|
|
231
|
+
if (cp.time)
|
|
232
|
+
attrs['data-time'] = String(parseDuration(cp.time));
|
|
233
|
+
const chapterChildren = [];
|
|
234
|
+
const label = cp.label || cp.text || '';
|
|
235
|
+
if (label) {
|
|
236
|
+
chapterChildren.push(new Tag('span', { 'data-name': 'chapter-name' }, [label]));
|
|
237
|
+
}
|
|
238
|
+
if (cp.time) {
|
|
239
|
+
chapterChildren.push(new Tag('span', { 'data-name': 'chapter-time' }, [cp.time]));
|
|
240
|
+
}
|
|
241
|
+
return new Tag('li', attrs, chapterChildren);
|
|
242
|
+
});
|
|
243
|
+
return new Tag('ol', { 'data-name': 'chapters' }, chapterItems);
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=playlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playlist.js","sourceRoot":"","sources":["../../src/tags/playlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/tags/track.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AASvC,eAAO,MAAM,KAAK,gBA6GhB,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import Markdoc from '@markdoc/markdoc';
|
|
2
|
+
const { Tag } = Markdoc;
|
|
3
|
+
import { createContentModelSchema, createComponentRenderable, asNodes, RenderableNodeCursor } from '@refrakt-md/runes';
|
|
4
|
+
import { schema } from '../types.js';
|
|
5
|
+
import { parseDuration, formatDuration } from '../duration.js';
|
|
6
|
+
const trackType = ['song', 'episode', 'chapter', 'talk', 'video'];
|
|
7
|
+
export const track = createContentModelSchema({
|
|
8
|
+
attributes: {
|
|
9
|
+
src: { type: String, required: false },
|
|
10
|
+
artist: { type: String, required: false },
|
|
11
|
+
duration: { type: String, required: false },
|
|
12
|
+
number: { type: Number, required: false },
|
|
13
|
+
date: { type: String, required: false },
|
|
14
|
+
url: { type: String, required: false },
|
|
15
|
+
type: { type: String, required: false, matches: trackType.slice() },
|
|
16
|
+
},
|
|
17
|
+
contentModel: {
|
|
18
|
+
type: 'sequence',
|
|
19
|
+
fields: [
|
|
20
|
+
{ name: 'title', match: 'heading|paragraph', optional: true },
|
|
21
|
+
{ name: 'body', match: 'any', optional: true, greedy: true },
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
transform(resolved, attrs, config) {
|
|
25
|
+
const src = attrs.src ?? '';
|
|
26
|
+
const artist = attrs.artist ?? '';
|
|
27
|
+
const duration = attrs.duration ?? '';
|
|
28
|
+
const number = attrs.number;
|
|
29
|
+
const date = attrs.date ?? '';
|
|
30
|
+
const url = attrs.url ?? '';
|
|
31
|
+
const typeValue = attrs.type ?? 'song';
|
|
32
|
+
// Transform title
|
|
33
|
+
const titleNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.title), config));
|
|
34
|
+
// Extract track name from title heading or paragraph
|
|
35
|
+
let nameText = '';
|
|
36
|
+
const headingCursor = titleNodes.headings().limit(1);
|
|
37
|
+
if (headingCursor.count() > 0) {
|
|
38
|
+
nameText = extractText(headingCursor.next());
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const pCursor = titleNodes.tag('p').limit(1);
|
|
42
|
+
if (pCursor.count() > 0)
|
|
43
|
+
nameText = extractText(pCursor.next());
|
|
44
|
+
}
|
|
45
|
+
// Transform body content (may contain chapters/lyrics as lists)
|
|
46
|
+
const bodyNodes = new RenderableNodeCursor(Markdoc.transform(asNodes(resolved.body), config));
|
|
47
|
+
// Build track element
|
|
48
|
+
const nameTag = new Tag('span', { 'data-name': 'track-name' }, [nameText]);
|
|
49
|
+
const children = [nameTag];
|
|
50
|
+
// Meta tags for identity transform
|
|
51
|
+
const typeMeta = new Tag('meta', { content: typeValue });
|
|
52
|
+
children.push(typeMeta);
|
|
53
|
+
if (artist) {
|
|
54
|
+
children.push(new Tag('span', { 'data-name': 'track-artist' }, [artist]));
|
|
55
|
+
}
|
|
56
|
+
if (duration) {
|
|
57
|
+
const formatted = duration.startsWith('PT')
|
|
58
|
+
? formatDuration(parseDuration(duration))
|
|
59
|
+
: duration;
|
|
60
|
+
children.push(new Tag('span', { 'data-name': 'track-duration' }, [formatted]));
|
|
61
|
+
}
|
|
62
|
+
if (date) {
|
|
63
|
+
children.push(new Tag('span', { 'data-name': 'track-meta' }, [date]));
|
|
64
|
+
}
|
|
65
|
+
// Add body content
|
|
66
|
+
if (bodyNodes.count() > 0) {
|
|
67
|
+
children.push(bodyNodes.wrap('div', { 'data-name': 'track-description' }).next());
|
|
68
|
+
}
|
|
69
|
+
const rootAttrs = {};
|
|
70
|
+
if (src)
|
|
71
|
+
rootAttrs['data-src'] = src;
|
|
72
|
+
const durationMeta = duration
|
|
73
|
+
? new Tag('meta', { content: duration.startsWith('PT') ? duration : `PT${parseDuration(duration)}S` })
|
|
74
|
+
: undefined;
|
|
75
|
+
const artistMeta = artist ? new Tag('meta', { content: artist }) : undefined;
|
|
76
|
+
const urlMeta = url ? new Tag('meta', { content: url }) : undefined;
|
|
77
|
+
const numberMeta = number !== undefined ? new Tag('meta', { content: String(number) }) : undefined;
|
|
78
|
+
const dateMeta = date ? new Tag('meta', { content: date }) : undefined;
|
|
79
|
+
if (urlMeta)
|
|
80
|
+
children.push(urlMeta);
|
|
81
|
+
if (numberMeta)
|
|
82
|
+
children.push(numberMeta);
|
|
83
|
+
if (dateMeta)
|
|
84
|
+
children.push(dateMeta);
|
|
85
|
+
return createComponentRenderable(schema.Track, {
|
|
86
|
+
tag: 'li',
|
|
87
|
+
properties: {
|
|
88
|
+
name: nameTag,
|
|
89
|
+
...(artistMeta ? { artist: artistMeta } : {}),
|
|
90
|
+
...(durationMeta ? { duration: durationMeta } : {}),
|
|
91
|
+
...(urlMeta ? { url: urlMeta } : {}),
|
|
92
|
+
...(numberMeta ? { position: numberMeta } : {}),
|
|
93
|
+
...(dateMeta ? { datePublished: dateMeta } : {}),
|
|
94
|
+
type: typeMeta,
|
|
95
|
+
},
|
|
96
|
+
schema: {
|
|
97
|
+
name: nameTag,
|
|
98
|
+
...(artistMeta ? { byArtist: artistMeta } : {}),
|
|
99
|
+
...(durationMeta ? { duration: durationMeta } : {}),
|
|
100
|
+
...(urlMeta ? { url: urlMeta } : {}),
|
|
101
|
+
...(numberMeta ? { position: numberMeta } : {}),
|
|
102
|
+
...(dateMeta ? { datePublished: dateMeta } : {}),
|
|
103
|
+
},
|
|
104
|
+
children,
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
function extractText(tag) {
|
|
109
|
+
if (!tag)
|
|
110
|
+
return '';
|
|
111
|
+
if (typeof tag === 'string')
|
|
112
|
+
return tag;
|
|
113
|
+
if (tag.children) {
|
|
114
|
+
return tag.children.map(extractText).join('');
|
|
115
|
+
}
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=track.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.js","sourceRoot":"","sources":["../../src/tags/track.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Playlist, Track, Audio } from './schema/audio.js';
|
|
2
2
|
export declare const schema: {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Playlist: import("@refrakt-md/types").Type<Playlist>;
|
|
4
|
+
Track: import("@refrakt-md/types").Type<Track>;
|
|
5
|
+
Audio: import("@refrakt-md/types").Type<Audio>;
|
|
6
|
+
MusicPlaylist: import("@refrakt-md/types").Type<Playlist>;
|
|
7
|
+
MusicRecording: import("@refrakt-md/types").Type<Track>;
|
|
5
8
|
};
|
|
6
9
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,MAAM;;;;;;CAwClB,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -1,20 +1,43 @@
|
|
|
1
1
|
import { useSchema } from '@refrakt-md/types';
|
|
2
|
-
import {
|
|
2
|
+
import { Playlist, Track, Audio } from './schema/audio.js';
|
|
3
3
|
export const schema = {
|
|
4
|
-
|
|
4
|
+
Playlist: useSchema(Playlist).defineType('Playlist', {
|
|
5
5
|
schema: 'http://schema.org/',
|
|
6
6
|
MusicPlaylist: 'schema:MusicPlaylist',
|
|
7
7
|
headline: 'schema:name schema:headline',
|
|
8
8
|
image: 'schema:image',
|
|
9
|
+
byArtist: 'schema:byArtist',
|
|
10
|
+
track: 'schema:track',
|
|
11
|
+
}, 'MusicPlaylist'),
|
|
12
|
+
Track: useSchema(Track).defineType('Track', {
|
|
13
|
+
schema: 'http://schema.org/',
|
|
14
|
+
MusicRecording: 'schema:MusicRecording',
|
|
15
|
+
name: 'schema:name',
|
|
16
|
+
byArtist: 'schema:byArtist',
|
|
17
|
+
duration: 'schema:duration',
|
|
18
|
+
url: 'schema:url',
|
|
19
|
+
datePublished: 'schema:datePublished',
|
|
20
|
+
position: 'schema:position',
|
|
21
|
+
}, 'MusicRecording'),
|
|
22
|
+
Audio: useSchema(Audio).defineType('Audio'),
|
|
23
|
+
// Legacy aliases
|
|
24
|
+
MusicPlaylist: useSchema(Playlist).defineType('MusicPlaylist', {
|
|
25
|
+
schema: 'http://schema.org/',
|
|
26
|
+
MusicPlaylist: 'schema:MusicPlaylist',
|
|
27
|
+
headline: 'schema:name schema:headline',
|
|
28
|
+
image: 'schema:image',
|
|
29
|
+
byArtist: 'schema:byArtist',
|
|
9
30
|
track: 'schema:track',
|
|
10
|
-
}),
|
|
11
|
-
MusicRecording: useSchema(
|
|
31
|
+
}, 'MusicPlaylist'),
|
|
32
|
+
MusicRecording: useSchema(Track).defineType('MusicRecording', {
|
|
12
33
|
schema: 'http://schema.org/',
|
|
13
34
|
MusicRecording: 'schema:MusicRecording',
|
|
14
35
|
name: 'schema:name',
|
|
15
36
|
byArtist: 'schema:byArtist',
|
|
16
37
|
duration: 'schema:duration',
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
url: 'schema:url',
|
|
39
|
+
datePublished: 'schema:datePublished',
|
|
40
|
+
position: 'schema:position',
|
|
41
|
+
}, 'MusicRecording'),
|
|
19
42
|
};
|
|
20
43
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAEzD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE;QACnD,MAAM,EAAE,oBAAoB;QAC5B,aAAa,EAAE,sBAAsB;QACrC,QAAQ,EAAE,6BAA6B;QACvC,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,EAAE,cAAc;KACtB,EAAE,eAAe,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE;QAC1C,MAAM,EAAE,oBAAoB;QAC5B,cAAc,EAAE,uBAAuB;QACvC,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,EAAE,YAAY;QACjB,aAAa,EAAE,sBAAsB;QACrC,QAAQ,EAAE,iBAAiB;KAC5B,EAAE,gBAAgB,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IAE3C,iBAAiB;IACjB,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,eAAe,EAAE;QAC7D,MAAM,EAAE,oBAAoB;QAC5B,aAAa,EAAE,sBAAsB;QACrC,QAAQ,EAAE,6BAA6B;QACvC,KAAK,EAAE,cAAc;QACrB,QAAQ,EAAE,iBAAiB;QAC3B,KAAK,EAAE,cAAc;KACtB,EAAE,eAAe,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE;QAC5D,MAAM,EAAE,oBAAoB;QAC5B,cAAc,EAAE,uBAAuB;QACvC,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,EAAE,YAAY;QACjB,aAAa,EAAE,sBAAsB;QACrC,QAAQ,EAAE,iBAAiB;KAC5B,EAAE,gBAAgB,CAAC;CACrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refrakt-md/media",
|
|
3
3
|
"description": "Media runes for refrakt.md — music playlists and recordings",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"build": "tsc"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@refrakt-md/types": "0.
|
|
25
|
-
"@refrakt-md/transform": "0.
|
|
26
|
-
"@refrakt-md/runes": "0.
|
|
24
|
+
"@refrakt-md/types": "0.8.0",
|
|
25
|
+
"@refrakt-md/transform": "0.8.0",
|
|
26
|
+
"@refrakt-md/runes": "0.8.0",
|
|
27
27
|
"@markdoc/markdoc": "0.4.0",
|
|
28
28
|
"iso8601-duration": "2.1.2",
|
|
29
29
|
"reflect-metadata": "^0.2.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"music-playlist.d.ts","sourceRoot":"","sources":["../../src/tags/music-playlist.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AA4EvC,eAAO,MAAM,aAAa,gBAAmC,CAAC"}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import Markdoc from '@markdoc/markdoc';
|
|
11
|
-
const { Tag } = Markdoc;
|
|
12
|
-
import { attribute, group, Model, createComponentRenderable, createSchema, pageSectionProperties, NodeStream } from '@refrakt-md/runes';
|
|
13
|
-
import { schema } from '../types.js';
|
|
14
|
-
import { CommaSeparatedList, SpaceSeparatedNumberList } from '../attributes.js';
|
|
15
|
-
import { MusicRecordingNode } from './music-recording.js';
|
|
16
|
-
class MusicPlaylistModel extends Model {
|
|
17
|
-
constructor() {
|
|
18
|
-
super(...arguments);
|
|
19
|
-
this.mirror = false;
|
|
20
|
-
}
|
|
21
|
-
processChildren(nodes) {
|
|
22
|
-
const listIndex = nodes.findIndex(n => n.type === 'list');
|
|
23
|
-
return super.processChildren([
|
|
24
|
-
...nodes.slice(0, listIndex),
|
|
25
|
-
...nodes[listIndex].children.map(item => MusicRecordingNode.fromItem(item, this.trackFields)),
|
|
26
|
-
...nodes.slice(listIndex + 1),
|
|
27
|
-
]);
|
|
28
|
-
}
|
|
29
|
-
transform() {
|
|
30
|
-
const header = this.header
|
|
31
|
-
.useNode('paragraph', node => {
|
|
32
|
-
const img = Array.from(node.walk()).find(n => n.type === 'image');
|
|
33
|
-
return Markdoc.transform(img ? img : node, this.config);
|
|
34
|
-
})
|
|
35
|
-
.transform();
|
|
36
|
-
const tracks = this.tracks.transform();
|
|
37
|
-
const mainContent = header.wrap('div', { 'data-name': 'main' });
|
|
38
|
-
const sideContent = tracks.wrap('ol').wrap('div', { 'data-name': 'showcase' });
|
|
39
|
-
const splitMeta = this.split.length > 0
|
|
40
|
-
? new Tag('meta', { property: 'split', content: this.split.join(' ') })
|
|
41
|
-
: null;
|
|
42
|
-
const mirrorMeta = this.mirror
|
|
43
|
-
? new Tag('meta', { property: 'mirror', content: 'true' })
|
|
44
|
-
: null;
|
|
45
|
-
const children = [
|
|
46
|
-
splitMeta,
|
|
47
|
-
mirrorMeta,
|
|
48
|
-
mainContent.next(),
|
|
49
|
-
sideContent.next(),
|
|
50
|
-
].filter(Boolean);
|
|
51
|
-
return createComponentRenderable(schema.MusicPlaylist, {
|
|
52
|
-
tag: 'section',
|
|
53
|
-
property: 'contentSection',
|
|
54
|
-
properties: {
|
|
55
|
-
...pageSectionProperties(header),
|
|
56
|
-
track: tracks.tag('li').typeof('MusicRecording'),
|
|
57
|
-
},
|
|
58
|
-
children,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
__decorate([
|
|
63
|
-
attribute({ type: CommaSeparatedList, required: false }),
|
|
64
|
-
__metadata("design:type", Array)
|
|
65
|
-
], MusicPlaylistModel.prototype, "trackFields", void 0);
|
|
66
|
-
__decorate([
|
|
67
|
-
attribute({ type: String, required: false }),
|
|
68
|
-
__metadata("design:type", String)
|
|
69
|
-
], MusicPlaylistModel.prototype, "audio", void 0);
|
|
70
|
-
__decorate([
|
|
71
|
-
attribute({ type: SpaceSeparatedNumberList, required: false }),
|
|
72
|
-
__metadata("design:type", Array)
|
|
73
|
-
], MusicPlaylistModel.prototype, "split", void 0);
|
|
74
|
-
__decorate([
|
|
75
|
-
attribute({ type: Boolean, required: false }),
|
|
76
|
-
__metadata("design:type", Boolean)
|
|
77
|
-
], MusicPlaylistModel.prototype, "mirror", void 0);
|
|
78
|
-
__decorate([
|
|
79
|
-
group({ section: 0, include: ['heading', 'paragraph'] }),
|
|
80
|
-
__metadata("design:type", NodeStream)
|
|
81
|
-
], MusicPlaylistModel.prototype, "header", void 0);
|
|
82
|
-
__decorate([
|
|
83
|
-
group({ include: [{ node: 'tag' }] }),
|
|
84
|
-
__metadata("design:type", NodeStream)
|
|
85
|
-
], MusicPlaylistModel.prototype, "tracks", void 0);
|
|
86
|
-
export const musicPlaylist = createSchema(MusicPlaylistModel);
|
|
87
|
-
//# sourceMappingURL=music-playlist.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"music-playlist.js","sourceRoot":"","sources":["../../src/tags/music-playlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import Markdoc from '@markdoc/markdoc';
|
|
2
|
-
import type { Node } from '@markdoc/markdoc';
|
|
3
|
-
import { TypedNode } from '@refrakt-md/runes';
|
|
4
|
-
export declare const musicRecording: Markdoc.Schema;
|
|
5
|
-
export declare class MusicRecordingNode<T extends 'div' | 'li'> extends TypedNode<'tag', T> {
|
|
6
|
-
constructor(attributes?: MusicRecordingAttributes, children?: Node[]);
|
|
7
|
-
static parseProperty(name: string, value: string): string | number;
|
|
8
|
-
static fromItem(item: Node, fieldNames: string[]): MusicRecordingNode<"li">;
|
|
9
|
-
}
|
|
10
|
-
interface MusicRecordingAttributes {
|
|
11
|
-
listItem?: boolean;
|
|
12
|
-
byArtist?: string;
|
|
13
|
-
copyrightYear?: number;
|
|
14
|
-
duration?: string;
|
|
15
|
-
}
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=music-recording.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"music-recording.d.ts","sourceRoot":"","sources":["../../src/tags/music-recording.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,EAAO,IAAI,EAAuB,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAsG,MAAM,mBAAmB,CAAC;AAyDlJ,eAAO,MAAM,cAAc,gBAAoC,CAAC;AAEhE,qBAAa,kBAAkB,CAAC,CAAC,SAAS,KAAK,GAAG,IAAI,CAAE,SAAQ,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrE,UAAU,GAAE,wBAA6B,EAAE,QAAQ,GAAE,IAAI,EAAO;IAI5E,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAOhD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;CAejD;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import Markdoc from '@markdoc/markdoc';
|
|
11
|
-
import { TypedNode, attribute, group, Model, createComponentRenderable, createSchema, RenderableNodeCursor, NodeStream } from '@refrakt-md/runes';
|
|
12
|
-
import { schema } from '../types.js';
|
|
13
|
-
import * as Duration from 'iso8601-duration';
|
|
14
|
-
class MusicRecordingModel extends Model {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(...arguments);
|
|
17
|
-
this.listItem = false;
|
|
18
|
-
}
|
|
19
|
-
formatDuration(d) {
|
|
20
|
-
const s = d.seconds?.toString().padStart(2, '0');
|
|
21
|
-
return `${d.minutes}:${s}`;
|
|
22
|
-
}
|
|
23
|
-
transformDuration() {
|
|
24
|
-
if (this.duration) {
|
|
25
|
-
return new RenderableNodeCursor([
|
|
26
|
-
new Markdoc.Tag('span', { content: this.duration }, [this.formatDuration(Duration.parse(this.duration))])
|
|
27
|
-
]);
|
|
28
|
-
}
|
|
29
|
-
return new RenderableNodeCursor([]);
|
|
30
|
-
}
|
|
31
|
-
transform() {
|
|
32
|
-
const tagName = this.listItem ? 'li' : 'div';
|
|
33
|
-
const children = this.title.transform();
|
|
34
|
-
const name = children.tag('h1');
|
|
35
|
-
const byArtist = RenderableNodeCursor.fromData(this.byArtist, 'span');
|
|
36
|
-
const copyrightYear = RenderableNodeCursor.fromData(this.copyrightYear, 'span');
|
|
37
|
-
const duration = this.transformDuration();
|
|
38
|
-
return createComponentRenderable(schema.MusicRecording, {
|
|
39
|
-
tag: tagName,
|
|
40
|
-
properties: {
|
|
41
|
-
name,
|
|
42
|
-
byArtist,
|
|
43
|
-
copyrightYear,
|
|
44
|
-
duration,
|
|
45
|
-
},
|
|
46
|
-
children: children.concat(byArtist, copyrightYear, duration).toArray(),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
__decorate([
|
|
51
|
-
attribute({ type: Boolean, required: false }),
|
|
52
|
-
__metadata("design:type", Boolean)
|
|
53
|
-
], MusicRecordingModel.prototype, "listItem", void 0);
|
|
54
|
-
__decorate([
|
|
55
|
-
attribute({ type: String, required: false }),
|
|
56
|
-
__metadata("design:type", Object)
|
|
57
|
-
], MusicRecordingModel.prototype, "byArtist", void 0);
|
|
58
|
-
__decorate([
|
|
59
|
-
attribute({ type: Number, required: false }),
|
|
60
|
-
__metadata("design:type", Object)
|
|
61
|
-
], MusicRecordingModel.prototype, "copyrightYear", void 0);
|
|
62
|
-
__decorate([
|
|
63
|
-
attribute({ type: String, required: false }),
|
|
64
|
-
__metadata("design:type", Object)
|
|
65
|
-
], MusicRecordingModel.prototype, "duration", void 0);
|
|
66
|
-
__decorate([
|
|
67
|
-
group({ include: ['heading'] }),
|
|
68
|
-
__metadata("design:type", NodeStream)
|
|
69
|
-
], MusicRecordingModel.prototype, "title", void 0);
|
|
70
|
-
export const musicRecording = createSchema(MusicRecordingModel);
|
|
71
|
-
export class MusicRecordingNode extends TypedNode {
|
|
72
|
-
constructor(attributes = {}, children = []) {
|
|
73
|
-
super('tag', attributes, children, 'music-recording');
|
|
74
|
-
}
|
|
75
|
-
static parseProperty(name, value) {
|
|
76
|
-
switch (name) {
|
|
77
|
-
case 'copyrightYear': return parseInt(value);
|
|
78
|
-
default: return value;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
static fromItem(item, fieldNames) {
|
|
82
|
-
const inline = item.children.find(n => n.type === 'inline');
|
|
83
|
-
const text = inline ? inline.children[0] : undefined;
|
|
84
|
-
const attr = {
|
|
85
|
-
listItem: true,
|
|
86
|
-
};
|
|
87
|
-
if (text) {
|
|
88
|
-
const fields = text.attributes.content.split('|').map(f => f.trim());
|
|
89
|
-
fieldNames.forEach((key, index) => {
|
|
90
|
-
attr[key] = MusicRecordingNode.parseProperty(key, fields[index]);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
return new MusicRecordingNode(attr, item.children.filter(c => c.type === 'heading'));
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=music-recording.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"music-recording.js","sourceRoot":"","sources":["../../src/tags/music-recording.ts"],"names":[],"mappings":"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"}
|