deno.land / x / lume@v2.1.4 / plugins / paginate.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import { merge } from "../core/utils/object.ts";
import type Site from "../core/site.ts";
/** The options for the paginate helper */export interface PaginateOptions { /** The number of elements per page */ size?: number;
/** The function to generate the url of the pages */ url?: (page: number) => string;
/** Function to modify or add extra data to each page */ each?: (data: PaginateResult<unknown>, page: number) => void;}
export type Paginator = <T>( results: T[], userOptions?: Partial<PaginateOptions>,) => PaginateResult<T>[];
/** Pagination info */export interface PaginationInfo { /** The current page number */ page: number;
/** The total number of pages */ totalPages: number;
/** The total number of elements */ totalResults: number;
/** The url of the previous page */ previous: string | null;
/** The url of the next page */ next: string | null;}
/** The paginate result */export interface PaginateResult<T> { /** The page url */ url: string;
/** The elements in this page */ results: T[];
/** The pagination info */ pagination: PaginationInfo;
[key: string]: unknown;}
export interface Options { /** The helper name */ name?: string;
/** The default pagination options */ options?: PaginateOptions;}
export const defaults: Options = { name: "paginate", options: { size: 10, },};
/** Register the plugin to enable the `paginate` helper */export default function (userOptions?: Options) { const options = merge(defaults, userOptions);
return (site: Site) => { if (!userOptions?.options?.url) { const ext = site.options.prettyUrls ? "/index.html" : ".html"; options.options.url = (page: number) => `./page-${page}${ext}`; }
// Register the helper site.data(options.name, createPaginator(options.options)); };}
/** Create a paginator function */export function createPaginator(defaults: PaginateOptions): Paginator { return function paginate<T>( results: T[], userOptions: Partial<PaginateOptions> = {}, ) { const options = merge(defaults, userOptions); const totalResults = results.length; const totalPages = Math.ceil(results.length / options.size);
const result: PaginateResult<T>[] = []; let page = 0;
while (++page <= totalPages) { const data = createPageData(page); const from = (page - 1) * options.size; const to = from + options.size; data.results = results.slice(from, to);
if (options.each) { options.each(data, page); }
result.push(data); }
return result;
function createPageData(page: number): PaginateResult<T> { return { url: options.url(page), results: [], pagination: { page, totalPages, totalResults, previous: page > 1 ? options.url(page - 1) : null, next: totalPages > page ? options.url(page + 1) : null, }, }; } };}
/** Extends Data interface */declare global { namespace Lume { export type { PaginateResult };
export interface Data { /** * The paginator helper * @see https://lume.land/plugins/paginate/ */ paginate: Paginator;
/** * The pagination info * @see https://lume.land/plugins/paginate/ */ pagination?: PaginationInfo;
/** * The pagination result * @see https://lume.land/plugins/paginate/ */ results?: Data[]; } }}
lume

Version Info

Tagged at
5 months ago