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
/*! # Paginator This crate is used for generating pagination bar on webpages or other UIs. ## Examples ##### Creating a Pagination Bar Which Has 5 Pages and Is on Page 1 ```rust extern crate paginator; use paginator::{Paginator, PageItem}; use core::fmt::Write; let paginator = Paginator::builder(5).current_page(1).build_paginator().unwrap(); let mut html = String::new(); for page_item in paginator.paginate() { match page_item { PageItem::Prev(page) => { html.write_fmt(format_args!("<li><a href=\"/page/{page}\"><i class=\"fas fa-angle-left\"></i></a></li>", page = page)).unwrap(); } PageItem::Page(page) => { html.write_fmt(format_args!("<li><a href=\"/page/{page}\">{page}</a></li>", page = page)).unwrap(); } PageItem::CurrentPage(page) => { html.write_fmt(format_args!("<li>{page}</li>", page = page)).unwrap(); } PageItem::Ignore => { html.push_str("<li>...</li>"); } PageItem::Next(page) => { html.write_fmt(format_args!("<li><a href=\"/page/{page}\"><i class=\"fas fa-angle-right\"></i></a></li>", page = page)).unwrap(); } } } ``` ##### Creating Pagination Bars Which Has 2 Pages for Different Current Pages ```rust extern crate paginator; use paginator::{Paginator, PageItem}; let mut paginator_iter = Paginator::builder(2).build_paginator_iter().unwrap(); for page_item in paginator_iter.next().unwrap().paginate() { // current_page == 1 } for page_item in paginator_iter.next().unwrap().paginate() { // current_page == 2 } ``` ## Pagination Rules Before building up a `Paginator`, there is an important option, `max_item_count`, can be set via `PaginatorBuilder`. This option can limit the count of items on the pagination bar. This crate **ignores** page items far away from the current page item to stick to the count limit of items. The first/last n items can be additionally reserved. Look at the following code for more details. ```rust extern crate paginator; use paginator::{Paginator, page_items_to_string}; let mut p = Paginator::builder(8).max_item_count(9).start_size(1).end_size(1).build_paginator_iter().unwrap(); assert_eq!("1* 2 3 4 5 6 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 2* 3 4 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 2 3* 4 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 2 3 4* 5 ... 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 ... 4 5* 6 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 ... 4 5 6* 7 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 ... 4 5 6 7* 8 >", page_items_to_string(p.next().unwrap().paginate().as_slice())); assert_eq!("< 1 2 3 4 5 6 7 8*", page_items_to_string(p.next().unwrap().paginate().as_slice())); ``` ## No Std Disable the default features to compile this crate without std. ```toml [dependencies.paginator] version = "*" default-features = false ``` */ #![cfg_attr(not(feature = "std"), no_std)] extern crate alloc; mod page_item; mod paginator; mod paginator_builder; mod paginator_iter; use core::fmt::Write; use alloc::string::String; pub use self::paginator::*; pub use page_item::*; pub use paginator_builder::*; pub use paginator_iter::*; /// Format `PageItem`s to a string. Usually for debug or logging. pub fn page_items_to_string(page_items: &[PageItem]) -> String { let mut s = String::new(); let mut iter = page_items.iter(); if let Some(item) = iter.next() { s.write_fmt(format_args!("{}", item)).unwrap(); for item in iter { s.write_fmt(format_args!(" {}", item)).unwrap(); } } s }