@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.
@@ -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,CAG7C,CAAC"}
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
- MusicPlaylist: { block: 'music-playlist' },
3
- MusicRecording: { block: 'music-recording', parent: 'MusicPlaylist' },
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
@@ -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,gBAAgB,EAAE;IAC1C,cAAc,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE;CACrE,CAAC"}
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"}
@@ -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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"}
@@ -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;AAKrD,eAAO,MAAM,KAAK,EAAE,WA6BnB,CAAC;AAEF,eAAe,KAAK,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 { musicPlaylist } from './tags/music-playlist.js';
2
- import { musicRecording } from './tags/music-recording.js';
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.6.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
+ ![Cover](/images/dsotm.jpg)
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: musicPlaylist,
11
- description: 'Music playlist with track listing',
12
- reinterprets: { heading: 'playlist name', list: 'track listing' },
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 audio="/audio/album.mp3" %}
50
+ fixture: `{% music-playlist %}
15
51
  # Album Title
16
52
 
17
- ![Album Cover](/images/cover.jpg)
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: musicRecording,
25
- description: 'Individual music track metadata',
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 title="Moonlight Sonata" artist="Beethoven" duration="PT15M" genre="Classical" /%}`,
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,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,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,gBAAgB,EAAE;YAChB,SAAS,EAAE,aAAa;YACxB,WAAW,EAAE,mCAAmC;YAChD,YAAY,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE;YACjE,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE;;;;;;;sBAOO;SACjB;QACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,cAAc;YACzB,WAAW,EAAE,iCAAiC;YAC9C,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,uGAAuG;SACjH;KACF;IACD,KAAK,EAAE;QACL,KAAK,EAAE,MAA4D;KACpE;CACF,CAAC;AAEF,eAAe,KAAK,CAAC"}
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"}
@@ -1,12 +1,26 @@
1
1
  import { PageSection } from "@refrakt-md/types";
2
- export declare class MusicRecording {
2
+ export declare class Track {
3
3
  name: string;
4
- byArtist: string;
4
+ artist: string;
5
5
  duration: string;
6
- copyrightYear: number | undefined;
6
+ src: string;
7
+ url: string;
8
+ date: string;
9
+ number: number | undefined;
10
+ trackType: string;
7
11
  }
8
- export declare class MusicPlaylist extends PageSection {
12
+ export declare class Playlist extends PageSection {
9
13
  image: string | undefined;
10
- track: MusicRecording[];
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,cAAc;IACzB,IAAI,EAAE,MAAM,CAAM;IAClB,QAAQ,EAAE,MAAM,CAAM;IACtB,QAAQ,EAAE,MAAM,CAAM;IACtB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,qBAAa,aAAc,SAAQ,WAAW;IAC5C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IACtC,KAAK,EAAE,cAAc,EAAE,CAAM;CAC9B"}
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"}
@@ -1,16 +1,33 @@
1
1
  import { PageSection } from "@refrakt-md/types";
2
- export class MusicRecording {
2
+ export class Track {
3
3
  constructor() {
4
4
  this.name = '';
5
- this.byArtist = '';
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 MusicPlaylist extends PageSection {
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
@@ -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,cAAc;IAA3B;QACE,SAAI,GAAW,EAAE,CAAC;QAClB,aAAQ,GAAW,EAAE,CAAC;QACtB,aAAQ,GAAW,EAAE,CAAC;IAExB,CAAC;CAAA;AAED,MAAM,OAAO,aAAc,SAAQ,WAAW;IAA9C;;QACE,UAAK,GAAuB,SAAS,CAAC;QACtC,UAAK,GAAqB,EAAE,CAAC;IAC/B,CAAC;CAAA"}
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,3 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ export declare const audio: Markdoc.Schema;
3
+ //# sourceMappingURL=audio.d.ts.map
@@ -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,3 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ export declare const playlist: Markdoc.Schema;
3
+ //# sourceMappingURL=playlist.d.ts.map
@@ -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: '![Cover art](/images/cover.jpg)', 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,3 @@
1
+ import Markdoc from '@markdoc/markdoc';
2
+ export declare const track: Markdoc.Schema;
3
+ //# sourceMappingURL=track.d.ts.map
@@ -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":"AAAA,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAE3E,MAAM,CAAC,MAAM,KAAK,GAAG,wBAAwB,CAAC;IAC7C,UAAU,EAAE;QACX,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACvC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,EAAE;KACnE;IACD,YAAY,EAAE;QACb,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC7D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;SAC5D;KACD;IACD,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;QAChC,MAAM,GAAG,GAAI,KAAK,CAAC,GAAc,IAAI,EAAE,CAAC;QACxC,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAI,KAAK,CAAC,QAAmB,IAAI,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B,CAAC;QAClD,MAAM,IAAI,GAAI,KAAK,CAAC,IAAe,IAAI,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAI,KAAK,CAAC,GAAc,IAAI,EAAE,CAAC;QACxC,MAAM,SAAS,GAAI,KAAK,CAAC,IAAe,IAAI,MAAM,CAAC;QAEnD,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAC1C,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAyB,CAC1E,CAAC;QAEF,qDAAqD;QACrD,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACP,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;gBAAE,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,oBAAoB,CACzC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAyB,CACzE,CAAC;QAEF,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAU,CAAC,OAAO,CAAC,CAAC;QAElC,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExB,IAAI,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC1C,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC,CAAC,QAAQ,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,mBAAmB;QACnB,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,SAAS,GAAwB,EAAE,CAAC;QAC1C,IAAI,GAAG;YAAE,SAAS,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;QAErC,MAAM,YAAY,GAAG,QAAQ;YAC5B,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YACtG,CAAC,CAAC,SAAS,CAAC;QACb,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,MAAM,UAAU,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnG,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvE,IAAI,OAAO;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,UAAU;YAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtC,OAAO,yBAAyB,CAAC,MAAM,CAAC,KAAK,EAAE;YAC9C,GAAG,EAAE,IAAI;YACT,UAAU,EAAE;gBACX,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,EAAE,QAAQ;aACd;YACD,MAAM,EAAE;gBACP,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD;YACD,QAAQ;SACR,CAAC,CAAC;IACJ,CAAC;CACD,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,GAAQ;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC"}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,9 @@
1
- import { MusicPlaylist, MusicRecording } from './schema/audio.js';
1
+ import { Playlist, Track, Audio } from './schema/audio.js';
2
2
  export declare const schema: {
3
- MusicPlaylist: import("@refrakt-md/types").Type<MusicPlaylist>;
4
- MusicRecording: import("@refrakt-md/types").Type<MusicRecording>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEhE,eAAO,MAAM,MAAM;;;CAgBlB,CAAC"}
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 { MusicPlaylist, MusicRecording } from './schema/audio.js';
2
+ import { Playlist, Track, Audio } from './schema/audio.js';
3
3
  export const schema = {
4
- MusicPlaylist: useSchema(MusicPlaylist).defineType('MusicPlaylist', {
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(MusicRecording).defineType('MusicRecording', {
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
- copyrightYear: 'schema:copyrightYear',
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,aAAa,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEhE,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC,eAAe,EAAE;QAClE,MAAM,EAAE,oBAAoB;QAC5B,aAAa,EAAE,sBAAsB;QACrC,QAAQ,EAAE,6BAA6B;QACvC,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,cAAc;KACtB,CAAC;IACF,cAAc,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,gBAAgB,EAAE;QACrE,MAAM,EAAE,oBAAoB;QAC5B,cAAc,EAAE,uBAAuB;QACvC,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,iBAAiB;QAC3B,QAAQ,EAAE,iBAAiB;QAC3B,aAAa,EAAE,sBAAsB;KACtC,CAAC;CACH,CAAC"}
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.7.2",
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.7.2",
25
- "@refrakt-md/transform": "0.7.2",
26
- "@refrakt-md/runes": "0.7.2",
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,3 +0,0 @@
1
- import Markdoc from '@markdoc/markdoc';
2
- export declare const musicPlaylist: Markdoc.Schema;
3
- //# sourceMappingURL=music-playlist.d.ts.map
@@ -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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"}