UNPKG

@mdfriday/foundry

Version:

The core engine of MDFriday. Convert Markdown and shortcodes into fully themed static sites – Hugo-style, powered by TypeScript.

240 lines 8.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PaginatorManagerImpl = exports.PaginatorImpl = void 0; /** * TypeScript implementation of Go's Paginator */ class PaginatorImpl { constructor(paginatedElements, total, size, base) { this.paginatedElements = paginatedElements; this.base = base; this.total = total; this.size = size; this._pagers = []; if (paginatedElements.length > 0) { for (let i = 0; i < paginatedElements.length; i++) { this._pagers.push(new PagerImpl(i + 1, this)); } } else { this._pagers.push(new PagerImpl(1, this)); } } totalPages() { return this.paginatedElements.length; } pagers() { return [...this._pagers]; } getElement(pageNumber) { if (this.paginatedElements.length === 0) { return []; } return this.paginatedElements[pageNumber - 1] || []; } getBase() { return this.base; } getPagers() { return this._pagers; } } exports.PaginatorImpl = PaginatorImpl; /** * TypeScript implementation of Go's Pager - implements the existing Pager interface */ class PagerImpl { constructor(number, paginator) { this.number = number; this.paginator = paginator; } pageNumber() { return this.number; } totalPages() { return this.paginator.totalPages(); } url() { const pageNumber = this.pageNumber(); if (pageNumber > 1) { const rel = `/page/${pageNumber}/`; return this.pathJoin(this.paginator.getBase(), rel); } return this.paginator.getBase(); } pages() { const elements = this.element(); return { len: () => elements.length, ...elements }; } pagers() { return this.paginator.pagers(); } first() { const pagers = this.paginator.getPagers(); return pagers[0]; } last() { const pagers = this.paginator.getPagers(); return pagers[pagers.length - 1]; } hasPrev() { return this.pageNumber() > 1; } prev() { if (!this.hasPrev()) { return null; } const pagers = this.paginator.getPagers(); return pagers[this.pageNumber() - 2]; } hasNext() { return this.pageNumber() < this.paginator.totalPages(); } next() { if (!this.hasNext()) { return null; } const pagers = this.paginator.getPagers(); return pagers[this.pageNumber()]; } element() { return this.paginator.getElement(this.pageNumber()); } pathJoin(base, rel) { if (base.endsWith('/')) { base = base.slice(0, -1); } if (!rel.startsWith('/')) { rel = '/' + rel; } return base + rel; } } /** * TypeScript implementation of Go's Paginator entity - implements existing PagerManager interface */ class PaginatorManagerImpl { constructor(svc, page) { this.currentPager = null; this.initialized = false; this.svc = svc; this.page = page; } async current() { // Lazy initialize on first access - exactly like golang's sync.Once if (!this.initialized) { await this.initializePaginator(); } // If still no current pager after initialization, return a default empty pager if (!this.currentPager) { const emptyPaginator = new PaginatorImpl([], 0, 10, this.page.paths().base()); return emptyPaginator.pagers()[0]; } return this.currentPager; } setCurrent(current) { this.currentPager = current; } async paginate(groups) { if (!this.initialized) { const pagerSize = this.svc.pageSize(); const paginator = this.newPaginatorFromPageGroups(groups, pagerSize, this.page.paths().base()); this.currentPager = paginator.pagers()[0]; this.initialized = true; } return this.currentPager || this.current(); } async paginator() { // Lazy initialize on first access - exactly like golang's sync.Once if (!this.initialized) { await this.initializePaginator(); } return this.currentPager || this.current(); } /** * Initialize paginator - TypeScript equivalent of golang's init.Do() * This matches the exact logic from golang's Paginator.Paginator() method */ async initializePaginator() { try { const pagerSize = this.svc.pageSize(); let pages = []; // Exact same logic as golang's Paginator.Paginator() method const kind = this.page.kind(); switch (kind) { case 'home': pages = await this.svc.globalRegularPages(); break; case 'term': case 'taxonomy': const pageCollection = await this.page.pages(); pages = pageCollection?.len ? Array.from({ length: pageCollection.len() }, (_, i) => pageCollection[i]) : []; break; default: const regularPages = await this.page.regularPages(); if (regularPages && regularPages.len && regularPages.len() > 0) { pages = Array.from({ length: regularPages.len() }, (_, i) => regularPages[i]); } else { pages = await this.svc.globalRegularPages(); } break; } // CRITICAL FIX: Use page.paths().base() instead of page.path() // This matches golang's p.page.Paths().Base() call const basePath = this.page.paths().base(); const paginator = this.newPaginatorFromPages(pages, pagerSize, basePath); this.currentPager = paginator.pagers()[0]; this.initialized = true; } catch (error) { // Create empty paginator on error - also use base path const basePath = this.page.paths().base(); const emptyPaginator = new PaginatorImpl([], 0, 10, basePath); this.currentPager = emptyPaginator.pagers()[0]; this.initialized = true; } } newPaginatorFromPages(pages, size, base) { if (size <= 0) { throw new Error('paginator size must be positive'); } const split = this.splitPages(pages, size); return new PaginatorImpl(split, pages.length, size, base); } newPaginatorFromPageGroups(pageGroups, size, base) { if (size <= 0) { throw new Error('paginator size must be positive'); } // Convert PageGroups to pages array const pages = []; if (pageGroups && pageGroups.len && pageGroups.len() > 0) { for (let i = 0; i < pageGroups.len(); i++) { const group = pageGroups[i]; if (group && group.pages) { const groupPages = group.pages(); if (groupPages && groupPages.len) { for (let j = 0; j < groupPages.len(); j++) { pages.push(groupPages[j]); } } } } } const split = this.splitPages(pages, size); return new PaginatorImpl(split, pages.length, size, base); } splitPages(pages, size) { const split = []; for (let low = 0; low < pages.length; low += size) { const high = Math.min(low + size, pages.length); split.push(pages.slice(low, high)); } return split; } } exports.PaginatorManagerImpl = PaginatorManagerImpl; //# sourceMappingURL=paginator.js.map