@contentgrowth/content-widget 1.1.1 → 1.1.3
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/README.md +1 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +0 -7
- package/dist/widget/widget.dev.js +3 -55
- package/dist/widget/widget.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,YAAY;IAmBhC;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwChF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmB3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBjE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAelD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAetC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,KAAK;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAA+B;gBAEhC,MAAM,EAAE,YAAY;IAmBhC;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwChF;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmB3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBjE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAelD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IAetC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;YACW,KAAK;IA2CnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ"}
|
package/dist/core/client.js
CHANGED
|
@@ -144,8 +144,6 @@ export class ContentGrowthClient {
|
|
|
144
144
|
* Internal fetch wrapper with error handling
|
|
145
145
|
*/
|
|
146
146
|
async fetch(url) {
|
|
147
|
-
console.log('[ContentGrowthClient] Fetching:', url);
|
|
148
|
-
console.log('[ContentGrowthClient] API Key:', this.config.apiKey);
|
|
149
147
|
try {
|
|
150
148
|
const response = await fetch(url, {
|
|
151
149
|
headers: {
|
|
@@ -153,10 +151,8 @@ export class ContentGrowthClient {
|
|
|
153
151
|
'Content-Type': 'application/json'
|
|
154
152
|
}
|
|
155
153
|
});
|
|
156
|
-
console.log('[ContentGrowthClient] Response status:', response.status, response.statusText);
|
|
157
154
|
if (!response.ok) {
|
|
158
155
|
const errorText = await response.text();
|
|
159
|
-
console.error('[ContentGrowthClient] Error response:', errorText);
|
|
160
156
|
let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
|
|
161
157
|
try {
|
|
162
158
|
const errorJson = JSON.parse(errorText);
|
|
@@ -168,16 +164,13 @@ export class ContentGrowthClient {
|
|
|
168
164
|
throw new ContentGrowthError(errorMessage, response.status, errorText);
|
|
169
165
|
}
|
|
170
166
|
const data = await response.json();
|
|
171
|
-
console.log('[ContentGrowthClient] Response data:', data);
|
|
172
167
|
return data;
|
|
173
168
|
}
|
|
174
169
|
catch (error) {
|
|
175
170
|
if (error instanceof ContentGrowthError) {
|
|
176
|
-
console.error('[ContentGrowthClient] ContentGrowthError:', error);
|
|
177
171
|
throw error;
|
|
178
172
|
}
|
|
179
173
|
// Network or parsing error
|
|
180
|
-
console.error('[ContentGrowthClient] Network/Parse error:', error);
|
|
181
174
|
throw new ContentGrowthError(`Failed to fetch from Content Growth API: ${error.message}`, undefined, error);
|
|
182
175
|
}
|
|
183
176
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Content Growth Widget - Standalone Bundle
|
|
3
|
-
* Version: 1.1.
|
|
3
|
+
* Version: 1.1.3
|
|
4
4
|
* https://www.content-growth.com
|
|
5
5
|
*/
|
|
6
6
|
(function(window) {
|
|
@@ -2559,12 +2559,10 @@ function debounce(func, wait) {
|
|
|
2559
2559
|
*/
|
|
2560
2560
|
class ContentGrowthAPI {
|
|
2561
2561
|
constructor(config) {
|
|
2562
|
-
console.log('[ContentGrowthAPI] Constructor called with config:', config);
|
|
2563
2562
|
this.apiKey = config.apiKey;
|
|
2564
2563
|
this.baseUrl = config.baseUrl || 'https://api.content-growth.com';
|
|
2565
2564
|
this.cache = new Map();
|
|
2566
2565
|
this.cacheTTL = 5 * 60 * 1000; // 5 minutes
|
|
2567
|
-
console.log('[ContentGrowthAPI] Initialized with baseUrl:', this.baseUrl, 'apiKey:', this.apiKey);
|
|
2568
2566
|
}
|
|
2569
2567
|
|
|
2570
2568
|
/**
|
|
@@ -2572,7 +2570,6 @@ class ContentGrowthAPI {
|
|
|
2572
2570
|
*/
|
|
2573
2571
|
async fetchArticles(options = {}) {
|
|
2574
2572
|
const { page = 1, limit = 12, tags = [], category } = options;
|
|
2575
|
-
console.log('[ContentGrowthAPI] fetchArticles called with options:', options);
|
|
2576
2573
|
|
|
2577
2574
|
const params = new URLSearchParams({
|
|
2578
2575
|
page: page.toString(),
|
|
@@ -2589,19 +2586,14 @@ class ContentGrowthAPI {
|
|
|
2589
2586
|
|
|
2590
2587
|
const url = `${this.baseUrl}/widget/articles?${params}`;
|
|
2591
2588
|
const cacheKey = url;
|
|
2592
|
-
console.log('[ContentGrowthAPI] Request URL:', url);
|
|
2593
2589
|
|
|
2594
2590
|
// Check cache
|
|
2595
2591
|
const cached = this.getFromCache(cacheKey);
|
|
2596
2592
|
if (cached) {
|
|
2597
|
-
console.log('[ContentGrowthAPI] Returning cached data');
|
|
2598
2593
|
return cached;
|
|
2599
2594
|
}
|
|
2600
2595
|
|
|
2601
2596
|
try {
|
|
2602
|
-
console.log('[ContentGrowthAPI] Making fetch request with headers:', {
|
|
2603
|
-
'X-API-Key': this.apiKey
|
|
2604
|
-
});
|
|
2605
2597
|
|
|
2606
2598
|
const response = await fetch(url, {
|
|
2607
2599
|
headers: {
|
|
@@ -2609,7 +2601,6 @@ class ContentGrowthAPI {
|
|
|
2609
2601
|
}
|
|
2610
2602
|
});
|
|
2611
2603
|
|
|
2612
|
-
console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
|
|
2613
2604
|
|
|
2614
2605
|
if (!response.ok) {
|
|
2615
2606
|
const errorText = await response.text();
|
|
@@ -2618,7 +2609,6 @@ class ContentGrowthAPI {
|
|
|
2618
2609
|
}
|
|
2619
2610
|
|
|
2620
2611
|
const data = await response.json();
|
|
2621
|
-
console.log('[ContentGrowthAPI] Response data:', data);
|
|
2622
2612
|
|
|
2623
2613
|
// Cache the result
|
|
2624
2614
|
this.setCache(cacheKey, data);
|
|
@@ -2636,20 +2626,14 @@ class ContentGrowthAPI {
|
|
|
2636
2626
|
async fetchArticle(uuid) {
|
|
2637
2627
|
const url = `${this.baseUrl}/widget/articles/${uuid}`;
|
|
2638
2628
|
const cacheKey = url;
|
|
2639
|
-
console.log('[ContentGrowthAPI] fetchArticle called for uuid:', uuid);
|
|
2640
|
-
console.log('[ContentGrowthAPI] Request URL:', url);
|
|
2641
2629
|
|
|
2642
2630
|
// Check cache
|
|
2643
2631
|
const cached = this.getFromCache(cacheKey);
|
|
2644
2632
|
if (cached) {
|
|
2645
|
-
console.log('[ContentGrowthAPI] Returning cached article');
|
|
2646
2633
|
return cached;
|
|
2647
2634
|
}
|
|
2648
2635
|
|
|
2649
2636
|
try {
|
|
2650
|
-
console.log('[ContentGrowthAPI] Making fetch request with headers:', {
|
|
2651
|
-
'X-API-Key': this.apiKey
|
|
2652
|
-
});
|
|
2653
2637
|
|
|
2654
2638
|
const response = await fetch(url, {
|
|
2655
2639
|
headers: {
|
|
@@ -2657,7 +2641,6 @@ class ContentGrowthAPI {
|
|
|
2657
2641
|
}
|
|
2658
2642
|
});
|
|
2659
2643
|
|
|
2660
|
-
console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
|
|
2661
2644
|
|
|
2662
2645
|
if (!response.ok) {
|
|
2663
2646
|
const errorText = await response.text();
|
|
@@ -2666,7 +2649,6 @@ class ContentGrowthAPI {
|
|
|
2666
2649
|
}
|
|
2667
2650
|
|
|
2668
2651
|
const data = await response.json();
|
|
2669
|
-
console.log('[ContentGrowthAPI] Response data:', data);
|
|
2670
2652
|
|
|
2671
2653
|
// Cache the result
|
|
2672
2654
|
this.setCache(cacheKey, data);
|
|
@@ -2684,20 +2666,14 @@ class ContentGrowthAPI {
|
|
|
2684
2666
|
async fetchArticleBySlug(slug) {
|
|
2685
2667
|
const url = `${this.baseUrl}/widget/articles/slug/${slug}`;
|
|
2686
2668
|
const cacheKey = url;
|
|
2687
|
-
console.log('[ContentGrowthAPI] fetchArticleBySlug called for slug:', slug);
|
|
2688
|
-
console.log('[ContentGrowthAPI] Request URL:', url);
|
|
2689
2669
|
|
|
2690
2670
|
// Check cache
|
|
2691
2671
|
const cached = this.getFromCache(cacheKey);
|
|
2692
2672
|
if (cached) {
|
|
2693
|
-
console.log('[ContentGrowthAPI] Returning cached article');
|
|
2694
2673
|
return cached;
|
|
2695
2674
|
}
|
|
2696
2675
|
|
|
2697
2676
|
try {
|
|
2698
|
-
console.log('[ContentGrowthAPI] Making fetch request with headers:', {
|
|
2699
|
-
'X-API-Key': this.apiKey
|
|
2700
|
-
});
|
|
2701
2677
|
|
|
2702
2678
|
const response = await fetch(url, {
|
|
2703
2679
|
headers: {
|
|
@@ -2705,7 +2681,6 @@ class ContentGrowthAPI {
|
|
|
2705
2681
|
}
|
|
2706
2682
|
});
|
|
2707
2683
|
|
|
2708
|
-
console.log('[ContentGrowthAPI] Response status:', response.status, response.statusText);
|
|
2709
2684
|
|
|
2710
2685
|
if (!response.ok) {
|
|
2711
2686
|
const errorText = await response.text();
|
|
@@ -2714,7 +2689,6 @@ class ContentGrowthAPI {
|
|
|
2714
2689
|
}
|
|
2715
2690
|
|
|
2716
2691
|
const data = await response.json();
|
|
2717
|
-
console.log('[ContentGrowthAPI] Response data:', data);
|
|
2718
2692
|
|
|
2719
2693
|
// Cache the result
|
|
2720
2694
|
this.setCache(cacheKey, data);
|
|
@@ -3514,10 +3488,9 @@ class ContentViewer {
|
|
|
3514
3488
|
|
|
3515
3489
|
class ContentGrowthWidget {
|
|
3516
3490
|
// Version will be injected during build from package.json
|
|
3517
|
-
static version = '1.1.
|
|
3491
|
+
static version = '1.1.3';
|
|
3518
3492
|
|
|
3519
3493
|
constructor(container, config) {
|
|
3520
|
-
console.log('[ContentGrowthWidget] Constructor called with config:', config);
|
|
3521
3494
|
|
|
3522
3495
|
this.container = typeof container === 'string'
|
|
3523
3496
|
? document.querySelector(container)
|
|
@@ -3545,13 +3518,10 @@ class ContentGrowthWidget {
|
|
|
3545
3518
|
slug: config.slug // Article slug for article-only mode (alternative to articleId)
|
|
3546
3519
|
};
|
|
3547
3520
|
|
|
3548
|
-
console.log('[ContentGrowthWidget] Final config:', this.config);
|
|
3549
|
-
|
|
3550
3521
|
if (!this.config.apiKey) {
|
|
3551
3522
|
throw new Error('API key is required');
|
|
3552
3523
|
}
|
|
3553
3524
|
|
|
3554
|
-
console.log('[ContentGrowthWidget] Creating API client with baseUrl:', this.config.baseUrl);
|
|
3555
3525
|
this.api = new ContentGrowthAPI({
|
|
3556
3526
|
apiKey: this.config.apiKey,
|
|
3557
3527
|
baseUrl: this.config.baseUrl
|
|
@@ -3568,7 +3538,6 @@ class ContentGrowthWidget {
|
|
|
3568
3538
|
* Initialize the widget
|
|
3569
3539
|
*/
|
|
3570
3540
|
init() {
|
|
3571
|
-
console.log('[ContentGrowthWidget] Initializing widget...');
|
|
3572
3541
|
// Apply theme
|
|
3573
3542
|
this.container.classList.add('cg-widget');
|
|
3574
3543
|
this.container.setAttribute('data-theme', this.config.theme);
|
|
@@ -3576,24 +3545,20 @@ class ContentGrowthWidget {
|
|
|
3576
3545
|
// Check if article-only mode
|
|
3577
3546
|
if (this.config.mode === 'article-only') {
|
|
3578
3547
|
if (this.config.slug) {
|
|
3579
|
-
console.log('[ContentGrowthWidget] Article-only mode, loading article by slug:', this.config.slug);
|
|
3580
3548
|
this.showPostInlineBySlug(this.config.slug);
|
|
3581
3549
|
} else if (this.config.articleId) {
|
|
3582
|
-
console.log('[ContentGrowthWidget] Article-only mode, loading article by ID:', this.config.articleId);
|
|
3583
3550
|
this.showPostInline(this.config.articleId);
|
|
3584
3551
|
}
|
|
3585
3552
|
} else {
|
|
3586
3553
|
// Create views
|
|
3587
3554
|
this.showList();
|
|
3588
3555
|
}
|
|
3589
|
-
console.log('[ContentGrowthWidget] Widget initialized');
|
|
3590
3556
|
}
|
|
3591
3557
|
|
|
3592
3558
|
/**
|
|
3593
3559
|
* Show the list view
|
|
3594
3560
|
*/
|
|
3595
3561
|
showList() {
|
|
3596
|
-
console.log('[ContentGrowthWidget] Showing list view...');
|
|
3597
3562
|
this.currentView = 'list';
|
|
3598
3563
|
this.container.innerHTML = '';
|
|
3599
3564
|
|
|
@@ -3601,15 +3566,6 @@ class ContentGrowthWidget {
|
|
|
3601
3566
|
listContainer.className = 'cg-list-view';
|
|
3602
3567
|
this.container.appendChild(listContainer);
|
|
3603
3568
|
|
|
3604
|
-
console.log('[ContentGrowthWidget] Creating ContentList with options:', {
|
|
3605
|
-
layoutMode: this.config.layoutMode,
|
|
3606
|
-
displayMode: this.config.displayMode,
|
|
3607
|
-
pageSize: this.config.pageSize,
|
|
3608
|
-
tags: this.config.tags,
|
|
3609
|
-
category: this.config.category,
|
|
3610
|
-
aiSummaryMaxBytes: this.config.aiSummaryMaxBytes
|
|
3611
|
-
});
|
|
3612
|
-
|
|
3613
3569
|
this.contentList = new ContentList(listContainer, this.api, {
|
|
3614
3570
|
layoutMode: this.config.layoutMode,
|
|
3615
3571
|
displayMode: this.config.displayMode,
|
|
@@ -3796,12 +3752,9 @@ class ContentGrowthWidget {
|
|
|
3796
3752
|
|
|
3797
3753
|
// Auto-initialize widgets
|
|
3798
3754
|
function initWidgets() {
|
|
3799
|
-
console.log('[Widget] Initializing widgets...');
|
|
3800
3755
|
const containers = document.querySelectorAll('[data-cg-content]');
|
|
3801
|
-
console.log(`[Widget] Found ${containers.length} widget container(s)`);
|
|
3802
3756
|
|
|
3803
3757
|
containers.forEach((container, index) => {
|
|
3804
|
-
console.log(`[Widget ${index}] Processing container:`, container);
|
|
3805
3758
|
|
|
3806
3759
|
const config = {
|
|
3807
3760
|
apiKey: container.dataset.apiKey || container.dataset.cgApiKey,
|
|
@@ -3818,13 +3771,8 @@ function initWidgets() {
|
|
|
3818
3771
|
articleId: container.dataset.articleId || container.dataset.cgArticleId
|
|
3819
3772
|
};
|
|
3820
3773
|
|
|
3821
|
-
console.log(`[Widget ${index}] Configuration:`, config);
|
|
3822
|
-
console.log(`[Widget ${index}] window.WIDGET_BASE_URL:`, window.WIDGET_BASE_URL);
|
|
3823
|
-
|
|
3824
3774
|
try {
|
|
3825
|
-
console.log(`[Widget ${index}] Creating ContentGrowthWidget instance...`);
|
|
3826
3775
|
new ContentGrowthWidget(container, config);
|
|
3827
|
-
console.log(`[Widget ${index}] Widget initialized successfully`);
|
|
3828
3776
|
} catch (error) {
|
|
3829
3777
|
console.error(`[Widget ${index}] Failed to initialize:`, error);
|
|
3830
3778
|
container.innerHTML = `
|
|
@@ -3852,6 +3800,6 @@ window.ContentGrowthWidget = ContentGrowthWidget;
|
|
|
3852
3800
|
// ===== Expose to window =====
|
|
3853
3801
|
window.ContentGrowthWidget = ContentGrowthWidget;
|
|
3854
3802
|
|
|
3855
|
-
console.log('[ContentGrowthWidget] Loaded successfully v1.1.
|
|
3803
|
+
console.log('[ContentGrowthWidget] Loaded successfully v1.1.3');
|
|
3856
3804
|
|
|
3857
3805
|
})(window);
|
package/dist/widget/widget.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/***Content Growth Widget-Standalone Bundle*Version:1.1.1*https:*/(function(window){'use strict';(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?factory(exports):typeof define==='function'&&define.amd?define(['exports'],factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,factory(global.marked={}));})(this,(function(exports){'use strict';function _getDefaults(){return{async:false,breaks:false,extensions:null,gfm:true,hooks:null,pedantic:false,renderer:null,silent:false,tokenizer:null,walkTokens:null};}exports.defaults=_getDefaults();function changeDefaults(newDefaults){exports.defaults=newDefaults;}const escapeTest=/[&<>"']/;const escapeReplace=new RegExp(escapeTest.source,'g');const escapeTestNoEncode=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;const escapeReplaceNoEncode=new RegExp(escapeTestNoEncode.source,'g');const escapeReplacements={'&':'&','<':'<','>':'>','"':'"',"'":'''};const getEscapeReplacement=(ch)=>escapeReplacements[ch];function escape$1(html,encode){if (encode){if (escapeTest.test(html)){return html.replace(escapeReplace,getEscapeReplacement);}} else{if (escapeTestNoEncode.test(html)){return html.replace(escapeReplaceNoEncode,getEscapeReplacement);}}return html;}const unescapeTest=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function unescape(html){return html.replace(unescapeTest,(_,n)=>{n=n.toLowerCase();if (n==='colon')return ':';if (n.charAt(0)==='#'){return n.charAt(1)==='x'?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1));}return '';});}const caret=/(^|[^\[])\^/g;function edit(regex,opt){let source=typeof regex==='string'?regex:regex.source;opt=opt||'';const obj={replace:(name,val)=>{let valSource=typeof val==='string'?val:val.source;valSource=valSource.replace(caret,'$1');source=source.replace(name,valSource);return obj;},getRegex:()=>{return new RegExp(source,opt);}};return obj;}function cleanUrl(href){try{href=encodeURI(href).replace(/%25/g,'%');} catch (e){return null;}return href;}const noopTest={exec:()=>null};function splitCells(tableRow,count){const row=tableRow.replace(/\|/g,(match,offset,str)=>{let escaped=false;let curr=offset;while (--curr>=0&&str[curr]==='\\')escaped=!escaped;if (escaped){return '|';} else{return '|';}}),cells=row.split(/\|/);let i=0;if (!cells[0].trim()){cells.shift();}if (cells.length>0&&!cells[cells.length-1].trim()){cells.pop();}if (count){if (cells.length>count){cells.splice(count);} else{while (cells.length<count)cells.push('');}}for (;i<cells.length;i++){cells[i]=cells[i].trim().replace(/\\\|/g,'|');}return cells;}function rtrim(str,c,invert){const l=str.length;if (l===0){return '';}let suffLen=0;while (suffLen<l){const currChar=str.charAt(l-suffLen-1);if (currChar===c&&!invert){suffLen++;} else if (currChar!==c&&invert){suffLen++;} else{break;}}return str.slice(0,l-suffLen);}function findClosingBracket(str,b){if (str.indexOf(b[1])===-1){return-1;}let level=0;for (let i=0;i<str.length;i++){if (str[i]==='\\'){i++;} else if (str[i]===b[0]){level++;} else if (str[i]===b[1]){level--;if (level<0){return i;}}}return-1;}function outputLink(cap,link,raw,lexer){const href=link.href;const title=link.title?escape$1(link.title):null;const text=cap[1].replace(/\\([\[\]])/g,'$1');if (cap[0].charAt(0)!=='!'){lexer.state.inLink=true;const token={type:'link',raw,href,title,text,tokens:lexer.inlineTokens(text)};lexer.state.inLink=false;return token;}return{type:'image',raw,href,title,text:escape$1(text)};}function indentCodeCompensation(raw,text){const matchIndentToCode=raw.match(/^(\s+)(?:```)/);if (matchIndentToCode===null){return text;}const indentToCode=matchIndentToCode[1];return text .split('\n').map(node=>{const matchIndentInNode=node.match(/^\s+/);if (matchIndentInNode===null){return node;}const [indentInNode]=matchIndentInNode;if (indentInNode.length>=indentToCode.length){return node.slice(indentToCode.length);}return node;}).join('\n');}class _Tokenizer{options;rules;lexer;constructor(options){this.options=options||exports.defaults;}space(src){const cap=this.rules.block.newline.exec(src);if (cap&&cap[0].length>0){return{type:'space',raw:cap[0]};}}code(src){const cap=this.rules.block.code.exec(src);if (cap){const text=cap[0].replace(/^{1,4}/gm,'');return{type:'code',raw:cap[0],codeBlockStyle:'indented',text:!this.options.pedantic?rtrim(text,'\n'):text};}}fences(src){const cap=this.rules.block.fences.exec(src);if (cap){const raw=cap[0];const text=indentCodeCompensation(raw,cap[3]||'');return{type:'code',raw,lang:cap[2]?cap[2].trim().replace(this.rules.inline.anyPunctuation,'$1'):cap[2],text};}}heading(src){const cap=this.rules.block.heading.exec(src);if (cap){let text=cap[2].trim();if (/#$/.test(text)){const trimmed=rtrim(text,'#');if (this.options.pedantic){text=trimmed.trim();} else if (!trimmed||/$/.test(trimmed)){text=trimmed.trim();}}return{type:'heading',raw:cap[0],depth:cap[1].length,text,tokens:this.lexer.inline(text)};}}hr(src){const cap=this.rules.block.hr.exec(src);if (cap){return{type:'hr',raw:cap[0]};}}blockquote(src){const cap=this.rules.block.blockquote.exec(src);if (cap){const text=rtrim(cap[0].replace(/^*>[ \t]?/gm,''),'\n');const top=this.lexer.state.top;this.lexer.state.top=true;const tokens=this.lexer.blockTokens(text);this.lexer.state.top=top;return{type:'blockquote',raw:cap[0],tokens,text};}}list(src){let cap=this.rules.block.list.exec(src);if (cap){let bull=cap[1].trim();const isordered=bull.length>1;const list={type:'list',raw:'',ordered:isordered,start:isordered?+bull.slice(0,-1):'',loose:false,items:[]};bull=isordered?`\\d{1,9}\\${bull.slice(-1)}`:`\\${bull}`;if (this.options.pedantic){bull=isordered?bull:'[*+-]';}const itemRegex=new RegExp(`^({0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);let raw='';let itemContents='';let endsWithBlankLine=false;while (src){let endEarly=false;if (!(cap=itemRegex.exec(src))){break;}if (this.rules.block.hr.test(src)){break;}raw=cap[0];src=src.substring(raw.length);let line=cap[2].split('\n',1)[0].replace(/^\t+/,(t)=>' '.repeat(3*t.length));let nextLine=src.split('\n',1)[0];let indent=0;if (this.options.pedantic){indent=2;itemContents=line.trimStart();} else{indent=cap[2].search(/[^ ]/);indent=indent>4?1:indent;itemContents=line.slice(indent);indent+=cap[1].length;}let blankLine=false;if (!line&&/^*$/.test(nextLine)){raw+=nextLine+'\n';src=src.substring(nextLine.length+1);endEarly=true;}if (!endEarly){const nextBulletRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);const hrRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}((?:-*){3,}|(?:_*){3,}|(?:\\**){3,})(?:\\n+|$)`);const fencesBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:\`\`\`|~~~)`);const headingBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}#`);while (src){const rawLine=src.split('\n',1)[0];nextLine=rawLine;if (this.options.pedantic){nextLine=nextLine.replace(/^{1,4}(?=({4})*[^ ])/g,' ');}if (fencesBeginRegex.test(nextLine)){break;}if (headingBeginRegex.test(nextLine)){break;}if (nextBulletRegex.test(nextLine)){break;}if (hrRegex.test(src)){break;}if (nextLine.search(/[^ ]/)>=indent||!nextLine.trim()){itemContents+='\n'+nextLine.slice(indent);} else{if (blankLine){break;}if (line.search(/[^ ]/)>=4){break;}if (fencesBeginRegex.test(line)){break;}if (headingBeginRegex.test(line)){break;}if (hrRegex.test(line)){break;}itemContents+='\n'+nextLine;}if (!blankLine&&!nextLine.trim()){blankLine=true;}raw+=rawLine+'\n';src=src.substring(rawLine.length+1);line=nextLine.slice(indent);}}if (!list.loose){if (endsWithBlankLine){list.loose=true;} else if (/\n*\n*$/.test(raw)){endsWithBlankLine=true;}}let istask=null;let ischecked;if (this.options.gfm){istask=/^\[[ xX]\]/.exec(itemContents);if (istask){ischecked=istask[0]!=='[ ] ';itemContents=itemContents.replace(/^\[[ xX]\]+/,'');}}list.items.push({type:'list_item',raw,task:!!istask,checked:ischecked,loose:false,text:itemContents,tokens:[]});list.raw+=raw;}list.items[list.items.length-1].raw=raw.trimEnd();(list.items[list.items.length-1]).text=itemContents.trimEnd();list.raw=list.raw.trimEnd();for (let i=0;i<list.items.length;i++){this.lexer.state.top=false;list.items[i].tokens=this.lexer.blockTokens(list.items[i].text,[]);if (!list.loose){const spacers=list.items[i].tokens.filter(t=>t.type==='space');const hasMultipleLineBreaks=spacers.length>0&&spacers.some(t=>/\n.*\n/.test(t.raw));list.loose=hasMultipleLineBreaks;}}if (list.loose){for (let i=0;i<list.items.length;i++){list.items[i].loose=true;}}return list;}}html(src){const cap=this.rules.block.html.exec(src);if (cap){const token={type:'html',block:true,raw:cap[0],pre:cap[1]==='pre'||cap[1]==='script'||cap[1]==='style',text:cap[0]};return token;}}def(src){const cap=this.rules.block.def.exec(src);if (cap){const tag=cap[1].toLowerCase().replace(/\s+/g,' ');const href=cap[2]?cap[2].replace(/^<(.*)>$/,'$1').replace(this.rules.inline.anyPunctuation,'$1'):'';const title=cap[3]?cap[3].substring(1,cap[3].length-1).replace(this.rules.inline.anyPunctuation,'$1'):cap[3];return{type:'def',tag,raw:cap[0],href,title};}}table(src){const cap=this.rules.block.table.exec(src);if (!cap){return;}if (!/[:|]/.test(cap[2])){return;}const headers=splitCells(cap[1]);const aligns=cap[2].replace(/^\||\|*$/g,'').split('|');const rows=cap[3]&&cap[3].trim()?cap[3].replace(/\n[ \t]*$/,'').split('\n'):[];const item={type:'table',raw:cap[0],header:[],align:[],rows:[]};if (headers.length!==aligns.length){return;}for (const align of aligns){if (/^*-+:*$/.test(align)){item.align.push('right');} else if (/^*:-+:*$/.test(align)){item.align.push('center');} else if (/^*:-+*$/.test(align)){item.align.push('left');} else{item.align.push(null);}}for (const header of headers){item.header.push({text:header,tokens:this.lexer.inline(header)});}for (const row of rows){item.rows.push(splitCells(row,item.header.length).map(cell=>{return{text:cell,tokens:this.lexer.inline(cell)};}));}return item;}lheading(src){const cap=this.rules.block.lheading.exec(src);if (cap){return{type:'heading',raw:cap[0],depth:cap[2].charAt(0)==='='?1:2,text:cap[1],tokens:this.lexer.inline(cap[1])};}}paragraph(src){const cap=this.rules.block.paragraph.exec(src);if (cap){const text=cap[1].charAt(cap[1].length-1)==='\n'?cap[1].slice(0,-1):cap[1];return{type:'paragraph',raw:cap[0],text,tokens:this.lexer.inline(text)};}}text(src){const cap=this.rules.block.text.exec(src);if (cap){return{type:'text',raw:cap[0],text:cap[0],tokens:this.lexer.inline(cap[0])};}}escape(src){const cap=this.rules.inline.escape.exec(src);if (cap){return{type:'escape',raw:cap[0],text:escape$1(cap[1])};}}tag(src){const cap=this.rules.inline.tag.exec(src);if (cap){if (!this.lexer.state.inLink&&/^<a/i.test(cap[0])){this.lexer.state.inLink=true;} else if (this.lexer.state.inLink&&/^<\/a>/i.test(cap[0])){this.lexer.state.inLink=false;}if (!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=true;} else if (this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=false;}return{type:'html',raw:cap[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:false,text:cap[0]};}}link(src){const cap=this.rules.inline.link.exec(src);if (cap){const trimmedUrl=cap[2].trim();if (!this.options.pedantic&&/^</.test(trimmedUrl)){if (!(/>$/.test(trimmedUrl))){return;}const rtrimSlash=rtrim(trimmedUrl.slice(0,-1),'\\');if ((trimmedUrl.length-rtrimSlash.length)%2===0){return;}} else{const lastParenIndex=findClosingBracket(cap[2],'()');if (lastParenIndex>-1){const start=cap[0].indexOf('!')===0?5:4;const linkLen=start+cap[1].length+lastParenIndex;cap[2]=cap[2].substring(0,lastParenIndex);cap[0]=cap[0].substring(0,linkLen).trim();cap[3]='';}}let href=cap[2];let title='';if (this.options.pedantic){const link=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);if (link){href=link[1];title=link[3];}} else{title=cap[3]?cap[3].slice(1,-1):'';}href=href.trim();if (/^</.test(href)){if (this.options.pedantic&&!(/>$/.test(trimmedUrl))){href=href.slice(1);} else{href=href.slice(1,-1);}}return outputLink(cap,{href:href?href.replace(this.rules.inline.anyPunctuation,'$1'):href,title:title?title.replace(this.rules.inline.anyPunctuation,'$1'):title},cap[0],this.lexer);}}reflink(src,links){let cap;if ((cap=this.rules.inline.reflink.exec(src))||(cap=this.rules.inline.nolink.exec(src))){const linkString=(cap[2]||cap[1]).replace(/\s+/g,' ');const link=links[linkString.toLowerCase()];if (!link){const text=cap[0].charAt(0);return{type:'text',raw:text,text};}return outputLink(cap,link,cap[0],this.lexer);}}emStrong(src,maskedSrc,prevChar=''){let match=this.rules.inline.emStrongLDelim.exec(src);if (!match)return;if (match[3]&&prevChar.match(/[\p{L}\p{N}]/u))return;const nextChar=match[1]||match[2]||'';if (!nextChar||!prevChar||this.rules.inline.punctuation.exec(prevChar)){const lLength=[...match[0]].length-1;let rDelim,rLength,delimTotal=lLength,midDelimTotal=0;const endReg=match[0][0]==='*'?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;endReg.lastIndex=0;maskedSrc=maskedSrc.slice(-1*src.length+lLength);while ((match=endReg.exec(maskedSrc))!=null){rDelim=match[1]||match[2]||match[3]||match[4]||match[5]||match[6];if (!rDelim)continue;rLength=[...rDelim].length;if (match[3]||match[4]){delimTotal+=rLength;continue;} else if (match[5]||match[6]){if (lLength%3&&!((lLength+rLength)%3)){midDelimTotal+=rLength;continue;}}delimTotal-=rLength;if (delimTotal>0)continue;rLength=Math.min(rLength,rLength+delimTotal+midDelimTotal);const lastCharLength=[...match[0]][0].length;const raw=src.slice(0,lLength+match.index+lastCharLength+rLength);if (Math.min(lLength,rLength)%2){const text=raw.slice(1,-1);return{type:'em',raw,text,tokens:this.lexer.inlineTokens(text)};}const text=raw.slice(2,-2);return{type:'strong',raw,text,tokens:this.lexer.inlineTokens(text)};}}}codespan(src){const cap=this.rules.inline.code.exec(src);if (cap){let text=cap[2].replace(/\n/g,' ');const hasNonSpaceChars=/[^ ]/.test(text);const hasSpaceCharsOnBothEnds=/^/.test(text)&&/$/.test(text);if (hasNonSpaceChars&&hasSpaceCharsOnBothEnds){text=text.substring(1,text.length-1);}text=escape$1(text,true);return{type:'codespan',raw:cap[0],text};}}br(src){const cap=this.rules.inline.br.exec(src);if (cap){return{type:'br',raw:cap[0]};}}del(src){const cap=this.rules.inline.del.exec(src);if (cap){return{type:'del',raw:cap[0],text:cap[2],tokens:this.lexer.inlineTokens(cap[2])};}}autolink(src){const cap=this.rules.inline.autolink.exec(src);if (cap){let text,href;if (cap[2]==='@'){text=escape$1(cap[1]);href='mailto:'+text;} else{text=escape$1(cap[1]);href=text;}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}url(src){let cap;if (cap=this.rules.inline.url.exec(src)){let text,href;if (cap[2]==='@'){text=escape$1(cap[0]);href='mailto:'+text;} else{let prevCapZero;do{prevCapZero=cap[0];cap[0]=this.rules.inline._backpedal.exec(cap[0])?.[0]??'';}while (prevCapZero!==cap[0]);text=escape$1(cap[0]);if (cap[1]==='www.'){href='http:} else{href=cap[0];}}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}inlineText(src){const cap=this.rules.inline.text.exec(src);if (cap){let text;if (this.lexer.state.inRawBlock){text=cap[0];} else{text=escape$1(cap[0]);}return{type:'text',raw:cap[0],text};}}}const newline=/^(?:*(?:\n|$))+/;const blockCode=/^({4}[^\n]+(?:\n(?:*(?:\n|$))*)?)+/;const fences=/^{0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?:{0,3}\1[~`]**(?=\n|$)|$)/;const hr=/^{0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;const heading=/^{0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;const bullet=/(?:[*+-]|\d{1,9}[.)])/;const lheading=edit(/^(?!bull)((?:.|\n(?!\s*?\n|bull))+?)\n{0,3}(=+|-+)*(?:\n+|$)/).replace(/bull/g,bullet).getRegex();const _paragraph=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|+\n)[^\n]+)*)/;const blockText=/^[^\n]+/;const _blockLabel=/(?!\s*\])(?:\\.|[^\[\]\\])+/;const def=edit(/^{0,3}\[(label)\]:*(?:\n*)?([^<\s][^\s]*|<.*?>)(?:(?:+(?:\n*)?|*\n*)(title))?*(?:\n+|$)/).replace('label',_blockLabel).replace('title',/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();const list=edit(/^({0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,bullet).getRegex();const _tag='address|article|aside|base|basefont|blockquote|body|caption'+'|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'+'|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'+'|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'+'|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'+'|track|ul';const _comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/;const html=edit('^{0,3}(?:'+'<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)'+'|comment[^\\n]*(\\n+|$)'+'|<\\?[\\s\\S]*?(?:\\?>\\n*|$)'+'|<![A-Z][\\s\\S]*?(?:>\\n*|$)'+'|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)'+'|</?(tag)(?:+|\\n|/?>)[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*?*/?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+')','i').replace('comment',_comment).replace('tag',_tag).replace('attribute',/+[a-zA-Z:_][\w.:-]*(?:*=*"[^"\n]*"|*=*'[^'\n]*'|*=*[^\s"'=<>`]+)?/).getRegex();const paragraph=edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('|table','').replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockquote=edit(/^({0,3}>?(paragraph|[^\n]*)(?:\n|$))+/).replace('paragraph',paragraph).getRegex();const blockNormal={blockquote,code:blockCode,def,fences,heading,hr,html,lheading,list,newline,paragraph,table:noopTest,text:blockText};const gfmTable=edit('^*([^\\n ].*)\\n'+'{0,3}((?:\\|*)?:?-+:?*(?:\\|*:?-+:?*)*(?:\\|*)?)'+'(?:\\n((?:(?!*\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)').replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('blockquote','{0,3}>').replace('code','{4}[^\\n]').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockGfm={...blockNormal,table:gfmTable,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('table',gfmTable).replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex()};const blockPedantic={...blockNormal,html:edit('^*(?:comment*(?:\\n|\\s*$)'+'|<(tag)[\\s\\S]+?</\\1>*(?:\\n{2,}|\\s*$)'+'|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?>*(?:\\n{2,}|\\s*$))').replace('comment',_comment).replace(/tag/g,'(?!(?:'+'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'+'|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'+'\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),def:/^*\[([^\]]+)\]:*<?([^\s>]+)>?(?:+(["(][^\n]+[")]))?*(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:noopTest,lheading:/^(.+?)\n{0,3}(=+|-+)*(?:\n+|$)/,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','*#{1,6}*[^\n]').replace('lheading',lheading).replace('|table','').replace('blockquote','{0,3}>').replace('|fences','').replace('|list','').replace('|html','').replace('|tag','').getRegex()};const escape=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;const inlineCode=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;const br=/^({2,}|\\)\n(?!\s*$)/;const inlineText=/^(`+|[^`])(?:(?={2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?={2,}\n)))/;const _punctuation='\\p{P}$+<=>`^|~';const punctuation=edit(/^((?![*_])[\spunctuation])/,'u').replace(/punctuation/g,_punctuation).getRegex();const blockSkip=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;const emStrongLDelim=edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,'u').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimAst=edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)'+'|[^*]+(?=[^*])'+'|(?!\\*)[punct](\\*+)(?=[\\s]|$)'+'|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)'+'|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])'+'|[\\s](\\*+)(?!\\*)(?=[punct])'+'|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])'+'|[^punct\\s](\\*+)(?=[^punct\\s])','gu').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimUnd=edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)'+'|[^_]+(?=[^_])'+'|(?!_)[punct](_+)(?=[\\s]|$)'+'|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)'+'|(?!_)[punct\\s](_+)(?=[^punct\\s])'+'|[\\s](_+)(?!_)(?=[punct])'+'|(?!_)[punct](_+)(?!_)(?=[punct])','gu').replace(/punct/g,_punctuation).getRegex();const anyPunctuation=edit(/\\([punct])/,'gu').replace(/punct/g,_punctuation).getRegex();const autolink=edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace('scheme',/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace('email',/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();const _inlineComment=edit(_comment).replace('(?:-->|$)','-->').getRegex();const tag=edit('^comment'+'|^</[a-zA-Z][\\w:-]*\\s*>'+'|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>'+'|^<\\?[\\s\\S]*?\\?>'+'|^<![a-zA-Z]+\\s[\\s\\S]*?>'+'|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>').replace('comment',_inlineComment).replace('attribute',/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();const _inlineLabel=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;const link=edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace('label',_inlineLabel).replace('href',/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace('title',/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();const reflink=edit(/^!?\[(label)\]\[(ref)\]/).replace('label',_inlineLabel).replace('ref',_blockLabel).getRegex();const nolink=edit(/^!?\[(ref)\](?:\[\])?/).replace('ref',_blockLabel).getRegex();const reflinkSearch=edit('reflink|nolink(?!\\()','g').replace('reflink',reflink).replace('nolink',nolink).getRegex();const inlineNormal={_backpedal:noopTest,anyPunctuation,autolink,blockSkip,br,code:inlineCode,del:noopTest,emStrongLDelim,emStrongRDelimAst,emStrongRDelimUnd,escape,link,nolink,punctuation,reflink,reflinkSearch,tag,text:inlineText,url:noopTest};const inlinePedantic={...inlineNormal,link:edit(/^!?\[(label)\]\((.*?)\)/).replace('label',_inlineLabel).getRegex(),reflink:edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label',_inlineLabel).getRegex()};const inlineGfm={...inlineNormal,escape:edit(escape).replace('])','~|])').getRegex(),url:edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,'i').replace('email',/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?={2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?={2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/};const inlineBreaks={...inlineGfm,br:edit(br).replace('{2,}','*').getRegex(),text:edit(inlineGfm.text).replace('\\b_','\\b_|{2,}\\n').replace(/\{2,\}/g,'*').getRegex()};const block={normal:blockNormal,gfm:blockGfm,pedantic:blockPedantic};const inline={normal:inlineNormal,gfm:inlineGfm,breaks:inlineBreaks,pedantic:inlinePedantic};class _Lexer{tokens;options;state;tokenizer;inlineQueue;constructor(options){this.tokens=[];this.tokens.links=Object.create(null);this.options=options||exports.defaults;this.options.tokenizer=this.options.tokenizer||new _Tokenizer();this.tokenizer=this.options.tokenizer;this.tokenizer.options=this.options;this.tokenizer.lexer=this;this.inlineQueue=[];this.state={inLink:false,inRawBlock:false,top:true};const rules={block:block.normal,inline:inline.normal};if (this.options.pedantic){rules.block=block.pedantic;rules.inline=inline.pedantic;} else if (this.options.gfm){rules.block=block.gfm;if (this.options.breaks){rules.inline=inline.breaks;} else{rules.inline=inline.gfm;}}this.tokenizer.rules=rules;}static get rules(){return{block,inline};}static lex(src,options){const lexer=new _Lexer(options);return lexer.lex(src);}static lexInline(src,options){const lexer=new _Lexer(options);return lexer.inlineTokens(src);}lex(src){src=src .replace(/\r\n|\r/g,'\n');this.blockTokens(src,this.tokens);for (let i=0;i<this.inlineQueue.length;i++){const next=this.inlineQueue[i];this.inlineTokens(next.src,next.tokens);}this.inlineQueue=[];return this.tokens;}blockTokens(src,tokens=[]){if (this.options.pedantic){src=src.replace(/\t/g,' ').replace(/^+$/gm,'');} else{src=src.replace(/^(*)(\t+)/gm,(_,leading,tabs)=>{return leading+' '.repeat(tabs.length);});}let token;let lastToken;let cutSrc;let lastParagraphClipped;while (src){if (this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.space(src)){src=src.substring(token.raw.length);if (token.raw.length===1&&tokens.length>0){tokens[tokens.length-1].raw+='\n';} else{tokens.push(token);}continue;}if (token=this.tokenizer.code(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.fences(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.heading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.hr(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.blockquote(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.list(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.html(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.def(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.raw;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else if (!this.tokens.links[token.tag]){this.tokens.links[token.tag]={href:token.href,title:token.title};}continue;}if (token=this.tokenizer.table(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.lheading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startBlock){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startBlock.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (this.state.top&&(token=this.tokenizer.paragraph(cutSrc))){lastToken=tokens[tokens.length-1];if (lastParagraphClipped&&lastToken.type==='paragraph'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}lastParagraphClipped=(cutSrc.length!==src.length);src=src.substring(token.raw.length);continue;}if (token=this.tokenizer.text(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}this.state.top=true;return tokens;}inline(src,tokens=[]){this.inlineQueue.push({src,tokens});return tokens;}inlineTokens(src,tokens=[]){let token,lastToken,cutSrc;let maskedSrc=src;let match;let keepPrevChar,prevChar;if (this.tokens.links){const links=Object.keys(this.tokens.links);if (links.length>0){while ((match=this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc))!=null){if (links.includes(match[0].slice(match[0].lastIndexOf('[')+1,-1))){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);}}}}while ((match=this.tokenizer.rules.inline.blockSkip.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);}while ((match=this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'++'+maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);}while (src){if (!keepPrevChar){prevChar='';}keepPrevChar=false;if (this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.escape(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.tag(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.link(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.reflink(src,this.tokens.links)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.emStrong(src,maskedSrc,prevChar)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.codespan(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.br(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.del(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.autolink(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (!this.state.inLink&&(token=this.tokenizer.url(src))){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startInline){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startInline.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (token=this.tokenizer.inlineText(cutSrc)){src=src.substring(token.raw.length);if (token.raw.slice(-1)!=='_'){prevChar=token.raw.slice(-1);}keepPrevChar=true;lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}return tokens;}}class _Renderer{options;constructor(options){this.options=options||exports.defaults;}code(code,infostring,escaped){const lang=(infostring||'').match(/^\S*/)?.[0];code=code.replace(/\n$/,'')+'\n';if (!lang){return '<pre><code>'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}return '<pre><code class="language-'+escape$1(lang)+'">'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}blockquote(quote){return `<blockquote>\n${quote}</blockquote>\n`;}html(html,block){return html;}heading(text,level,raw){return `<h${level}>${text}</h${level}>\n`;}hr(){return '<hr>\n';}list(body,ordered,start){const type=ordered?'ol':'ul';const startatt=(ordered&&start!==1)?(' start="'+start+'"'):'';return '<'+type+startatt+'>\n'+body+'</'+type+'>\n';}listitem(text,task,checked){return `<li>${text}</li>\n`;}checkbox(checked){return '<input '+(checked?'checked="" ':'')+'disabled="" type="checkbox">';}paragraph(text){return `<p>${text}</p>\n`;}table(header,body){if (body)body=`<tbody>${body}</tbody>`;return '<table>\n'+'<thead>\n'+header+'</thead>\n'+body+'</table>\n';}tablerow(content){return `<tr>\n${content}</tr>\n`;}tablecell(content,flags){const type=flags.header?'th':'td';const tag=flags.align?`<${type}align="${flags.align}">`:`<${type}>`;return tag+content+`</${type}>\n`;}strong(text){return `<strong>${text}</strong>`;}em(text){return `<em>${text}</em>`;}codespan(text){return `<code>${text}</code>`;}br(){return '<br>';}del(text){return `<del>${text}</del>`;}link(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out='<a href="'+href+'"';if (title){out+=' title="'+title+'"';}out+='>'+text+'</a>';return out;}image(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out=`<img src="${href}" alt="${text}"`;if (title){out+=` title="${title}"`;}out+='>';return out;}text(text){return text;}}class _TextRenderer{strong(text){return text;}em(text){return text;}codespan(text){return text;}del(text){return text;}html(text){return text;}text(text){return text;}link(href,title,text){return ''+text;}image(href,title,text){return ''+text;}br(){return '';}}class _Parser{options;renderer;textRenderer;constructor(options){this.options=options||exports.defaults;this.options.renderer=this.options.renderer||new _Renderer();this.renderer=this.options.renderer;this.renderer.options=this.options;this.textRenderer=new _TextRenderer();}static parse(tokens,options){const parser=new _Parser(options);return parser.parse(tokens);}static parseInline(tokens,options){const parser=new _Parser(options);return parser.parseInline(tokens);}parse(tokens,top=true){let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const genericToken=token;const ret=this.options.extensions.renderers[genericToken.type].call({parser:this},genericToken);if (ret!==false||!['space','hr','heading','code','table','blockquote','list','html','paragraph','text'].includes(genericToken.type)){out+=ret||'';continue;}}switch (token.type){case 'space':{continue;}case 'hr':{out+=this.renderer.hr();continue;}case 'heading':{const headingToken=token;out+=this.renderer.heading(this.parseInline(headingToken.tokens),headingToken.depth,unescape(this.parseInline(headingToken.tokens,this.textRenderer)));continue;}case 'code':{const codeToken=token;out+=this.renderer.code(codeToken.text,codeToken.lang,!!codeToken.escaped);continue;}case 'table':{const tableToken=token;let header='';let cell='';for (let j=0;j<tableToken.header.length;j++){cell+=this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens),{header:true,align:tableToken.align[j]});}header+=this.renderer.tablerow(cell);let body='';for (let j=0;j<tableToken.rows.length;j++){const row=tableToken.rows[j];cell='';for (let k=0;k<row.length;k++){cell+=this.renderer.tablecell(this.parseInline(row[k].tokens),{header:false,align:tableToken.align[k]});}body+=this.renderer.tablerow(cell);}out+=this.renderer.table(header,body);continue;}case 'blockquote':{const blockquoteToken=token;const body=this.parse(blockquoteToken.tokens);out+=this.renderer.blockquote(body);continue;}case 'list':{const listToken=token;const ordered=listToken.ordered;const start=listToken.start;const loose=listToken.loose;let body='';for (let j=0;j<listToken.items.length;j++){const item=listToken.items[j];const checked=item.checked;const task=item.task;let itemBody='';if (item.task){const checkbox=this.renderer.checkbox(!!checked);if (loose){if (item.tokens.length>0&&item.tokens[0].type==='paragraph'){item.tokens[0].text=checkbox+' '+item.tokens[0].text;if (item.tokens[0].tokens&&item.tokens[0].tokens.length>0&&item.tokens[0].tokens[0].type==='text'){item.tokens[0].tokens[0].text=checkbox+' '+item.tokens[0].tokens[0].text;}} else{item.tokens.unshift({type:'text',text:checkbox+' '});}} else{itemBody+=checkbox+' ';}}itemBody+=this.parse(item.tokens,loose);body+=this.renderer.listitem(itemBody,task,!!checked);}out+=this.renderer.list(body,ordered,start);continue;}case 'html':{const htmlToken=token;out+=this.renderer.html(htmlToken.text,htmlToken.block);continue;}case 'paragraph':{const paragraphToken=token;out+=this.renderer.paragraph(this.parseInline(paragraphToken.tokens));continue;}case 'text':{let textToken=token;let body=textToken.tokens?this.parseInline(textToken.tokens):textToken.text;while (i+1<tokens.length&&tokens[i+1].type==='text'){textToken=tokens[++i];body+='\n'+(textToken.tokens?this.parseInline(textToken.tokens):textToken.text);}out+=top?this.renderer.paragraph(body):body;continue;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}parseInline(tokens,renderer){renderer=renderer||this.renderer;let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const ret=this.options.extensions.renderers[token.type].call({parser:this},token);if (ret!==false||!['escape','html','link','image','strong','em','codespan','br','del','text'].includes(token.type)){out+=ret||'';continue;}}switch (token.type){case 'escape':{const escapeToken=token;out+=renderer.text(escapeToken.text);break;}case 'html':{const tagToken=token;out+=renderer.html(tagToken.text);break;}case 'link':{const linkToken=token;out+=renderer.link(linkToken.href,linkToken.title,this.parseInline(linkToken.tokens,renderer));break;}case 'image':{const imageToken=token;out+=renderer.image(imageToken.href,imageToken.title,imageToken.text);break;}case 'strong':{const strongToken=token;out+=renderer.strong(this.parseInline(strongToken.tokens,renderer));break;}case 'em':{const emToken=token;out+=renderer.em(this.parseInline(emToken.tokens,renderer));break;}case 'codespan':{const codespanToken=token;out+=renderer.codespan(codespanToken.text);break;}case 'br':{out+=renderer.br();break;}case 'del':{const delToken=token;out+=renderer.del(this.parseInline(delToken.tokens,renderer));break;}case 'text':{const textToken=token;out+=renderer.text(textToken.text);break;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}}class _Hooks{options;constructor(options){this.options=options||exports.defaults;}static passThroughHooks=new Set([ 'preprocess','postprocess','processAllTokens' ]);preprocess(markdown){return markdown;}postprocess(html){return html;}processAllTokens(tokens){return tokens;}}class Marked{defaults=_getDefaults();options=this.setOptions;parse=this.#parseMarkdown(_Lexer.lex,_Parser.parse);parseInline=this.#parseMarkdown(_Lexer.lexInline,_Parser.parseInline);Parser=_Parser;Renderer=_Renderer;TextRenderer=_TextRenderer;Lexer=_Lexer;Tokenizer=_Tokenizer;Hooks=_Hooks;constructor(...args){this.use(...args);}walkTokens(tokens,callback){let values=[];for (const token of tokens){values=values.concat(callback.call(this,token));switch (token.type){case 'table':{const tableToken=token;for (const cell of tableToken.header){values=values.concat(this.walkTokens(cell.tokens,callback));}for (const row of tableToken.rows){for (const cell of row){values=values.concat(this.walkTokens(cell.tokens,callback));}}break;}case 'list':{const listToken=token;values=values.concat(this.walkTokens(listToken.items,callback));break;}default:{const genericToken=token;if (this.defaults.extensions?.childTokens?.[genericToken.type]){this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens)=>{const tokens=genericToken[childTokens].flat(Infinity);values=values.concat(this.walkTokens(tokens,callback));});} else if (genericToken.tokens){values=values.concat(this.walkTokens(genericToken.tokens,callback));}}}}return values;}use(...args){const extensions=this.defaults.extensions||{renderers:{},childTokens:{}};args.forEach((pack)=>{const opts={...pack};opts.async=this.defaults.async||opts.async||false;if (pack.extensions){pack.extensions.forEach((ext)=>{if (!ext.name){throw new Error('extension name required');}if ('renderer' in ext){const prevRenderer=extensions.renderers[ext.name];if (prevRenderer){extensions.renderers[ext.name]=function(...args){let ret=ext.renderer.apply(this,args);if (ret===false){ret=prevRenderer.apply(this,args);}return ret;};} else{extensions.renderers[ext.name]=ext.renderer;}}if ('tokenizer' in ext){if (!ext.level||(ext.level!=='block'&&ext.level!=='inline')){throw new Error("extension level must be 'block' or 'inline'");}const extLevel=extensions[ext.level];if (extLevel){extLevel.unshift(ext.tokenizer);} else{extensions[ext.level]=[ext.tokenizer];}if (ext.start){if (ext.level==='block'){if (extensions.startBlock){extensions.startBlock.push(ext.start);} else{extensions.startBlock=[ext.start];}} else if (ext.level==='inline'){if (extensions.startInline){extensions.startInline.push(ext.start);} else{extensions.startInline=[ext.start];}}}}if ('childTokens' in ext&&ext.childTokens){extensions.childTokens[ext.name]=ext.childTokens;}});opts.extensions=extensions;}if (pack.renderer){const renderer=this.defaults.renderer||new _Renderer(this.defaults);for (const prop in pack.renderer){if (!(prop in renderer)){throw new Error(`renderer '${prop}' does not exist`);}if (prop==='options'){continue;}const rendererProp=prop;const rendererFunc=pack.renderer[rendererProp];const prevRenderer=renderer[rendererProp];renderer[rendererProp]=(...args)=>{let ret=rendererFunc.apply(renderer,args);if (ret===false){ret=prevRenderer.apply(renderer,args);}return ret||'';};}opts.renderer=renderer;}if (pack.tokenizer){const tokenizer=this.defaults.tokenizer||new _Tokenizer(this.defaults);for (const prop in pack.tokenizer){if (!(prop in tokenizer)){throw new Error(`tokenizer '${prop}' does not exist`);}if (['options','rules','lexer'].includes(prop)){continue;}const tokenizerProp=prop;const tokenizerFunc=pack.tokenizer[tokenizerProp];const prevTokenizer=tokenizer[tokenizerProp];tokenizer[tokenizerProp]=(...args)=>{let ret=tokenizerFunc.apply(tokenizer,args);if (ret===false){ret=prevTokenizer.apply(tokenizer,args);}return ret;};}opts.tokenizer=tokenizer;}if (pack.hooks){const hooks=this.defaults.hooks||new _Hooks();for (const prop in pack.hooks){if (!(prop in hooks)){throw new Error(`hook '${prop}' does not exist`);}if (prop==='options'){continue;}const hooksProp=prop;const hooksFunc=pack.hooks[hooksProp];const prevHook=hooks[hooksProp];if (_Hooks.passThroughHooks.has(prop)){hooks[hooksProp]=(arg)=>{if (this.defaults.async){return Promise.resolve(hooksFunc.call(hooks,arg)).then(ret=>{return prevHook.call(hooks,ret);});}const ret=hooksFunc.call(hooks,arg);return prevHook.call(hooks,ret);};} else{hooks[hooksProp]=(...args)=>{let ret=hooksFunc.apply(hooks,args);if (ret===false){ret=prevHook.apply(hooks,args);}return ret;};}}opts.hooks=hooks;}if (pack.walkTokens){const walkTokens=this.defaults.walkTokens;const packWalktokens=pack.walkTokens;opts.walkTokens=function(token){let values=[];values.push(packWalktokens.call(this,token));if (walkTokens){values=values.concat(walkTokens.call(this,token));}return values;};}this.defaults={...this.defaults,...opts};});return this;}setOptions(opt){this.defaults={...this.defaults,...opt};return this;}lexer(src,options){return _Lexer.lex(src,options??this.defaults);}parser(tokens,options){return _Parser.parse(tokens,options??this.defaults);}#parseMarkdown(lexer,parser){return(src,options)=>{const origOpt={...options};const opt={...this.defaults,...origOpt};if (this.defaults.async===true&&origOpt.async===false){if (!opt.silent){console.warn('marked():The async option was set to true by an extension. The async:false option sent to parse will be ignored.');}opt.async=true;}const throwError=this.#onError(!!opt.silent,!!opt.async);if (typeof src==='undefined'||src===null){return throwError(new Error('marked():input parameter is undefined or null'));}if (typeof src!=='string'){return throwError(new Error('marked():input parameter is of type '+Object.prototype.toString.call(src)+',string expected'));}if (opt.hooks){opt.hooks.options=opt;}if (opt.async){return Promise.resolve(opt.hooks?opt.hooks.preprocess(src):src).then(src=>lexer(src,opt)).then(tokens=>opt.hooks?opt.hooks.processAllTokens(tokens):tokens).then(tokens=>opt.walkTokens?Promise.all(this.walkTokens(tokens,opt.walkTokens)).then(()=>tokens):tokens).then(tokens=>parser(tokens,opt)).then(html=>opt.hooks?opt.hooks.postprocess(html):html).catch (throwError);}try{if (opt.hooks){src=opt.hooks.preprocess(src);}let tokens=lexer(src,opt);if (opt.hooks){tokens=opt.hooks.processAllTokens(tokens);}if (opt.walkTokens){this.walkTokens(tokens,opt.walkTokens);}let html=parser(tokens,opt);if (opt.hooks){html=opt.hooks.postprocess(html);}return html;} catch (e){return throwError(e);}};}#onError(silent,async){return(e)=>{e.message+='\nPlease report this to https:if (silent){const msg='<p>An error occurred:</p><pre>'+escape$1(e.message+'',true)+'</pre>';if (async){return Promise.resolve(msg);}return msg;}if (async){return Promise.reject(e);}throw e;};}}const markedInstance=new Marked();function marked(src,opt){return markedInstance.parse(src,opt);}marked.options=marked.setOptions=function(options){markedInstance.setOptions(options);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.getDefaults=_getDefaults;marked.defaults=exports.defaults;marked.use=function(...args){markedInstance.use(...args);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.walkTokens=function(tokens,callback){return markedInstance.walkTokens(tokens,callback);};marked.parseInline=markedInstance.parseInline;marked.Parser=_Parser;marked.parser=_Parser.parse;marked.Renderer=_Renderer;marked.TextRenderer=_TextRenderer;marked.Lexer=_Lexer;marked.lexer=_Lexer.lex;marked.Tokenizer=_Tokenizer;marked.Hooks=_Hooks;marked.parse=marked;const options=marked.options;const setOptions=marked.setOptions;const use=marked.use;const walkTokens=marked.walkTokens;const parseInline=marked.parseInline;const parse=marked;const parser=_Parser.parse;const lexer=_Lexer.lex;exports.Hooks=_Hooks;exports.Lexer=_Lexer;exports.Marked=Marked;exports.Parser=_Parser;exports.Renderer=_Renderer;exports.TextRenderer=_TextRenderer;exports.Tokenizer=_Tokenizer;exports.getDefaults=_getDefaults;exports.lexer=lexer;exports.marked=marked;exports.options=options;exports.parse=parse;exports.parseInline=parseInline;exports.parser=parser;exports.setOptions=setOptions;exports.use=use;exports.walkTokens=walkTokens;}));function formatDate(timestamp){const date=new Date(timestamp*1000);return date.toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});}function calculateReadingTime(wordCountOrContent){if (!wordCountOrContent)return 'Unknown';const wordsPerMinute=200;let words;if (typeof wordCountOrContent==='number'){words=wordCountOrContent;if (words===0)return 'Unknown';} else{words=wordCountOrContent.trim().split(/\s+/).filter(w=>w.length>0).length;}const minutes=Math.ceil(words/wordsPerMinute);return `${minutes}min read`;}function truncate(text,maxLength=150){if (!text||text.length<=maxLength)return text;return text.substring(0,maxLength).trim()+'...';}function truncateBytes(text,maxBytes){if (!text||!maxBytes||maxBytes<=0)return text||'';const encoder=new TextEncoder();const bytes=encoder.encode(text);if (bytes.length<=maxBytes)return text;let lo=0,hi=text.length;while (lo<hi){const mid=Math.floor((lo+hi+1)/2);const slice=text.slice(0,mid);const len=encoder.encode(slice).length;if (len<=maxBytes)lo=mid;else hi=mid-1;}return text.slice(0,lo).trimEnd()+'...';}function escapeHtml(text){const div=document.createElement('div');div.textContent=text;return div.innerHTML;}function debounce(func,wait){let timeout;return function executedFunction(...args){const later=()=>{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};}class ContentGrowthAPI{constructor(config){this.apiKey=config.apiKey;this.baseUrl=config.baseUrl||'https:this.cache=new Map();this.cacheTTL=5*60*1000;}async fetchArticles(options={}){const{page=1,limit=12,tags=[],category}=options;const params=new URLSearchParams({page:page.toString(),limit:limit.toString()});if (tags.length>0){params.set('tag',tags.join(','));}if (category){params.set('category',category);}const url=`${this.baseUrl}/widget/articles?${params}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch articles:',error);throw error;}}async fetchArticle(uuid){const url=`${this.baseUrl}/widget/articles/${uuid}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article:',error);throw error;}}async fetchArticleBySlug(slug){const url=`${this.baseUrl}/widget/articles/slug/${slug}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article by slug:',error);throw error;}}getFromCache(key){const cached=this.cache.get(key);if (!cached)return null;const now=Date.now();if (now-cached.timestamp>this.cacheTTL){this.cache.delete(key);return null;}return cached.data;}setCache(key,data){this.cache.set(key,{data,timestamp:Date.now()});}clearCache(){this.cache.clear();}}class ContentCard{constructor(article,options={}){this.article=article;this.displayMode=options.displayMode||'compact';this.viewerMode=options.viewerMode||'inline';this.externalUrlPattern=options.externalUrlPattern||'/article/{id}';this.externalTarget=options.externalTarget||'article-{id}';this.onExpand=options.onExpand||null;this.onClick=options.onClick||null;this.aiSummaryMaxBytes=options.aiSummaryMaxBytes;}render(){const layoutMode=this.displayMode==='expanded'?'expanded':'compact';if (this.viewerMode==='external'){const link=document.createElement('a');link.className=`cg-card cg-card--${this.displayMode}`;link.dataset.contentId=this.article.uuid;let url=this.externalUrlPattern .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);let target=this.externalTarget .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);link.href=url;link.target=target;link.rel='noopener';if (layoutMode==='compact'){link.innerHTML=this.renderCompact();} else{link.innerHTML=this.renderExpanded();}const expandBtn=link.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.preventDefault();e.stopPropagation();this.onExpand(this.article,link);});}return link;}const card=document.createElement('article');card.className=`cg-card cg-card--${this.displayMode}`;card.dataset.contentId=this.article.uuid;if (layoutMode==='compact'){card.innerHTML=this.renderCompact();} else{card.innerHTML=this.renderExpanded();}card.addEventListener('click',(e)=>{if (e.target.closest('.cg-expand-btn'))return;if (this.onClick){this.onClick(this.article);}});const expandBtn=card.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.stopPropagation();this.onExpand(this.article,card);});}return card;}renderCompact(){const readingTime=calculateReadingTime(this.article.wordCount);return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn" aria-label="Show more" title="Show summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div><div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}renderExpanded(){const readingTime=calculateReadingTime(this.article.wordCount);const summaryFull=this.article.summary||'';const summary=this.aiSummaryMaxBytes?truncateBytes(summaryFull,this.aiSummaryMaxBytes):summaryFull;const tags=this.article.tags||[];return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn cg-expand-btn--collapse" aria-label="Show less" title="Hide summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M12 10L8 6L4 10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div>${summary?`<div class="cg-card-summary"><p>${escapeHtml(summary)}</p></div>`:''}${tags.length>0?`<div class="cg-card-tags">${tags.map(tag=>`<span class="cg-tag">${escapeHtml(tag)}</span>`).join('')}</div>`:''}<div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}}class ContentList{constructor(container,api,options={}){this.container=container;this.api=api;this.options={layoutMode:options.layoutMode||'cards',displayMode:options.displayMode||'comfortable',pageSize:parseInt(options.pageSize)||12,tags:options.tags||[],category:options.category,aiSummaryMaxBytes:options.aiSummaryMaxBytes,viewerMode:options.viewerMode||'inline',externalUrlPattern:options.externalUrlPattern||'/article/{id}',externalTarget:options.externalTarget||'article-{id}',onArticleClick:options.onArticleClick||null};this.currentPage=1;this.totalPages=1;this.articles=[];this.loading=false;this.expandedCards=new Set();}async init(){this.render();await this.loadArticles();}render(){const layoutClass=this.options.layoutMode==='rows'?'cg-content-rows':'cg-content-grid';this.container.innerHTML=`<div class="cg-content-list"><div class="cg-list-header"><button class="cg-display-toggle" title="Toggle display mode"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="2" y="2" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="8" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="14" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/></svg><span>${this.options.displayMode==='compact'?'Show summaries':'Hide summaries'}</span></button></div><div class="${layoutClass}"></div><div class="cg-pagination"></div></div>`;const toggle=this.container.querySelector('.cg-display-toggle');toggle.addEventListener('click',()=>this.toggleDisplayMode());}async loadArticles(page=1){if (this.loading){return;}this.loading=true;this.showLoading();try{const data=await this.api.fetchArticles({page,limit:this.options.pageSize,tags:this.options.tags,category:this.options.category});this.articles=data.articles||[];this.currentPage=data.pagination?.page||1;this.totalPages=data.pagination?.totalPages||1;this.renderArticles();this.renderPagination();} catch (error){console.error('[ContentList] Error loading articles:',error);this.showError('Failed to load articles. Please try again.');} finally{this.loading=false;}}renderArticles(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (this.articles.length===0){grid.innerHTML=`<div class="cg-empty-state"><svg width="64" height="64" viewBox="0 0 64 64" fill="none"><rect x="8" y="12" width="48" height="40" rx="4" stroke="currentColor" stroke-width="2"/><path d="M16 24H48M16 32H48M16 40H32" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>No articles found</p></div>`;return;}grid.innerHTML='';this.articles.forEach(article=>{const isExpanded=this.expandedCards.has(article.uuid);const card=new ContentCard(article,{displayMode:isExpanded?'expanded':this.options.displayMode,viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,aiSummaryMaxBytes:this.options.aiSummaryMaxBytes,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});grid.appendChild(card.render());});}handleExpand(article,cardElement){const isExpanded=this.expandedCards.has(article.uuid);if (isExpanded){this.expandedCards.delete(article.uuid);} else{this.expandedCards.add(article.uuid);}const newCard=new ContentCard(article,{displayMode:isExpanded?this.options.displayMode:'expanded',viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});cardElement.replaceWith(newCard.render());}handleArticleClick(article){if (this.options.onArticleClick){this.options.onArticleClick(article);}}toggleDisplayMode(){this.options.displayMode=this.options.displayMode==='compact'?'expanded':'compact';this.expandedCards.clear();this.renderArticles();const toggle=this.container.querySelector('.cg-display-toggle span');toggle.textContent=this.options.displayMode==='compact'?'Show summaries':'Hide summaries';}renderPagination(){const pagination=this.container.querySelector('.cg-pagination');if (this.totalPages<=1){pagination.innerHTML='';return;}const prevDisabled=this.currentPage===1;const nextDisabled=this.currentPage===this.totalPages;pagination.innerHTML=`<button class="cg-btn-prev" ${prevDisabled?'disabled':''}><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 12L6 8L10 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Previous</button><span class="cg-page-info">Page ${this.currentPage}of ${this.totalPages}</span><button class="cg-btn-next" ${nextDisabled?'disabled':''}>Next<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M6 4L10 8L6 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button>`;const prevBtn=pagination.querySelector('.cg-btn-prev');const nextBtn=pagination.querySelector('.cg-btn-next');prevBtn.addEventListener('click',()=>{if (this.currentPage>1){this.loadArticles(this.currentPage-1);this.scrollToTop();}});nextBtn.addEventListener('click',()=>{if (this.currentPage<this.totalPages){this.loadArticles(this.currentPage+1);this.scrollToTop();}});}showLoading(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-loading"><div class="cg-spinner"></div><p>Loading articles...</p></div>`;}}showError(message){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p><button class="cg-retry-btn">Try Again</button></div>`;const retryBtn=grid.querySelector('.cg-retry-btn');retryBtn.addEventListener('click',()=>this.loadArticles(this.currentPage));}}scrollToTop(){this.container.scrollIntoView({behavior:'smooth',block:'start'});}}class ContentViewer{constructor(container,api,options={}){this.container=container;this.api=api;this.options={displayMode:options.displayMode||'inline',showBackButton:options.showBackButton!==false,showSummary:options.showSummary!==false,onBack:options.onBack||null};this.article=null;this.loading=false;this.summaryExpanded=true;}async loadArticle(uuid){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticle(uuid);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}async loadArticleBySlug(slug){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticleBySlug(slug);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}render(){if (!this.article)return;const readingTime=calculateReadingTime(this.article.wordCount||this.article.content);const content=this.renderMarkdown(this.article.content||'');this.container.innerHTML=`<div class="cg-content-viewer">${this.options.showBackButton?`<div class="cg-viewer-header"><button class="cg-back-btn"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Back to list</button></div>`:''}<article class="cg-viewer-content"><header class="cg-content-header"><h1 class="cg-content-title">${escapeHtml(this.article.title)}</h1>${this.options.showSummary&&this.article.summary&&this.article.category!=='announce'?`<div class="cg-ai-summary ${this.summaryExpanded?'expanded':'collapsed'}"><div class="cg-ai-summary-header"><div class="cg-ai-summary-label"><svg class="cg-ai-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg><span>AI Generated Summary</span></div><button class="cg-summary-toggle" aria-label="Toggle summary"><svg class="cg-chevron" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6l4 4 4-4"/></svg></button></div><div class="cg-ai-summary-content"><p>${escapeHtml(this.article.summary)}</p></div></div>`:''}<div class="cg-content-meta"><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 8C9.65685 8 11 6.65685 11 5C11 3.34315 9.65685 2 8 2C6.34315 2 5 3.34315 5 5C5 6.65685 6.34315 8 8 8Z" stroke="currentColor" stroke-width="1.5"/><path d="M14 14C14 11.7909 11.3137 10 8 10C4.68629 10 2 11.7909 2 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M5 2V4M11 2V4M2 6H14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 4V8L10.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div></header><div class="cg-content-body">${content}</div></article></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}const summaryToggle=this.container.querySelector('.cg-summary-toggle');if (summaryToggle){summaryToggle.addEventListener('click',()=>this.toggleSummary());}}toggleSummary(){this.summaryExpanded=!this.summaryExpanded;const summaryEl=this.container.querySelector('.cg-ai-summary');if (summaryEl){if (this.summaryExpanded){summaryEl.classList.add('expanded');summaryEl.classList.remove('collapsed');} else{summaryEl.classList.add('collapsed');summaryEl.classList.remove('expanded');}}}renderMarkdown(markdown){marked.setOptions({breaks:true,gfm:true,headerIds:true,mangle:false});try{return marked.parse(markdown);} catch (error){console.error('Markdown parsing error:',error);return `<p>${escapeHtml(markdown)}</p>`;}}handleBack(){if (this.options.onBack){this.options.onBack();}}showLoading(){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-loading"><div class="cg-spinner"></div><p>Loading article...</p></div></div>`;}showError(message){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p>${this.options.showBackButton?'<button class="cg-back-btn">Back to articles</button>':''}</div></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}}clear(){this.container.innerHTML='';this.article=null;}}class ContentGrowthWidget{static version='1.1.1';constructor(container,config){this.container=typeof container==='string'?document.querySelector(container):container;if (!this.container){throw new Error('Container not found');}this.config={apiKey:config.apiKey||config['api-key'],baseUrl:config.baseUrl||'https:tags:this.parseTags(config.tags),category:config.category,theme:config.theme||'light',layoutMode:config.layoutMode||config['layout-mode']||'cards',displayMode:config.displayMode||config['display-mode']||'comfortable',aiSummaryMaxBytes:config.aiSummaryMaxBytes||config['ai-summary-max-bytes'],viewerMode:config.viewerMode||config['viewer-mode']||'inline',externalUrlPattern:config.externalUrlPattern||config['external-url-pattern']||'/article/{id}',externalTarget:config.externalTarget||config['external-target']||'article-{id}',pageSize:config.pageSize||config['page-size']||12,mode:config.mode||'list',articleId:config.articleId||config['article-id'],slug:config.slug};if (!this.config.apiKey){throw new Error('API key is required');}this.api=new ContentGrowthAPI({apiKey:this.config.apiKey,baseUrl:this.config.baseUrl});this.currentView='list';this.contentList=null;this.contentViewer=null;this.init();}init(){this.container.classList.add('cg-widget');this.container.setAttribute('data-theme',this.config.theme);if (this.config.mode==='article-only'){if (this.config.slug){this.showPostInlineBySlug(this.config.slug);} else if (this.config.articleId){this.showPostInline(this.config.articleId);}} else{this.showList();}}showList(){this.currentView='list';this.container.innerHTML='';const listContainer=document.createElement('div');listContainer.className='cg-list-view';this.container.appendChild(listContainer);this.contentList=new ContentList(listContainer,this.api,{layoutMode:this.config.layoutMode,displayMode:this.config.displayMode,pageSize:this.config.pageSize,tags:this.config.tags,category:this.config.category,aiSummaryMaxBytes:this.config.aiSummaryMaxBytes,viewerMode:this.config.viewerMode,externalUrlPattern:this.config.externalUrlPattern,externalTarget:this.config.externalTarget,onArticleClick:(article)=>this.showPost(article.uuid)});this.contentList.init();}showPost(uuid){this.currentView='viewer';if (this.config.viewerMode==='modal'){this.showPostModal(uuid);} else{this.showPostInline(uuid);}}showPostInline(uuid){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticle(uuid);}showPostInlineBySlug(slug){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticleBySlug(slug);}showPostModal(uuid){const modal=document.createElement('div');modal.className='cg-modal';if (this.config.theme){modal.setAttribute('data-theme',this.config.theme);}modal.innerHTML=`<div class="cg-modal-overlay"></div><div class="cg-modal-content"><button class="cg-modal-close" aria-label="Close"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><div class="cg-modal-body"></div></div>`;document.body.appendChild(modal);document.body.style.overflow='hidden';const modalBody=modal.querySelector('.cg-modal-body');this.contentViewer=new ContentViewer(modalBody,this.api,{displayMode:'modal',onBack:()=>this.closeModal(modal)});this.contentViewer.loadArticle(uuid);const closeBtn=modal.querySelector('.cg-modal-close');const overlay=modal.querySelector('.cg-modal-overlay');const closeModal=()=>this.closeModal(modal);closeBtn.addEventListener('click',closeModal);overlay.addEventListener('click',closeModal);const handleEsc=(e)=>{if (e.key==='Escape'){closeModal();document.removeEventListener('keydown',handleEsc);}};document.addEventListener('keydown',handleEsc);requestAnimationFrame(()=>{modal.classList.add('cg-modal--active');});}closeModal(modal){modal.classList.remove('cg-modal--active');setTimeout(()=>{modal.remove();document.body.style.overflow='';},300);}parseTags(tags){if (!tags)return [];if (Array.isArray(tags))return tags;return tags.split(',').map(t=>t.trim()).filter(Boolean);}updateConfig(newConfig){Object.assign(this.config,newConfig);this.init();}destroy(){this.container.innerHTML='';this.container.classList.remove('cg-widget');this.container.removeAttribute('data-theme');}}function initWidgets(){const containers=document.querySelectorAll('[data-cg-content]');`);containers.forEach((container,index)=>{const config={apiKey:container.dataset.apiKey||container.dataset.cgApiKey,baseUrl:window.WIDGET_BASE_URL||container.dataset.baseUrl||container.dataset.cgBaseUrl,tags:container.dataset.tags||container.dataset.cgTags,theme:container.dataset.theme||container.dataset.cgTheme||'light',layoutMode:container.dataset.layoutMode||container.dataset.cgLayoutMode||'cards',displayMode:container.dataset.displayMode||container.dataset.cgDisplayMode||'comfortable',viewerMode:container.dataset.viewerMode||container.dataset.cgViewerMode||'inline',externalUrlPattern:container.dataset.externalUrlPattern||container.dataset.cgExternalUrlPattern,externalTarget:container.dataset.externalTarget||container.dataset.cgExternalTarget,pageSize:container.dataset.pageSize||container.dataset.cgPageSize||12,mode:container.dataset.mode||container.dataset.cgMode||'list',articleId:container.dataset.articleId||container.dataset.cgArticleId};try{new ContentGrowthWidget(container,config);} catch (error){console.error(`[Widget ${index}] Failed to initialize:`,error);container.innerHTML=`<div style="padding:2rem;text-align:center;color:#ef4444;"><p>Failed to load widget:${error.message}</p><p style="font-size:0.875rem;margin-top:0.5rem;">Check console for details</p></div>`;}});}if (document.readyState==='loading'){document.addEventListener('DOMContentLoaded',initWidgets);} else{initWidgets();}window.ContentGrowthWidget=ContentGrowthWidget;{ContentGrowthWidget};window.ContentGrowthWidget=ContentGrowthWidget;console.log('[ContentGrowthWidget] Loaded successfully v1.1.1');})(window);
|
|
1
|
+
/***Content Growth Widget-Standalone Bundle*Version:1.1.3*https:*/(function(window){'use strict';(function(global,factory){typeof exports==='object'&&typeof module!=='undefined'?factory(exports):typeof define==='function'&&define.amd?define(['exports'],factory):(global=typeof globalThis!=='undefined'?globalThis:global||self,factory(global.marked={}));})(this,(function(exports){'use strict';function _getDefaults(){return{async:false,breaks:false,extensions:null,gfm:true,hooks:null,pedantic:false,renderer:null,silent:false,tokenizer:null,walkTokens:null};}exports.defaults=_getDefaults();function changeDefaults(newDefaults){exports.defaults=newDefaults;}const escapeTest=/[&<>"']/;const escapeReplace=new RegExp(escapeTest.source,'g');const escapeTestNoEncode=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/;const escapeReplaceNoEncode=new RegExp(escapeTestNoEncode.source,'g');const escapeReplacements={'&':'&','<':'<','>':'>','"':'"',"'":'''};const getEscapeReplacement=(ch)=>escapeReplacements[ch];function escape$1(html,encode){if (encode){if (escapeTest.test(html)){return html.replace(escapeReplace,getEscapeReplacement);}} else{if (escapeTestNoEncode.test(html)){return html.replace(escapeReplaceNoEncode,getEscapeReplacement);}}return html;}const unescapeTest=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function unescape(html){return html.replace(unescapeTest,(_,n)=>{n=n.toLowerCase();if (n==='colon')return ':';if (n.charAt(0)==='#'){return n.charAt(1)==='x'?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1));}return '';});}const caret=/(^|[^\[])\^/g;function edit(regex,opt){let source=typeof regex==='string'?regex:regex.source;opt=opt||'';const obj={replace:(name,val)=>{let valSource=typeof val==='string'?val:val.source;valSource=valSource.replace(caret,'$1');source=source.replace(name,valSource);return obj;},getRegex:()=>{return new RegExp(source,opt);}};return obj;}function cleanUrl(href){try{href=encodeURI(href).replace(/%25/g,'%');} catch (e){return null;}return href;}const noopTest={exec:()=>null};function splitCells(tableRow,count){const row=tableRow.replace(/\|/g,(match,offset,str)=>{let escaped=false;let curr=offset;while (--curr>=0&&str[curr]==='\\')escaped=!escaped;if (escaped){return '|';} else{return '|';}}),cells=row.split(/\|/);let i=0;if (!cells[0].trim()){cells.shift();}if (cells.length>0&&!cells[cells.length-1].trim()){cells.pop();}if (count){if (cells.length>count){cells.splice(count);} else{while (cells.length<count)cells.push('');}}for (;i<cells.length;i++){cells[i]=cells[i].trim().replace(/\\\|/g,'|');}return cells;}function rtrim(str,c,invert){const l=str.length;if (l===0){return '';}let suffLen=0;while (suffLen<l){const currChar=str.charAt(l-suffLen-1);if (currChar===c&&!invert){suffLen++;} else if (currChar!==c&&invert){suffLen++;} else{break;}}return str.slice(0,l-suffLen);}function findClosingBracket(str,b){if (str.indexOf(b[1])===-1){return-1;}let level=0;for (let i=0;i<str.length;i++){if (str[i]==='\\'){i++;} else if (str[i]===b[0]){level++;} else if (str[i]===b[1]){level--;if (level<0){return i;}}}return-1;}function outputLink(cap,link,raw,lexer){const href=link.href;const title=link.title?escape$1(link.title):null;const text=cap[1].replace(/\\([\[\]])/g,'$1');if (cap[0].charAt(0)!=='!'){lexer.state.inLink=true;const token={type:'link',raw,href,title,text,tokens:lexer.inlineTokens(text)};lexer.state.inLink=false;return token;}return{type:'image',raw,href,title,text:escape$1(text)};}function indentCodeCompensation(raw,text){const matchIndentToCode=raw.match(/^(\s+)(?:```)/);if (matchIndentToCode===null){return text;}const indentToCode=matchIndentToCode[1];return text .split('\n').map(node=>{const matchIndentInNode=node.match(/^\s+/);if (matchIndentInNode===null){return node;}const [indentInNode]=matchIndentInNode;if (indentInNode.length>=indentToCode.length){return node.slice(indentToCode.length);}return node;}).join('\n');}class _Tokenizer{options;rules;lexer;constructor(options){this.options=options||exports.defaults;}space(src){const cap=this.rules.block.newline.exec(src);if (cap&&cap[0].length>0){return{type:'space',raw:cap[0]};}}code(src){const cap=this.rules.block.code.exec(src);if (cap){const text=cap[0].replace(/^{1,4}/gm,'');return{type:'code',raw:cap[0],codeBlockStyle:'indented',text:!this.options.pedantic?rtrim(text,'\n'):text};}}fences(src){const cap=this.rules.block.fences.exec(src);if (cap){const raw=cap[0];const text=indentCodeCompensation(raw,cap[3]||'');return{type:'code',raw,lang:cap[2]?cap[2].trim().replace(this.rules.inline.anyPunctuation,'$1'):cap[2],text};}}heading(src){const cap=this.rules.block.heading.exec(src);if (cap){let text=cap[2].trim();if (/#$/.test(text)){const trimmed=rtrim(text,'#');if (this.options.pedantic){text=trimmed.trim();} else if (!trimmed||/$/.test(trimmed)){text=trimmed.trim();}}return{type:'heading',raw:cap[0],depth:cap[1].length,text,tokens:this.lexer.inline(text)};}}hr(src){const cap=this.rules.block.hr.exec(src);if (cap){return{type:'hr',raw:cap[0]};}}blockquote(src){const cap=this.rules.block.blockquote.exec(src);if (cap){const text=rtrim(cap[0].replace(/^*>[ \t]?/gm,''),'\n');const top=this.lexer.state.top;this.lexer.state.top=true;const tokens=this.lexer.blockTokens(text);this.lexer.state.top=top;return{type:'blockquote',raw:cap[0],tokens,text};}}list(src){let cap=this.rules.block.list.exec(src);if (cap){let bull=cap[1].trim();const isordered=bull.length>1;const list={type:'list',raw:'',ordered:isordered,start:isordered?+bull.slice(0,-1):'',loose:false,items:[]};bull=isordered?`\\d{1,9}\\${bull.slice(-1)}`:`\\${bull}`;if (this.options.pedantic){bull=isordered?bull:'[*+-]';}const itemRegex=new RegExp(`^({0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`);let raw='';let itemContents='';let endsWithBlankLine=false;while (src){let endEarly=false;if (!(cap=itemRegex.exec(src))){break;}if (this.rules.block.hr.test(src)){break;}raw=cap[0];src=src.substring(raw.length);let line=cap[2].split('\n',1)[0].replace(/^\t+/,(t)=>' '.repeat(3*t.length));let nextLine=src.split('\n',1)[0];let indent=0;if (this.options.pedantic){indent=2;itemContents=line.trimStart();} else{indent=cap[2].search(/[^ ]/);indent=indent>4?1:indent;itemContents=line.slice(indent);indent+=cap[1].length;}let blankLine=false;if (!line&&/^*$/.test(nextLine)){raw+=nextLine+'\n';src=src.substring(nextLine.length+1);endEarly=true;}if (!endEarly){const nextBulletRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`);const hrRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}((?:-*){3,}|(?:_*){3,}|(?:\\**){3,})(?:\\n+|$)`);const fencesBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}(?:\`\`\`|~~~)`);const headingBeginRegex=new RegExp(`^{0,${Math.min(3,indent-1)}}#`);while (src){const rawLine=src.split('\n',1)[0];nextLine=rawLine;if (this.options.pedantic){nextLine=nextLine.replace(/^{1,4}(?=({4})*[^ ])/g,' ');}if (fencesBeginRegex.test(nextLine)){break;}if (headingBeginRegex.test(nextLine)){break;}if (nextBulletRegex.test(nextLine)){break;}if (hrRegex.test(src)){break;}if (nextLine.search(/[^ ]/)>=indent||!nextLine.trim()){itemContents+='\n'+nextLine.slice(indent);} else{if (blankLine){break;}if (line.search(/[^ ]/)>=4){break;}if (fencesBeginRegex.test(line)){break;}if (headingBeginRegex.test(line)){break;}if (hrRegex.test(line)){break;}itemContents+='\n'+nextLine;}if (!blankLine&&!nextLine.trim()){blankLine=true;}raw+=rawLine+'\n';src=src.substring(rawLine.length+1);line=nextLine.slice(indent);}}if (!list.loose){if (endsWithBlankLine){list.loose=true;} else if (/\n*\n*$/.test(raw)){endsWithBlankLine=true;}}let istask=null;let ischecked;if (this.options.gfm){istask=/^\[[ xX]\]/.exec(itemContents);if (istask){ischecked=istask[0]!=='[ ] ';itemContents=itemContents.replace(/^\[[ xX]\]+/,'');}}list.items.push({type:'list_item',raw,task:!!istask,checked:ischecked,loose:false,text:itemContents,tokens:[]});list.raw+=raw;}list.items[list.items.length-1].raw=raw.trimEnd();(list.items[list.items.length-1]).text=itemContents.trimEnd();list.raw=list.raw.trimEnd();for (let i=0;i<list.items.length;i++){this.lexer.state.top=false;list.items[i].tokens=this.lexer.blockTokens(list.items[i].text,[]);if (!list.loose){const spacers=list.items[i].tokens.filter(t=>t.type==='space');const hasMultipleLineBreaks=spacers.length>0&&spacers.some(t=>/\n.*\n/.test(t.raw));list.loose=hasMultipleLineBreaks;}}if (list.loose){for (let i=0;i<list.items.length;i++){list.items[i].loose=true;}}return list;}}html(src){const cap=this.rules.block.html.exec(src);if (cap){const token={type:'html',block:true,raw:cap[0],pre:cap[1]==='pre'||cap[1]==='script'||cap[1]==='style',text:cap[0]};return token;}}def(src){const cap=this.rules.block.def.exec(src);if (cap){const tag=cap[1].toLowerCase().replace(/\s+/g,' ');const href=cap[2]?cap[2].replace(/^<(.*)>$/,'$1').replace(this.rules.inline.anyPunctuation,'$1'):'';const title=cap[3]?cap[3].substring(1,cap[3].length-1).replace(this.rules.inline.anyPunctuation,'$1'):cap[3];return{type:'def',tag,raw:cap[0],href,title};}}table(src){const cap=this.rules.block.table.exec(src);if (!cap){return;}if (!/[:|]/.test(cap[2])){return;}const headers=splitCells(cap[1]);const aligns=cap[2].replace(/^\||\|*$/g,'').split('|');const rows=cap[3]&&cap[3].trim()?cap[3].replace(/\n[ \t]*$/,'').split('\n'):[];const item={type:'table',raw:cap[0],header:[],align:[],rows:[]};if (headers.length!==aligns.length){return;}for (const align of aligns){if (/^*-+:*$/.test(align)){item.align.push('right');} else if (/^*:-+:*$/.test(align)){item.align.push('center');} else if (/^*:-+*$/.test(align)){item.align.push('left');} else{item.align.push(null);}}for (const header of headers){item.header.push({text:header,tokens:this.lexer.inline(header)});}for (const row of rows){item.rows.push(splitCells(row,item.header.length).map(cell=>{return{text:cell,tokens:this.lexer.inline(cell)};}));}return item;}lheading(src){const cap=this.rules.block.lheading.exec(src);if (cap){return{type:'heading',raw:cap[0],depth:cap[2].charAt(0)==='='?1:2,text:cap[1],tokens:this.lexer.inline(cap[1])};}}paragraph(src){const cap=this.rules.block.paragraph.exec(src);if (cap){const text=cap[1].charAt(cap[1].length-1)==='\n'?cap[1].slice(0,-1):cap[1];return{type:'paragraph',raw:cap[0],text,tokens:this.lexer.inline(text)};}}text(src){const cap=this.rules.block.text.exec(src);if (cap){return{type:'text',raw:cap[0],text:cap[0],tokens:this.lexer.inline(cap[0])};}}escape(src){const cap=this.rules.inline.escape.exec(src);if (cap){return{type:'escape',raw:cap[0],text:escape$1(cap[1])};}}tag(src){const cap=this.rules.inline.tag.exec(src);if (cap){if (!this.lexer.state.inLink&&/^<a/i.test(cap[0])){this.lexer.state.inLink=true;} else if (this.lexer.state.inLink&&/^<\/a>/i.test(cap[0])){this.lexer.state.inLink=false;}if (!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=true;} else if (this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])){this.lexer.state.inRawBlock=false;}return{type:'html',raw:cap[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:false,text:cap[0]};}}link(src){const cap=this.rules.inline.link.exec(src);if (cap){const trimmedUrl=cap[2].trim();if (!this.options.pedantic&&/^</.test(trimmedUrl)){if (!(/>$/.test(trimmedUrl))){return;}const rtrimSlash=rtrim(trimmedUrl.slice(0,-1),'\\');if ((trimmedUrl.length-rtrimSlash.length)%2===0){return;}} else{const lastParenIndex=findClosingBracket(cap[2],'()');if (lastParenIndex>-1){const start=cap[0].indexOf('!')===0?5:4;const linkLen=start+cap[1].length+lastParenIndex;cap[2]=cap[2].substring(0,lastParenIndex);cap[0]=cap[0].substring(0,linkLen).trim();cap[3]='';}}let href=cap[2];let title='';if (this.options.pedantic){const link=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);if (link){href=link[1];title=link[3];}} else{title=cap[3]?cap[3].slice(1,-1):'';}href=href.trim();if (/^</.test(href)){if (this.options.pedantic&&!(/>$/.test(trimmedUrl))){href=href.slice(1);} else{href=href.slice(1,-1);}}return outputLink(cap,{href:href?href.replace(this.rules.inline.anyPunctuation,'$1'):href,title:title?title.replace(this.rules.inline.anyPunctuation,'$1'):title},cap[0],this.lexer);}}reflink(src,links){let cap;if ((cap=this.rules.inline.reflink.exec(src))||(cap=this.rules.inline.nolink.exec(src))){const linkString=(cap[2]||cap[1]).replace(/\s+/g,' ');const link=links[linkString.toLowerCase()];if (!link){const text=cap[0].charAt(0);return{type:'text',raw:text,text};}return outputLink(cap,link,cap[0],this.lexer);}}emStrong(src,maskedSrc,prevChar=''){let match=this.rules.inline.emStrongLDelim.exec(src);if (!match)return;if (match[3]&&prevChar.match(/[\p{L}\p{N}]/u))return;const nextChar=match[1]||match[2]||'';if (!nextChar||!prevChar||this.rules.inline.punctuation.exec(prevChar)){const lLength=[...match[0]].length-1;let rDelim,rLength,delimTotal=lLength,midDelimTotal=0;const endReg=match[0][0]==='*'?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;endReg.lastIndex=0;maskedSrc=maskedSrc.slice(-1*src.length+lLength);while ((match=endReg.exec(maskedSrc))!=null){rDelim=match[1]||match[2]||match[3]||match[4]||match[5]||match[6];if (!rDelim)continue;rLength=[...rDelim].length;if (match[3]||match[4]){delimTotal+=rLength;continue;} else if (match[5]||match[6]){if (lLength%3&&!((lLength+rLength)%3)){midDelimTotal+=rLength;continue;}}delimTotal-=rLength;if (delimTotal>0)continue;rLength=Math.min(rLength,rLength+delimTotal+midDelimTotal);const lastCharLength=[...match[0]][0].length;const raw=src.slice(0,lLength+match.index+lastCharLength+rLength);if (Math.min(lLength,rLength)%2){const text=raw.slice(1,-1);return{type:'em',raw,text,tokens:this.lexer.inlineTokens(text)};}const text=raw.slice(2,-2);return{type:'strong',raw,text,tokens:this.lexer.inlineTokens(text)};}}}codespan(src){const cap=this.rules.inline.code.exec(src);if (cap){let text=cap[2].replace(/\n/g,' ');const hasNonSpaceChars=/[^ ]/.test(text);const hasSpaceCharsOnBothEnds=/^/.test(text)&&/$/.test(text);if (hasNonSpaceChars&&hasSpaceCharsOnBothEnds){text=text.substring(1,text.length-1);}text=escape$1(text,true);return{type:'codespan',raw:cap[0],text};}}br(src){const cap=this.rules.inline.br.exec(src);if (cap){return{type:'br',raw:cap[0]};}}del(src){const cap=this.rules.inline.del.exec(src);if (cap){return{type:'del',raw:cap[0],text:cap[2],tokens:this.lexer.inlineTokens(cap[2])};}}autolink(src){const cap=this.rules.inline.autolink.exec(src);if (cap){let text,href;if (cap[2]==='@'){text=escape$1(cap[1]);href='mailto:'+text;} else{text=escape$1(cap[1]);href=text;}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}url(src){let cap;if (cap=this.rules.inline.url.exec(src)){let text,href;if (cap[2]==='@'){text=escape$1(cap[0]);href='mailto:'+text;} else{let prevCapZero;do{prevCapZero=cap[0];cap[0]=this.rules.inline._backpedal.exec(cap[0])?.[0]??'';}while (prevCapZero!==cap[0]);text=escape$1(cap[0]);if (cap[1]==='www.'){href='http:} else{href=cap[0];}}return{type:'link',raw:cap[0],text,href,tokens:[{type:'text',raw:text,text}]};}}inlineText(src){const cap=this.rules.inline.text.exec(src);if (cap){let text;if (this.lexer.state.inRawBlock){text=cap[0];} else{text=escape$1(cap[0]);}return{type:'text',raw:cap[0],text};}}}const newline=/^(?:*(?:\n|$))+/;const blockCode=/^({4}[^\n]+(?:\n(?:*(?:\n|$))*)?)+/;const fences=/^{0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?:{0,3}\1[~`]**(?=\n|$)|$)/;const hr=/^{0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;const heading=/^{0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;const bullet=/(?:[*+-]|\d{1,9}[.)])/;const lheading=edit(/^(?!bull)((?:.|\n(?!\s*?\n|bull))+?)\n{0,3}(=+|-+)*(?:\n+|$)/).replace(/bull/g,bullet).getRegex();const _paragraph=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|+\n)[^\n]+)*)/;const blockText=/^[^\n]+/;const _blockLabel=/(?!\s*\])(?:\\.|[^\[\]\\])+/;const def=edit(/^{0,3}\[(label)\]:*(?:\n*)?([^<\s][^\s]*|<.*?>)(?:(?:+(?:\n*)?|*\n*)(title))?*(?:\n+|$)/).replace('label',_blockLabel).replace('title',/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();const list=edit(/^({0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,bullet).getRegex();const _tag='address|article|aside|base|basefont|blockquote|body|caption'+'|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'+'|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'+'|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'+'|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'+'|track|ul';const _comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/;const html=edit('^{0,3}(?:'+'<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)'+'|comment[^\\n]*(\\n+|$)'+'|<\\?[\\s\\S]*?(?:\\?>\\n*|$)'+'|<![A-Z][\\s\\S]*?(?:>\\n*|$)'+'|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)'+'|</?(tag)(?:+|\\n|/?>)[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*?*/?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+'|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n*)+\\n|$)'+')','i').replace('comment',_comment).replace('tag',_tag).replace('attribute',/+[a-zA-Z:_][\w.:-]*(?:*=*"[^"\n]*"|*=*'[^'\n]*'|*=*[^\s"'=<>`]+)?/).getRegex();const paragraph=edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('|table','').replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockquote=edit(/^({0,3}>?(paragraph|[^\n]*)(?:\n|$))+/).replace('paragraph',paragraph).getRegex();const blockNormal={blockquote,code:blockCode,def,fences,heading,hr,html,lheading,list,newline,paragraph,table:noopTest,text:blockText};const gfmTable=edit('^*([^\\n ].*)\\n'+'{0,3}((?:\\|*)?:?-+:?*(?:\\|*:?-+:?*)*(?:\\|*)?)'+'(?:\\n((?:(?!*\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)').replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('blockquote','{0,3}>').replace('code','{4}[^\\n]').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex();const blockGfm={...blockNormal,table:gfmTable,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','{0,3}#{1,6}(?:\\s|$)').replace('|lheading','').replace('table',gfmTable).replace('blockquote','{0,3}>').replace('fences','{0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list','{0,3}(?:[*+-]|1[.)])').replace('html','</?(?:tag)(?:+|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag',_tag).getRegex()};const blockPedantic={...blockNormal,html:edit('^*(?:comment*(?:\\n|\\s*$)'+'|<(tag)[\\s\\S]+?</\\1>*(?:\\n{2,}|\\s*$)'+'|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?>*(?:\\n{2,}|\\s*$))').replace('comment',_comment).replace(/tag/g,'(?!(?:'+'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'+'|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'+'\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),def:/^*\[([^\]]+)\]:*<?([^\s>]+)>?(?:+(["(][^\n]+[")]))?*(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:noopTest,lheading:/^(.+?)\n{0,3}(=+|-+)*(?:\n+|$)/,paragraph:edit(_paragraph).replace('hr',hr).replace('heading','*#{1,6}*[^\n]').replace('lheading',lheading).replace('|table','').replace('blockquote','{0,3}>').replace('|fences','').replace('|list','').replace('|html','').replace('|tag','').getRegex()};const escape=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;const inlineCode=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;const br=/^({2,}|\\)\n(?!\s*$)/;const inlineText=/^(`+|[^`])(?:(?={2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?={2,}\n)))/;const _punctuation='\\p{P}$+<=>`^|~';const punctuation=edit(/^((?![*_])[\spunctuation])/,'u').replace(/punctuation/g,_punctuation).getRegex();const blockSkip=/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g;const emStrongLDelim=edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,'u').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimAst=edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)'+'|[^*]+(?=[^*])'+'|(?!\\*)[punct](\\*+)(?=[\\s]|$)'+'|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)'+'|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])'+'|[\\s](\\*+)(?!\\*)(?=[punct])'+'|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])'+'|[^punct\\s](\\*+)(?=[^punct\\s])','gu').replace(/punct/g,_punctuation).getRegex();const emStrongRDelimUnd=edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)'+'|[^_]+(?=[^_])'+'|(?!_)[punct](_+)(?=[\\s]|$)'+'|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)'+'|(?!_)[punct\\s](_+)(?=[^punct\\s])'+'|[\\s](_+)(?!_)(?=[punct])'+'|(?!_)[punct](_+)(?!_)(?=[punct])','gu').replace(/punct/g,_punctuation).getRegex();const anyPunctuation=edit(/\\([punct])/,'gu').replace(/punct/g,_punctuation).getRegex();const autolink=edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace('scheme',/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace('email',/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();const _inlineComment=edit(_comment).replace('(?:-->|$)','-->').getRegex();const tag=edit('^comment'+'|^</[a-zA-Z][\\w:-]*\\s*>'+'|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>'+'|^<\\?[\\s\\S]*?\\?>'+'|^<![a-zA-Z]+\\s[\\s\\S]*?>'+'|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>').replace('comment',_inlineComment).replace('attribute',/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();const _inlineLabel=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;const link=edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace('label',_inlineLabel).replace('href',/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace('title',/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();const reflink=edit(/^!?\[(label)\]\[(ref)\]/).replace('label',_inlineLabel).replace('ref',_blockLabel).getRegex();const nolink=edit(/^!?\[(ref)\](?:\[\])?/).replace('ref',_blockLabel).getRegex();const reflinkSearch=edit('reflink|nolink(?!\\()','g').replace('reflink',reflink).replace('nolink',nolink).getRegex();const inlineNormal={_backpedal:noopTest,anyPunctuation,autolink,blockSkip,br,code:inlineCode,del:noopTest,emStrongLDelim,emStrongRDelimAst,emStrongRDelimUnd,escape,link,nolink,punctuation,reflink,reflinkSearch,tag,text:inlineText,url:noopTest};const inlinePedantic={...inlineNormal,link:edit(/^!?\[(label)\]\((.*?)\)/).replace('label',_inlineLabel).getRegex(),reflink:edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label',_inlineLabel).getRegex()};const inlineGfm={...inlineNormal,escape:edit(escape).replace('])','~|])').getRegex(),url:edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,'i').replace('email',/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?={2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?={2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/};const inlineBreaks={...inlineGfm,br:edit(br).replace('{2,}','*').getRegex(),text:edit(inlineGfm.text).replace('\\b_','\\b_|{2,}\\n').replace(/\{2,\}/g,'*').getRegex()};const block={normal:blockNormal,gfm:blockGfm,pedantic:blockPedantic};const inline={normal:inlineNormal,gfm:inlineGfm,breaks:inlineBreaks,pedantic:inlinePedantic};class _Lexer{tokens;options;state;tokenizer;inlineQueue;constructor(options){this.tokens=[];this.tokens.links=Object.create(null);this.options=options||exports.defaults;this.options.tokenizer=this.options.tokenizer||new _Tokenizer();this.tokenizer=this.options.tokenizer;this.tokenizer.options=this.options;this.tokenizer.lexer=this;this.inlineQueue=[];this.state={inLink:false,inRawBlock:false,top:true};const rules={block:block.normal,inline:inline.normal};if (this.options.pedantic){rules.block=block.pedantic;rules.inline=inline.pedantic;} else if (this.options.gfm){rules.block=block.gfm;if (this.options.breaks){rules.inline=inline.breaks;} else{rules.inline=inline.gfm;}}this.tokenizer.rules=rules;}static get rules(){return{block,inline};}static lex(src,options){const lexer=new _Lexer(options);return lexer.lex(src);}static lexInline(src,options){const lexer=new _Lexer(options);return lexer.inlineTokens(src);}lex(src){src=src .replace(/\r\n|\r/g,'\n');this.blockTokens(src,this.tokens);for (let i=0;i<this.inlineQueue.length;i++){const next=this.inlineQueue[i];this.inlineTokens(next.src,next.tokens);}this.inlineQueue=[];return this.tokens;}blockTokens(src,tokens=[]){if (this.options.pedantic){src=src.replace(/\t/g,' ').replace(/^+$/gm,'');} else{src=src.replace(/^(*)(\t+)/gm,(_,leading,tabs)=>{return leading+' '.repeat(tabs.length);});}let token;let lastToken;let cutSrc;let lastParagraphClipped;while (src){if (this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.space(src)){src=src.substring(token.raw.length);if (token.raw.length===1&&tokens.length>0){tokens[tokens.length-1].raw+='\n';} else{tokens.push(token);}continue;}if (token=this.tokenizer.code(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.fences(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.heading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.hr(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.blockquote(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.list(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.html(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.def(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&(lastToken.type==='paragraph'||lastToken.type==='text')){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.raw;this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else if (!this.tokens.links[token.tag]){this.tokens.links[token.tag]={href:token.href,title:token.title};}continue;}if (token=this.tokenizer.table(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.lheading(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startBlock){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startBlock.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (this.state.top&&(token=this.tokenizer.paragraph(cutSrc))){lastToken=tokens[tokens.length-1];if (lastParagraphClipped&&lastToken.type==='paragraph'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}lastParagraphClipped=(cutSrc.length!==src.length);src=src.substring(token.raw.length);continue;}if (token=this.tokenizer.text(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+='\n'+token.raw;lastToken.text+='\n'+token.text;this.inlineQueue.pop();this.inlineQueue[this.inlineQueue.length-1].src=lastToken.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}this.state.top=true;return tokens;}inline(src,tokens=[]){this.inlineQueue.push({src,tokens});return tokens;}inlineTokens(src,tokens=[]){let token,lastToken,cutSrc;let maskedSrc=src;let match;let keepPrevChar,prevChar;if (this.tokens.links){const links=Object.keys(this.tokens.links);if (links.length>0){while ((match=this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc))!=null){if (links.includes(match[0].slice(match[0].lastIndexOf('[')+1,-1))){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);}}}}while ((match=this.tokenizer.rules.inline.blockSkip.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'['+'a'.repeat(match[0].length-2)+']'+maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);}while ((match=this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc))!=null){maskedSrc=maskedSrc.slice(0,match.index)+'++'+maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);}while (src){if (!keepPrevChar){prevChar='';}keepPrevChar=false;if (this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((extTokenizer)=>{if (token=extTokenizer.call({lexer:this},src,tokens)){src=src.substring(token.raw.length);tokens.push(token);return true;}return false;})){continue;}if (token=this.tokenizer.escape(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.tag(src)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.link(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.reflink(src,this.tokens.links)){src=src.substring(token.raw.length);lastToken=tokens[tokens.length-1];if (lastToken&&token.type==='text'&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (token=this.tokenizer.emStrong(src,maskedSrc,prevChar)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.codespan(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.br(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.del(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (token=this.tokenizer.autolink(src)){src=src.substring(token.raw.length);tokens.push(token);continue;}if (!this.state.inLink&&(token=this.tokenizer.url(src))){src=src.substring(token.raw.length);tokens.push(token);continue;}cutSrc=src;if (this.options.extensions&&this.options.extensions.startInline){let startIndex=Infinity;const tempSrc=src.slice(1);let tempStart;this.options.extensions.startInline.forEach((getStartIndex)=>{tempStart=getStartIndex.call({lexer:this},tempSrc);if (typeof tempStart==='number'&&tempStart>=0){startIndex=Math.min(startIndex,tempStart);}});if (startIndex<Infinity&&startIndex>=0){cutSrc=src.substring(0,startIndex+1);}}if (token=this.tokenizer.inlineText(cutSrc)){src=src.substring(token.raw.length);if (token.raw.slice(-1)!=='_'){prevChar=token.raw.slice(-1);}keepPrevChar=true;lastToken=tokens[tokens.length-1];if (lastToken&&lastToken.type==='text'){lastToken.raw+=token.raw;lastToken.text+=token.text;} else{tokens.push(token);}continue;}if (src){const errMsg='Infinite loop on byte:'+src.charCodeAt(0);if (this.options.silent){console.error(errMsg);break;} else{throw new Error(errMsg);}}}return tokens;}}class _Renderer{options;constructor(options){this.options=options||exports.defaults;}code(code,infostring,escaped){const lang=(infostring||'').match(/^\S*/)?.[0];code=code.replace(/\n$/,'')+'\n';if (!lang){return '<pre><code>'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}return '<pre><code class="language-'+escape$1(lang)+'">'+(escaped?code:escape$1(code,true))+'</code></pre>\n';}blockquote(quote){return `<blockquote>\n${quote}</blockquote>\n`;}html(html,block){return html;}heading(text,level,raw){return `<h${level}>${text}</h${level}>\n`;}hr(){return '<hr>\n';}list(body,ordered,start){const type=ordered?'ol':'ul';const startatt=(ordered&&start!==1)?(' start="'+start+'"'):'';return '<'+type+startatt+'>\n'+body+'</'+type+'>\n';}listitem(text,task,checked){return `<li>${text}</li>\n`;}checkbox(checked){return '<input '+(checked?'checked="" ':'')+'disabled="" type="checkbox">';}paragraph(text){return `<p>${text}</p>\n`;}table(header,body){if (body)body=`<tbody>${body}</tbody>`;return '<table>\n'+'<thead>\n'+header+'</thead>\n'+body+'</table>\n';}tablerow(content){return `<tr>\n${content}</tr>\n`;}tablecell(content,flags){const type=flags.header?'th':'td';const tag=flags.align?`<${type}align="${flags.align}">`:`<${type}>`;return tag+content+`</${type}>\n`;}strong(text){return `<strong>${text}</strong>`;}em(text){return `<em>${text}</em>`;}codespan(text){return `<code>${text}</code>`;}br(){return '<br>';}del(text){return `<del>${text}</del>`;}link(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out='<a href="'+href+'"';if (title){out+=' title="'+title+'"';}out+='>'+text+'</a>';return out;}image(href,title,text){const cleanHref=cleanUrl(href);if (cleanHref===null){return text;}href=cleanHref;let out=`<img src="${href}" alt="${text}"`;if (title){out+=` title="${title}"`;}out+='>';return out;}text(text){return text;}}class _TextRenderer{strong(text){return text;}em(text){return text;}codespan(text){return text;}del(text){return text;}html(text){return text;}text(text){return text;}link(href,title,text){return ''+text;}image(href,title,text){return ''+text;}br(){return '';}}class _Parser{options;renderer;textRenderer;constructor(options){this.options=options||exports.defaults;this.options.renderer=this.options.renderer||new _Renderer();this.renderer=this.options.renderer;this.renderer.options=this.options;this.textRenderer=new _TextRenderer();}static parse(tokens,options){const parser=new _Parser(options);return parser.parse(tokens);}static parseInline(tokens,options){const parser=new _Parser(options);return parser.parseInline(tokens);}parse(tokens,top=true){let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const genericToken=token;const ret=this.options.extensions.renderers[genericToken.type].call({parser:this},genericToken);if (ret!==false||!['space','hr','heading','code','table','blockquote','list','html','paragraph','text'].includes(genericToken.type)){out+=ret||'';continue;}}switch (token.type){case 'space':{continue;}case 'hr':{out+=this.renderer.hr();continue;}case 'heading':{const headingToken=token;out+=this.renderer.heading(this.parseInline(headingToken.tokens),headingToken.depth,unescape(this.parseInline(headingToken.tokens,this.textRenderer)));continue;}case 'code':{const codeToken=token;out+=this.renderer.code(codeToken.text,codeToken.lang,!!codeToken.escaped);continue;}case 'table':{const tableToken=token;let header='';let cell='';for (let j=0;j<tableToken.header.length;j++){cell+=this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens),{header:true,align:tableToken.align[j]});}header+=this.renderer.tablerow(cell);let body='';for (let j=0;j<tableToken.rows.length;j++){const row=tableToken.rows[j];cell='';for (let k=0;k<row.length;k++){cell+=this.renderer.tablecell(this.parseInline(row[k].tokens),{header:false,align:tableToken.align[k]});}body+=this.renderer.tablerow(cell);}out+=this.renderer.table(header,body);continue;}case 'blockquote':{const blockquoteToken=token;const body=this.parse(blockquoteToken.tokens);out+=this.renderer.blockquote(body);continue;}case 'list':{const listToken=token;const ordered=listToken.ordered;const start=listToken.start;const loose=listToken.loose;let body='';for (let j=0;j<listToken.items.length;j++){const item=listToken.items[j];const checked=item.checked;const task=item.task;let itemBody='';if (item.task){const checkbox=this.renderer.checkbox(!!checked);if (loose){if (item.tokens.length>0&&item.tokens[0].type==='paragraph'){item.tokens[0].text=checkbox+' '+item.tokens[0].text;if (item.tokens[0].tokens&&item.tokens[0].tokens.length>0&&item.tokens[0].tokens[0].type==='text'){item.tokens[0].tokens[0].text=checkbox+' '+item.tokens[0].tokens[0].text;}} else{item.tokens.unshift({type:'text',text:checkbox+' '});}} else{itemBody+=checkbox+' ';}}itemBody+=this.parse(item.tokens,loose);body+=this.renderer.listitem(itemBody,task,!!checked);}out+=this.renderer.list(body,ordered,start);continue;}case 'html':{const htmlToken=token;out+=this.renderer.html(htmlToken.text,htmlToken.block);continue;}case 'paragraph':{const paragraphToken=token;out+=this.renderer.paragraph(this.parseInline(paragraphToken.tokens));continue;}case 'text':{let textToken=token;let body=textToken.tokens?this.parseInline(textToken.tokens):textToken.text;while (i+1<tokens.length&&tokens[i+1].type==='text'){textToken=tokens[++i];body+='\n'+(textToken.tokens?this.parseInline(textToken.tokens):textToken.text);}out+=top?this.renderer.paragraph(body):body;continue;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}parseInline(tokens,renderer){renderer=renderer||this.renderer;let out='';for (let i=0;i<tokens.length;i++){const token=tokens[i];if (this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[token.type]){const ret=this.options.extensions.renderers[token.type].call({parser:this},token);if (ret!==false||!['escape','html','link','image','strong','em','codespan','br','del','text'].includes(token.type)){out+=ret||'';continue;}}switch (token.type){case 'escape':{const escapeToken=token;out+=renderer.text(escapeToken.text);break;}case 'html':{const tagToken=token;out+=renderer.html(tagToken.text);break;}case 'link':{const linkToken=token;out+=renderer.link(linkToken.href,linkToken.title,this.parseInline(linkToken.tokens,renderer));break;}case 'image':{const imageToken=token;out+=renderer.image(imageToken.href,imageToken.title,imageToken.text);break;}case 'strong':{const strongToken=token;out+=renderer.strong(this.parseInline(strongToken.tokens,renderer));break;}case 'em':{const emToken=token;out+=renderer.em(this.parseInline(emToken.tokens,renderer));break;}case 'codespan':{const codespanToken=token;out+=renderer.codespan(codespanToken.text);break;}case 'br':{out+=renderer.br();break;}case 'del':{const delToken=token;out+=renderer.del(this.parseInline(delToken.tokens,renderer));break;}case 'text':{const textToken=token;out+=renderer.text(textToken.text);break;}default:{const errMsg='Token with "'+token.type+'" type was not found.';if (this.options.silent){console.error(errMsg);return '';} else{throw new Error(errMsg);}}}}return out;}}class _Hooks{options;constructor(options){this.options=options||exports.defaults;}static passThroughHooks=new Set([ 'preprocess','postprocess','processAllTokens' ]);preprocess(markdown){return markdown;}postprocess(html){return html;}processAllTokens(tokens){return tokens;}}class Marked{defaults=_getDefaults();options=this.setOptions;parse=this.#parseMarkdown(_Lexer.lex,_Parser.parse);parseInline=this.#parseMarkdown(_Lexer.lexInline,_Parser.parseInline);Parser=_Parser;Renderer=_Renderer;TextRenderer=_TextRenderer;Lexer=_Lexer;Tokenizer=_Tokenizer;Hooks=_Hooks;constructor(...args){this.use(...args);}walkTokens(tokens,callback){let values=[];for (const token of tokens){values=values.concat(callback.call(this,token));switch (token.type){case 'table':{const tableToken=token;for (const cell of tableToken.header){values=values.concat(this.walkTokens(cell.tokens,callback));}for (const row of tableToken.rows){for (const cell of row){values=values.concat(this.walkTokens(cell.tokens,callback));}}break;}case 'list':{const listToken=token;values=values.concat(this.walkTokens(listToken.items,callback));break;}default:{const genericToken=token;if (this.defaults.extensions?.childTokens?.[genericToken.type]){this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens)=>{const tokens=genericToken[childTokens].flat(Infinity);values=values.concat(this.walkTokens(tokens,callback));});} else if (genericToken.tokens){values=values.concat(this.walkTokens(genericToken.tokens,callback));}}}}return values;}use(...args){const extensions=this.defaults.extensions||{renderers:{},childTokens:{}};args.forEach((pack)=>{const opts={...pack};opts.async=this.defaults.async||opts.async||false;if (pack.extensions){pack.extensions.forEach((ext)=>{if (!ext.name){throw new Error('extension name required');}if ('renderer' in ext){const prevRenderer=extensions.renderers[ext.name];if (prevRenderer){extensions.renderers[ext.name]=function(...args){let ret=ext.renderer.apply(this,args);if (ret===false){ret=prevRenderer.apply(this,args);}return ret;};} else{extensions.renderers[ext.name]=ext.renderer;}}if ('tokenizer' in ext){if (!ext.level||(ext.level!=='block'&&ext.level!=='inline')){throw new Error("extension level must be 'block' or 'inline'");}const extLevel=extensions[ext.level];if (extLevel){extLevel.unshift(ext.tokenizer);} else{extensions[ext.level]=[ext.tokenizer];}if (ext.start){if (ext.level==='block'){if (extensions.startBlock){extensions.startBlock.push(ext.start);} else{extensions.startBlock=[ext.start];}} else if (ext.level==='inline'){if (extensions.startInline){extensions.startInline.push(ext.start);} else{extensions.startInline=[ext.start];}}}}if ('childTokens' in ext&&ext.childTokens){extensions.childTokens[ext.name]=ext.childTokens;}});opts.extensions=extensions;}if (pack.renderer){const renderer=this.defaults.renderer||new _Renderer(this.defaults);for (const prop in pack.renderer){if (!(prop in renderer)){throw new Error(`renderer '${prop}' does not exist`);}if (prop==='options'){continue;}const rendererProp=prop;const rendererFunc=pack.renderer[rendererProp];const prevRenderer=renderer[rendererProp];renderer[rendererProp]=(...args)=>{let ret=rendererFunc.apply(renderer,args);if (ret===false){ret=prevRenderer.apply(renderer,args);}return ret||'';};}opts.renderer=renderer;}if (pack.tokenizer){const tokenizer=this.defaults.tokenizer||new _Tokenizer(this.defaults);for (const prop in pack.tokenizer){if (!(prop in tokenizer)){throw new Error(`tokenizer '${prop}' does not exist`);}if (['options','rules','lexer'].includes(prop)){continue;}const tokenizerProp=prop;const tokenizerFunc=pack.tokenizer[tokenizerProp];const prevTokenizer=tokenizer[tokenizerProp];tokenizer[tokenizerProp]=(...args)=>{let ret=tokenizerFunc.apply(tokenizer,args);if (ret===false){ret=prevTokenizer.apply(tokenizer,args);}return ret;};}opts.tokenizer=tokenizer;}if (pack.hooks){const hooks=this.defaults.hooks||new _Hooks();for (const prop in pack.hooks){if (!(prop in hooks)){throw new Error(`hook '${prop}' does not exist`);}if (prop==='options'){continue;}const hooksProp=prop;const hooksFunc=pack.hooks[hooksProp];const prevHook=hooks[hooksProp];if (_Hooks.passThroughHooks.has(prop)){hooks[hooksProp]=(arg)=>{if (this.defaults.async){return Promise.resolve(hooksFunc.call(hooks,arg)).then(ret=>{return prevHook.call(hooks,ret);});}const ret=hooksFunc.call(hooks,arg);return prevHook.call(hooks,ret);};} else{hooks[hooksProp]=(...args)=>{let ret=hooksFunc.apply(hooks,args);if (ret===false){ret=prevHook.apply(hooks,args);}return ret;};}}opts.hooks=hooks;}if (pack.walkTokens){const walkTokens=this.defaults.walkTokens;const packWalktokens=pack.walkTokens;opts.walkTokens=function(token){let values=[];values.push(packWalktokens.call(this,token));if (walkTokens){values=values.concat(walkTokens.call(this,token));}return values;};}this.defaults={...this.defaults,...opts};});return this;}setOptions(opt){this.defaults={...this.defaults,...opt};return this;}lexer(src,options){return _Lexer.lex(src,options??this.defaults);}parser(tokens,options){return _Parser.parse(tokens,options??this.defaults);}#parseMarkdown(lexer,parser){return(src,options)=>{const origOpt={...options};const opt={...this.defaults,...origOpt};if (this.defaults.async===true&&origOpt.async===false){if (!opt.silent){console.warn('marked():The async option was set to true by an extension. The async:false option sent to parse will be ignored.');}opt.async=true;}const throwError=this.#onError(!!opt.silent,!!opt.async);if (typeof src==='undefined'||src===null){return throwError(new Error('marked():input parameter is undefined or null'));}if (typeof src!=='string'){return throwError(new Error('marked():input parameter is of type '+Object.prototype.toString.call(src)+',string expected'));}if (opt.hooks){opt.hooks.options=opt;}if (opt.async){return Promise.resolve(opt.hooks?opt.hooks.preprocess(src):src).then(src=>lexer(src,opt)).then(tokens=>opt.hooks?opt.hooks.processAllTokens(tokens):tokens).then(tokens=>opt.walkTokens?Promise.all(this.walkTokens(tokens,opt.walkTokens)).then(()=>tokens):tokens).then(tokens=>parser(tokens,opt)).then(html=>opt.hooks?opt.hooks.postprocess(html):html).catch (throwError);}try{if (opt.hooks){src=opt.hooks.preprocess(src);}let tokens=lexer(src,opt);if (opt.hooks){tokens=opt.hooks.processAllTokens(tokens);}if (opt.walkTokens){this.walkTokens(tokens,opt.walkTokens);}let html=parser(tokens,opt);if (opt.hooks){html=opt.hooks.postprocess(html);}return html;} catch (e){return throwError(e);}};}#onError(silent,async){return(e)=>{e.message+='\nPlease report this to https:if (silent){const msg='<p>An error occurred:</p><pre>'+escape$1(e.message+'',true)+'</pre>';if (async){return Promise.resolve(msg);}return msg;}if (async){return Promise.reject(e);}throw e;};}}const markedInstance=new Marked();function marked(src,opt){return markedInstance.parse(src,opt);}marked.options=marked.setOptions=function(options){markedInstance.setOptions(options);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.getDefaults=_getDefaults;marked.defaults=exports.defaults;marked.use=function(...args){markedInstance.use(...args);marked.defaults=markedInstance.defaults;changeDefaults(marked.defaults);return marked;};marked.walkTokens=function(tokens,callback){return markedInstance.walkTokens(tokens,callback);};marked.parseInline=markedInstance.parseInline;marked.Parser=_Parser;marked.parser=_Parser.parse;marked.Renderer=_Renderer;marked.TextRenderer=_TextRenderer;marked.Lexer=_Lexer;marked.lexer=_Lexer.lex;marked.Tokenizer=_Tokenizer;marked.Hooks=_Hooks;marked.parse=marked;const options=marked.options;const setOptions=marked.setOptions;const use=marked.use;const walkTokens=marked.walkTokens;const parseInline=marked.parseInline;const parse=marked;const parser=_Parser.parse;const lexer=_Lexer.lex;exports.Hooks=_Hooks;exports.Lexer=_Lexer;exports.Marked=Marked;exports.Parser=_Parser;exports.Renderer=_Renderer;exports.TextRenderer=_TextRenderer;exports.Tokenizer=_Tokenizer;exports.getDefaults=_getDefaults;exports.lexer=lexer;exports.marked=marked;exports.options=options;exports.parse=parse;exports.parseInline=parseInline;exports.parser=parser;exports.setOptions=setOptions;exports.use=use;exports.walkTokens=walkTokens;}));function formatDate(timestamp){const date=new Date(timestamp*1000);return date.toLocaleDateString('en-US',{year:'numeric',month:'short',day:'numeric'});}function calculateReadingTime(wordCountOrContent){if (!wordCountOrContent)return 'Unknown';const wordsPerMinute=200;let words;if (typeof wordCountOrContent==='number'){words=wordCountOrContent;if (words===0)return 'Unknown';} else{words=wordCountOrContent.trim().split(/\s+/).filter(w=>w.length>0).length;}const minutes=Math.ceil(words/wordsPerMinute);return `${minutes}min read`;}function truncate(text,maxLength=150){if (!text||text.length<=maxLength)return text;return text.substring(0,maxLength).trim()+'...';}function truncateBytes(text,maxBytes){if (!text||!maxBytes||maxBytes<=0)return text||'';const encoder=new TextEncoder();const bytes=encoder.encode(text);if (bytes.length<=maxBytes)return text;let lo=0,hi=text.length;while (lo<hi){const mid=Math.floor((lo+hi+1)/2);const slice=text.slice(0,mid);const len=encoder.encode(slice).length;if (len<=maxBytes)lo=mid;else hi=mid-1;}return text.slice(0,lo).trimEnd()+'...';}function escapeHtml(text){const div=document.createElement('div');div.textContent=text;return div.innerHTML;}function debounce(func,wait){let timeout;return function executedFunction(...args){const later=()=>{clearTimeout(timeout);func(...args);};clearTimeout(timeout);timeout=setTimeout(later,wait);};}class ContentGrowthAPI{constructor(config){this.apiKey=config.apiKey;this.baseUrl=config.baseUrl||'https:this.cache=new Map();this.cacheTTL=5*60*1000;}async fetchArticles(options={}){const{page=1,limit=12,tags=[],category}=options;const params=new URLSearchParams({page:page.toString(),limit:limit.toString()});if (tags.length>0){params.set('tag',tags.join(','));}if (category){params.set('category',category);}const url=`${this.baseUrl}/widget/articles?${params}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch articles:',error);throw error;}}async fetchArticle(uuid){const url=`${this.baseUrl}/widget/articles/${uuid}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article:',error);throw error;}}async fetchArticleBySlug(slug){const url=`${this.baseUrl}/widget/articles/slug/${slug}`;const cacheKey=url;const cached=this.getFromCache(cacheKey);if (cached){return cached;}try{const response=await fetch(url,{headers:{'X-API-Key':this.apiKey}});if (!response.ok){const errorText=await response.text();console.error('[ContentGrowthAPI] Error response body:',errorText);throw new Error(`API Error:${response.status}${response.statusText}`);}const data=await response.json();this.setCache(cacheKey,data);return data;} catch (error){console.error('[ContentGrowthAPI] Failed to fetch article by slug:',error);throw error;}}getFromCache(key){const cached=this.cache.get(key);if (!cached)return null;const now=Date.now();if (now-cached.timestamp>this.cacheTTL){this.cache.delete(key);return null;}return cached.data;}setCache(key,data){this.cache.set(key,{data,timestamp:Date.now()});}clearCache(){this.cache.clear();}}class ContentCard{constructor(article,options={}){this.article=article;this.displayMode=options.displayMode||'compact';this.viewerMode=options.viewerMode||'inline';this.externalUrlPattern=options.externalUrlPattern||'/article/{id}';this.externalTarget=options.externalTarget||'article-{id}';this.onExpand=options.onExpand||null;this.onClick=options.onClick||null;this.aiSummaryMaxBytes=options.aiSummaryMaxBytes;}render(){const layoutMode=this.displayMode==='expanded'?'expanded':'compact';if (this.viewerMode==='external'){const link=document.createElement('a');link.className=`cg-card cg-card--${this.displayMode}`;link.dataset.contentId=this.article.uuid;let url=this.externalUrlPattern .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);let target=this.externalTarget .replace('{id}',this.article.uuid).replace('{slug}',this.article.slug||this.article.uuid);link.href=url;link.target=target;link.rel='noopener';if (layoutMode==='compact'){link.innerHTML=this.renderCompact();} else{link.innerHTML=this.renderExpanded();}const expandBtn=link.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.preventDefault();e.stopPropagation();this.onExpand(this.article,link);});}return link;}const card=document.createElement('article');card.className=`cg-card cg-card--${this.displayMode}`;card.dataset.contentId=this.article.uuid;if (layoutMode==='compact'){card.innerHTML=this.renderCompact();} else{card.innerHTML=this.renderExpanded();}card.addEventListener('click',(e)=>{if (e.target.closest('.cg-expand-btn'))return;if (this.onClick){this.onClick(this.article);}});const expandBtn=card.querySelector('.cg-expand-btn');if (expandBtn&&this.onExpand){expandBtn.addEventListener('click',(e)=>{e.stopPropagation();this.onExpand(this.article,card);});}return card;}renderCompact(){const readingTime=calculateReadingTime(this.article.wordCount);return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn" aria-label="Show more" title="Show summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div><div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}renderExpanded(){const readingTime=calculateReadingTime(this.article.wordCount);const summaryFull=this.article.summary||'';const summary=this.aiSummaryMaxBytes?truncateBytes(summaryFull,this.aiSummaryMaxBytes):summaryFull;const tags=this.article.tags||[];return `<div class="cg-card-header"><h3 class="cg-card-title">${escapeHtml(this.article.title)}</h3><button class="cg-expand-btn cg-expand-btn--collapse" aria-label="Show less" title="Hide summary"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M12 10L8 6L4 10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div>${summary?`<div class="cg-card-summary"><p>${escapeHtml(summary)}</p></div>`:''}${tags.length>0?`<div class="cg-card-tags">${tags.map(tag=>`<span class="cg-tag">${escapeHtml(tag)}</span>`).join('')}</div>`:''}<div class="cg-card-meta"><span class="cg-meta-item cg-author"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 7C8.65685 7 10 5.65685 10 4C10 2.34315 8.65685 1 7 1C5.34315 1 4 2.34315 4 4C4 5.65685 5.34315 7 7 7Z" stroke="currentColor" stroke-width="1.5"/><path d="M13 13C13 10.7909 10.3137 9 7 9C3.68629 9 1 10.7909 1 13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item cg-date"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1" y="2" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M4 1V3M10 1V3M1 5H13" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item cg-reading-time"><svg width="14" height="14" viewBox="0 0 14 14" fill="none"><circle cx="7" cy="7" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M7 3.5V7L9.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div>`;}}class ContentList{constructor(container,api,options={}){this.container=container;this.api=api;this.options={layoutMode:options.layoutMode||'cards',displayMode:options.displayMode||'comfortable',pageSize:parseInt(options.pageSize)||12,tags:options.tags||[],category:options.category,aiSummaryMaxBytes:options.aiSummaryMaxBytes,viewerMode:options.viewerMode||'inline',externalUrlPattern:options.externalUrlPattern||'/article/{id}',externalTarget:options.externalTarget||'article-{id}',onArticleClick:options.onArticleClick||null};this.currentPage=1;this.totalPages=1;this.articles=[];this.loading=false;this.expandedCards=new Set();}async init(){this.render();await this.loadArticles();}render(){const layoutClass=this.options.layoutMode==='rows'?'cg-content-rows':'cg-content-grid';this.container.innerHTML=`<div class="cg-content-list"><div class="cg-list-header"><button class="cg-display-toggle" title="Toggle display mode"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><rect x="2" y="2" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="8" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/><rect x="2" y="14" width="16" height="4" rx="1" stroke="currentColor" stroke-width="1.5"/></svg><span>${this.options.displayMode==='compact'?'Show summaries':'Hide summaries'}</span></button></div><div class="${layoutClass}"></div><div class="cg-pagination"></div></div>`;const toggle=this.container.querySelector('.cg-display-toggle');toggle.addEventListener('click',()=>this.toggleDisplayMode());}async loadArticles(page=1){if (this.loading){return;}this.loading=true;this.showLoading();try{const data=await this.api.fetchArticles({page,limit:this.options.pageSize,tags:this.options.tags,category:this.options.category});this.articles=data.articles||[];this.currentPage=data.pagination?.page||1;this.totalPages=data.pagination?.totalPages||1;this.renderArticles();this.renderPagination();} catch (error){console.error('[ContentList] Error loading articles:',error);this.showError('Failed to load articles. Please try again.');} finally{this.loading=false;}}renderArticles(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (this.articles.length===0){grid.innerHTML=`<div class="cg-empty-state"><svg width="64" height="64" viewBox="0 0 64 64" fill="none"><rect x="8" y="12" width="48" height="40" rx="4" stroke="currentColor" stroke-width="2"/><path d="M16 24H48M16 32H48M16 40H32" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>No articles found</p></div>`;return;}grid.innerHTML='';this.articles.forEach(article=>{const isExpanded=this.expandedCards.has(article.uuid);const card=new ContentCard(article,{displayMode:isExpanded?'expanded':this.options.displayMode,viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,aiSummaryMaxBytes:this.options.aiSummaryMaxBytes,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});grid.appendChild(card.render());});}handleExpand(article,cardElement){const isExpanded=this.expandedCards.has(article.uuid);if (isExpanded){this.expandedCards.delete(article.uuid);} else{this.expandedCards.add(article.uuid);}const newCard=new ContentCard(article,{displayMode:isExpanded?this.options.displayMode:'expanded',viewerMode:this.options.viewerMode,externalUrlPattern:this.options.externalUrlPattern,externalTarget:this.options.externalTarget,onExpand:(article,cardElement)=>this.handleExpand(article,cardElement),onClick:(article)=>this.handleArticleClick(article)});cardElement.replaceWith(newCard.render());}handleArticleClick(article){if (this.options.onArticleClick){this.options.onArticleClick(article);}}toggleDisplayMode(){this.options.displayMode=this.options.displayMode==='compact'?'expanded':'compact';this.expandedCards.clear();this.renderArticles();const toggle=this.container.querySelector('.cg-display-toggle span');toggle.textContent=this.options.displayMode==='compact'?'Show summaries':'Hide summaries';}renderPagination(){const pagination=this.container.querySelector('.cg-pagination');if (this.totalPages<=1){pagination.innerHTML='';return;}const prevDisabled=this.currentPage===1;const nextDisabled=this.currentPage===this.totalPages;pagination.innerHTML=`<button class="cg-btn-prev" ${prevDisabled?'disabled':''}><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M10 12L6 8L10 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Previous</button><span class="cg-page-info">Page ${this.currentPage}of ${this.totalPages}</span><button class="cg-btn-next" ${nextDisabled?'disabled':''}>Next<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M6 4L10 8L6 12" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button>`;const prevBtn=pagination.querySelector('.cg-btn-prev');const nextBtn=pagination.querySelector('.cg-btn-next');prevBtn.addEventListener('click',()=>{if (this.currentPage>1){this.loadArticles(this.currentPage-1);this.scrollToTop();}});nextBtn.addEventListener('click',()=>{if (this.currentPage<this.totalPages){this.loadArticles(this.currentPage+1);this.scrollToTop();}});}showLoading(){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-loading"><div class="cg-spinner"></div><p>Loading articles...</p></div>`;}}showError(message){const grid=this.container.querySelector('.cg-content-grid,.cg-content-rows');if (grid){grid.innerHTML=`<div class="cg-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p><button class="cg-retry-btn">Try Again</button></div>`;const retryBtn=grid.querySelector('.cg-retry-btn');retryBtn.addEventListener('click',()=>this.loadArticles(this.currentPage));}}scrollToTop(){this.container.scrollIntoView({behavior:'smooth',block:'start'});}}class ContentViewer{constructor(container,api,options={}){this.container=container;this.api=api;this.options={displayMode:options.displayMode||'inline',showBackButton:options.showBackButton!==false,showSummary:options.showSummary!==false,onBack:options.onBack||null};this.article=null;this.loading=false;this.summaryExpanded=true;}async loadArticle(uuid){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticle(uuid);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}async loadArticleBySlug(slug){if (this.loading)return;this.loading=true;this.showLoading();try{this.article=await this.api.fetchArticleBySlug(slug);this.render();} catch (error){this.showError('Failed to load article. Please try again.');console.error(error);} finally{this.loading=false;}}render(){if (!this.article)return;const readingTime=calculateReadingTime(this.article.wordCount||this.article.content);const content=this.renderMarkdown(this.article.content||'');this.container.innerHTML=`<div class="cg-content-viewer">${this.options.showBackButton?`<div class="cg-viewer-header"><button class="cg-back-btn"><svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M12 16L6 10L12 4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>Back to list</button></div>`:''}<article class="cg-viewer-content"><header class="cg-content-header"><h1 class="cg-content-title">${escapeHtml(this.article.title)}</h1>${this.options.showSummary&&this.article.summary&&this.article.category!=='announce'?`<div class="cg-ai-summary ${this.summaryExpanded?'expanded':'collapsed'}"><div class="cg-ai-summary-header"><div class="cg-ai-summary-label"><svg class="cg-ai-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"/></svg><span>AI Generated Summary</span></div><button class="cg-summary-toggle" aria-label="Toggle summary"><svg class="cg-chevron" width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6l4 4 4-4"/></svg></button></div><div class="cg-ai-summary-content"><p>${escapeHtml(this.article.summary)}</p></div></div>`:''}<div class="cg-content-meta"><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 8C9.65685 8 11 6.65685 11 5C11 3.34315 9.65685 2 8 2C6.34315 2 5 3.34315 5 5C5 6.65685 6.34315 8 8 8Z" stroke="currentColor" stroke-width="1.5"/><path d="M14 14C14 11.7909 11.3137 10 8 10C4.68629 10 2 11.7909 2 14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${escapeHtml(this.article.authorName)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="2" y="3" width="12" height="11" rx="2" stroke="currentColor" stroke-width="1.5"/><path d="M5 2V4M11 2V4M2 6H14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${formatDate(this.article.publishedAt)}</span><span class="cg-meta-item"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><circle cx="8" cy="8" r="6" stroke="currentColor" stroke-width="1.5"/><path d="M8 4V8L10.5 10.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>${readingTime}</span></div></header><div class="cg-content-body">${content}</div></article></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}const summaryToggle=this.container.querySelector('.cg-summary-toggle');if (summaryToggle){summaryToggle.addEventListener('click',()=>this.toggleSummary());}}toggleSummary(){this.summaryExpanded=!this.summaryExpanded;const summaryEl=this.container.querySelector('.cg-ai-summary');if (summaryEl){if (this.summaryExpanded){summaryEl.classList.add('expanded');summaryEl.classList.remove('collapsed');} else{summaryEl.classList.add('collapsed');summaryEl.classList.remove('expanded');}}}renderMarkdown(markdown){marked.setOptions({breaks:true,gfm:true,headerIds:true,mangle:false});try{return marked.parse(markdown);} catch (error){console.error('Markdown parsing error:',error);return `<p>${escapeHtml(markdown)}</p>`;}}handleBack(){if (this.options.onBack){this.options.onBack();}}showLoading(){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-loading"><div class="cg-spinner"></div><p>Loading article...</p></div></div>`;}showError(message){this.container.innerHTML=`<div class="cg-content-viewer"><div class="cg-viewer-error"><svg width="48" height="48" viewBox="0 0 48 48" fill="none"><circle cx="24" cy="24" r="20" stroke="currentColor" stroke-width="2"/><path d="M24 16V26M24 32V32.5" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg><p>${message}</p>${this.options.showBackButton?'<button class="cg-back-btn">Back to articles</button>':''}</div></div>`;if (this.options.showBackButton){const backBtn=this.container.querySelector('.cg-back-btn');if (backBtn){backBtn.addEventListener('click',()=>this.handleBack());}}}clear(){this.container.innerHTML='';this.article=null;}}class ContentGrowthWidget{static version='1.1.3';constructor(container,config){this.container=typeof container==='string'?document.querySelector(container):container;if (!this.container){throw new Error('Container not found');}this.config={apiKey:config.apiKey||config['api-key'],baseUrl:config.baseUrl||'https:tags:this.parseTags(config.tags),category:config.category,theme:config.theme||'light',layoutMode:config.layoutMode||config['layout-mode']||'cards',displayMode:config.displayMode||config['display-mode']||'comfortable',aiSummaryMaxBytes:config.aiSummaryMaxBytes||config['ai-summary-max-bytes'],viewerMode:config.viewerMode||config['viewer-mode']||'inline',externalUrlPattern:config.externalUrlPattern||config['external-url-pattern']||'/article/{id}',externalTarget:config.externalTarget||config['external-target']||'article-{id}',pageSize:config.pageSize||config['page-size']||12,mode:config.mode||'list',articleId:config.articleId||config['article-id'],slug:config.slug};if (!this.config.apiKey){throw new Error('API key is required');}this.api=new ContentGrowthAPI({apiKey:this.config.apiKey,baseUrl:this.config.baseUrl});this.currentView='list';this.contentList=null;this.contentViewer=null;this.init();}init(){this.container.classList.add('cg-widget');this.container.setAttribute('data-theme',this.config.theme);if (this.config.mode==='article-only'){if (this.config.slug){this.showPostInlineBySlug(this.config.slug);} else if (this.config.articleId){this.showPostInline(this.config.articleId);}} else{this.showList();}}showList(){this.currentView='list';this.container.innerHTML='';const listContainer=document.createElement('div');listContainer.className='cg-list-view';this.container.appendChild(listContainer);this.contentList=new ContentList(listContainer,this.api,{layoutMode:this.config.layoutMode,displayMode:this.config.displayMode,pageSize:this.config.pageSize,tags:this.config.tags,category:this.config.category,aiSummaryMaxBytes:this.config.aiSummaryMaxBytes,viewerMode:this.config.viewerMode,externalUrlPattern:this.config.externalUrlPattern,externalTarget:this.config.externalTarget,onArticleClick:(article)=>this.showPost(article.uuid)});this.contentList.init();}showPost(uuid){this.currentView='viewer';if (this.config.viewerMode==='modal'){this.showPostModal(uuid);} else{this.showPostInline(uuid);}}showPostInline(uuid){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticle(uuid);}showPostInlineBySlug(slug){this.container.innerHTML='';const viewerContainer=document.createElement('div');viewerContainer.className='cg-viewer-view';this.container.appendChild(viewerContainer);const showBackButton=this.config.mode!=='article-only';this.contentViewer=new ContentViewer(viewerContainer,this.api,{displayMode:'inline',showBackButton:showBackButton,onBack:showBackButton?()=>this.showList():null});this.contentViewer.loadArticleBySlug(slug);}showPostModal(uuid){const modal=document.createElement('div');modal.className='cg-modal';if (this.config.theme){modal.setAttribute('data-theme',this.config.theme);}modal.innerHTML=`<div class="cg-modal-overlay"></div><div class="cg-modal-content"><button class="cg-modal-close" aria-label="Close"><svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M18 6L6 18M6 6L18 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><div class="cg-modal-body"></div></div>`;document.body.appendChild(modal);document.body.style.overflow='hidden';const modalBody=modal.querySelector('.cg-modal-body');this.contentViewer=new ContentViewer(modalBody,this.api,{displayMode:'modal',onBack:()=>this.closeModal(modal)});this.contentViewer.loadArticle(uuid);const closeBtn=modal.querySelector('.cg-modal-close');const overlay=modal.querySelector('.cg-modal-overlay');const closeModal=()=>this.closeModal(modal);closeBtn.addEventListener('click',closeModal);overlay.addEventListener('click',closeModal);const handleEsc=(e)=>{if (e.key==='Escape'){closeModal();document.removeEventListener('keydown',handleEsc);}};document.addEventListener('keydown',handleEsc);requestAnimationFrame(()=>{modal.classList.add('cg-modal--active');});}closeModal(modal){modal.classList.remove('cg-modal--active');setTimeout(()=>{modal.remove();document.body.style.overflow='';},300);}parseTags(tags){if (!tags)return [];if (Array.isArray(tags))return tags;return tags.split(',').map(t=>t.trim()).filter(Boolean);}updateConfig(newConfig){Object.assign(this.config,newConfig);this.init();}destroy(){this.container.innerHTML='';this.container.classList.remove('cg-widget');this.container.removeAttribute('data-theme');}}function initWidgets(){const containers=document.querySelectorAll('[data-cg-content]');containers.forEach((container,index)=>{const config={apiKey:container.dataset.apiKey||container.dataset.cgApiKey,baseUrl:window.WIDGET_BASE_URL||container.dataset.baseUrl||container.dataset.cgBaseUrl,tags:container.dataset.tags||container.dataset.cgTags,theme:container.dataset.theme||container.dataset.cgTheme||'light',layoutMode:container.dataset.layoutMode||container.dataset.cgLayoutMode||'cards',displayMode:container.dataset.displayMode||container.dataset.cgDisplayMode||'comfortable',viewerMode:container.dataset.viewerMode||container.dataset.cgViewerMode||'inline',externalUrlPattern:container.dataset.externalUrlPattern||container.dataset.cgExternalUrlPattern,externalTarget:container.dataset.externalTarget||container.dataset.cgExternalTarget,pageSize:container.dataset.pageSize||container.dataset.cgPageSize||12,mode:container.dataset.mode||container.dataset.cgMode||'list',articleId:container.dataset.articleId||container.dataset.cgArticleId};try{new ContentGrowthWidget(container,config);} catch (error){console.error(`[Widget ${index}] Failed to initialize:`,error);container.innerHTML=`<div style="padding:2rem;text-align:center;color:#ef4444;"><p>Failed to load widget:${error.message}</p><p style="font-size:0.875rem;margin-top:0.5rem;">Check console for details</p></div>`;}});}if (document.readyState==='loading'){document.addEventListener('DOMContentLoaded',initWidgets);} else{initWidgets();}window.ContentGrowthWidget=ContentGrowthWidget;{ContentGrowthWidget};window.ContentGrowthWidget=ContentGrowthWidget;console.log('[ContentGrowthWidget] Loaded successfully v1.1.3');})(window);
|
package/package.json
CHANGED