@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
JavaScript
"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