Giter Site home page Giter Site logo

sverrirs / jekyll-paginate-v2 Goto Github PK

View Code? Open in Web Editor NEW
512.0 14.0 285.0 621 KB

Pagination Generator for Jekyll 3 (enhanced replacement for the old built-in jekyll-paginate gem) ⛺

Home Page: https://rubygems.org/gems/jekyll-paginate-v2

License: MIT License

Ruby 99.74% Shell 0.26%
jekyll jekyll-plugin pagination paginate pagination-gem jekyll-paginate pagination-generator pagination-logic pagination-pages dynamic

jekyll-paginate-v2's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jekyll-paginate-v2's Issues

add possibility to use page size in title

I want to have a page title like "Page 2 of 5", but with title: 'Page :num' I can only achieve "Page 2". I'd like another keyword like :max (for this example: title: 'Page :num of :max').

Strip .html from the paginated pages (/articles/page2.html) to (/articles/page2/

I'm using pagination but am pointing it to an "articles" page, not index.html in root. I've created an "articles" folder and added a new index.html to that folder (acting as the blog page).

My permalink settings are
permalink: /:num/ (I've also tried /:num and /articles/:num)

and my link in the page is {{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}

Everything works great except it adds a .html extension to all the pages - which results in duplicate content, since there are the same two pages at /articles/page2.html and /articles/page2/

Any assistance is much appreciated

Wrong error message

I'm receiveing this message when no pagination page found. The instruction is to put a paginate filed on front matter instead of pagination.

 Pagination: Starting
        Pagination: Is enabled, but I couldn't find any pagination page. Skipping pagination. Pages must have 'paginate: enabled: true' in their front-matter for pagination to work.
        Generating: Jekyll::PaginateV2::Generator::PaginationGenerator finished in 0.002 seconds.

renaming the index.html via page's permalink

I would like to have the option to rename the index.html via the page's permalink
every time I use the page's permalink option it create folders with index.html inside and the pagination permalink creates subfolders inside

development website layout
├── projects
│   ├── index.html
│   ├── minecraft.html
├── _projects
│   ├── 00000.md
│   ├── 00001.md
│   ├── 00002.md
│   ├── 00003.md
│   ├── 00004.md
│   └── 00005.md

layout I want in _site

├── projects
│   ├── 00000.html
│   ├── 00001.html
│   ├── 00002.html
│   ├── 00003.html
│   ├── 00004.html
│   ├── 00005.html
│   ├── index.html
│   ├── minecraft-1.html
│   └── minecraft-2.html

minecraft.html

layout: page
title: minecraft themepark
#permalink: '/minecraft/'
pagination:
enabled: true
collection: projects
category: minecraft
permalink: 'minecraft-:num.html'

Pagination: Is enabled, but I couldn't find any pagination page.

Using jekyll 3.6.2 I followed the instructions and I still got the following message when doing bundle exec jekyll serve:

Pagination: Is enabled, but I couldn't find any pagination page. Skipping pagination. Pages must have 'pagination: enabled: true' in their front-matter for pagination to work.

My _config.yml file contains the following:

# Pagination Settings
pagination:
  enabled: true
  per_page: 3
  permalink: '/page/:num/'
  title: ':title - page :num of :max'
  limit: 0
  sort_field: 'date'
  sort_reverse: true

And the layout home where I want the pagination for my posts looks like this:

---
layout: default
pagination:
  enabled: true
---

<div class="home">

    <h1 class="page-heading">Posts</h1> {{ content }}

    <ul class="post-list">
        {% for post in paginator.posts %}
        <li class="post-item">
            <span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>
            <div class="post-image">
                <img class="post-image" src="{{ post.image }} " />
            </div>
            <h2 class="post-item-title">
          <a class="post-link" href="{{ post.url | relative_url }}">{{ post.title | escape }}</a>
        </h2>
            <div class="post-abstract">{{ post.excerpt | strip_html | truncatewords:20 }}</div>
        </li>{% endfor %}
    </ul>
</div>

What am I doing wrong? Why paginator.posts seems to be empty?
It is not showing any post.

My Gemfile contains:

# If you have any plugins, put them here!
group :jekyll_plugins do
   gem "jekyll-feed", "~> 0.6"
   gem "jekyll-paginate-v2"
end

add some debugging tools

For the most part, I had an easy time following the instructions. The one thing that caused me a bit of pain was in debugging the problem where no items were appearing in my index views. I think it would be great to have a debugging tool where I could insert {{paginator.debug}} in a layout and have jekyll-paginate-v2 emit some useful information about the pagination system. I'm not sure what all could be presented, but I'm imagining something like:

JEKYLL-PAGINATE-V2 :: BEGIN DEBUG INFO ----------------------------------------
Items in collections: 0
Items in posts: 90
Current page: 1

Configuration:
  Paginating: collection 'all' (use posts for posts)
  Items per page: 10 (0 for unlimited)
  Limit: 0 (0 for no limit)
  Locale: unspecified (other options)
  Order by: date (more help text)
  Order direction: descending (or ascending)
  Filter tags: unspecified
  Filter categories: unspecified
JEKYLL-PAGINATE-V2 :: END DEBUG INFO ------------------------------------------

That's a very cursory example of some useful info. It could be formatted better and you may have better names for things or even more helpful info that could fit in here. I think one of the most useful things to add would be some info on why there were zero items if there are zero items, at least that's what had me temporarily stuck.

AutoPages are created before Generators run

Since AutoPages is triggered right after the site is loaded (i.e. immediately after Jekyll starts), autopages for new tags and categories of documents/pages created by other Jekyll::Generators are not generated.

e.g. _plugins/unseen_doc_generator.rb:

module Jekyll
  module UnseenDoc
    class Generator < Jekyll::Generator
      def generate(site)
        unseen_doc = Jekyll::Document.new(File.join(site.source, 'unseen-doc.html'),
          { :site => site, :collection => site.posts })

        unseen_doc.data["layout"] = "page"
        unseen_doc.data["title"] = "An unseen document"
        unseen_doc.data["date"] = Time.new

        unseen_doc.content = "This document's tags/category will not be processed by AutoPages<br/>" +
          "My categories: {{ page.categories | join: ' ' }}<br/>\n" +
          "My tags: {{ page.tags | join: ' '}}<br/>\n"

        unseen_doc.data["tags"] = [ "unseen-tag", "another-tag" ]
        unseen_doc.data["categories"] = [ "unseen-category" ]

        site.posts.docs << unseen_doc
      end
    end
  end
end

The resulting post will be listed in the homepage and accessible at e.g. /2017/12/unseen-doc/ (or whatever the permalink dictates), but its category and tags are not processed by AutoPages, even though the tags are listed by this sample ./tags.md:

<ul>
{% for tag in site.tags %}
  <li><a href="{{ '/tags/' | append: tag[0] | relative_url }}">{{tag[0] }}</a></li>
{% endfor %}
</ul>

How to paginate a collection?

Hello @sverrirs I am trying to use your plugin on a site with a main _pages blog and some collections (one now, but ultimately several). I can paginate the blog posts and that works great, but it isn't clear to me from the documentation how to paginate a collection. I don't think your examples cover this sceario.

I have _collections/_stuff containing a number posts and an index.md which has frontmatter:

---
layout: index
title: stuff
permalink: /:collection/index.html
pagination:
  enabled: true
  collection: stuff
---

The index of stuff is published as /stuff/ as one would expect. It uses the same layout as the blog page.

I have enabled pagination in _config.yml:

pagination:
  enabled: true
  per_page: 20
  title: :title
  sort_reverse: true
  trail:
    before: 2
    after: 2

but it only paginates the blog posts. If I add collection: stuff to _config.yml then it only paginates stuff but onto the blog index page. I saw this done here but guess it's wrong so removed it again. So I am back to having blog posts paginated at /blog and that looks good.

When the generator runs I can see it work through the blog pages but it doesn't process the collection at all (there are no page directories under /_site/stuff/).

So what is the right way to add pagination of stuff at /stuff/ ?

Pagination + i18n

Hey,

couldn't find something in the old issues, so my question is: Is it somehow possible to set something like this in the config of jekyll?

permalink : "/:lang/page/:num/" - :lang is the variable I need to create different versions of the same files.

And I guess to obtain the posts I would need something like this:

{% for post in paginator.lang.posts %}
instead of
{% for post in paginator.posts %}

Would be great!!! I hope my problem is understandable.. or maybe you guys have a different approach?

cheers,
bg

Sort posts by alternative date results in error

Hi, I'm building a music blog with paginated pages that lists albums by album release date instead of blog post date, the only problem is I get an error when trying to sort by any frontmatter date that isn't it's built-in date:. All other sort_field values work fine.

for example

The file named
2017-05-05-bibio_fix-this-thang.md

Has the Frontmatter

---
published: true
release_date: 2015-05-05
---

When in the config.yml I set the sort to sort_field: 'release_date' I get this error in the console:

jekyll 3.5.2 | Error:  comparison of Jekyll::Document with Jekyll::Document failed

Using with Github Pages?

Hi –

First of all, thank you for taking the time to build this. I found it very useful. I'm sorry to open this as an issue, since it's more of a question.

I used this locally and it worked perfectly. When I deployed it to gh-pages though on my site, zthall.com, the zthall.com/blog page is now blank. Any ideas why this wouldn't work with gh-pages?

extensionless pagination links

Is there any support for extensionless pagination links? How?

Right now when I use paginator.next_page_path or paginator.previous_page_path , with whatever permalink style, I would get .html at the end of the link.

aginationIndexer.rb:30:in `block (2 levels) in index_posts_by': undefined method `downcase' for 2005:Fixnum (NoMethodError)

I recently updated my site https://github.com/emeraldjava/emeraldjava.github.io to jekyll 3, the content of my Gemfile is

`source 'https://rubygems.org'

gem 'jekyll', '3.3.1'

If you have any plugins, put them here!

group :jekyll_plugins do
gem 'jekyll-sitemap'
gem 'jekyll-paginate-v2'
gem 'jekyll-gist'
gem 'jekyll-feed'
gem 'jekyll-seo-tag'
gem 'jemoji'
end
`

My _config.yml file contains and there is no "theme" setting in the config

`# Plugins
gems:

  • jekyll-paginate-v2
  • jekyll-sitemap
  • jekyll-gist
  • jekyll-feed
  • jemoji
  • jekyll-seo-tag
    `

but and run i run my site locally using "bundle exec jekyll serve -t" i get this stack trace

/var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb:30:in block (2 levels) in index_posts_by': undefined method downcase' for 2005:Fixnum (NoMethodError) from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb:29:in each'
from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb:29:in block in index_posts_by' from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb:15:in each'
from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationIndexer.rb:15:in index_posts_by' from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:61:in block in run'
from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:34:in each' from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:34:in run'
from /var/lib/gems/2.3.0/gems/jekyll-paginate-v2-1.6.0/lib/jekyll-paginate-v2/generator/paginationGenerator.rb:129:in generate' from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/site.rb:174:in block in generate'
from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/site.rb:172:in each' from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/site.rb:172:in generate'
from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/site.rb:68:in process' from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/command.rb:26:in process_site'
from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/commands/build.rb:63:in build' from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/commands/build.rb:34:in process'
from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/commands/serve.rb:37:in block (2 levels) in init_with_program' from /var/lib/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in block in execute'
from /var/lib/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in each' from /var/lib/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in execute'
from /var/lib/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in go' from /var/lib/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb:19:in program'
from /var/lib/gems/2.3.0/gems/jekyll-3.3.1/exe/jekyll:13:in <top (required)>' from /usr/local/bin/jekyll:23:in load'
from /usr/local/bin/jekyll:23:in <main>'

I appreciate this probally isn't a bug with the 'jekyll-paginate-v2' code but can you advise on how i can futher debug the isses?

Accessing undefined method "date"

The fix for #12 in paginationModel.rb#L230 assumes that all Jekyll::Document objects have a date property. For the F-Droid website we have a generator which outputs one page per Android application in our website. These don't have a date, and so it fails with the following error:

/home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:230:in `block in paginate': undefined method `date' for #<Jekyll:Page @name="subreddit.android.appstore/index.html"> (NoMethodError)
Did you mean?  data
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:229:in `each'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:229:in `paginate'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:67:in `block in run'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:34:in `each'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationModel.rb:34:in `run'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-paginate-v2-1.8.0/lib/jekyll-paginate-v2/generator/paginationGenerator.rb:129:in `generate'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:174:in `block in generate'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:172:in `each'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:172:in `generate'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:68:in `process'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:66:in `process_active_language'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:57:in `process_language'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:24:in `block (2 levels) in process'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:23:in `fork'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:23:in `block in process'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:22:in `each'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bundler/gems/polyglot-ea0b78b397e8/lib/jekyll/polyglot/patches/jekyll/site.rb:22:in `process'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/command.rb:26:in `process_site'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/build.rb:63:in `build'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/build.rb:34:in `process'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/serve.rb:37:in `block (2 levels) in init_with_program'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `block in execute'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `each'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `execute'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in `go'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb:19:in `program'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/gems/jekyll-3.4.3/exe/jekyll:13:in `<top (required)>'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bin/jekyll:22:in `load'
	from /home/pete/code/fdroid/website/vendor/ruby/2.3.0/bin/jekyll:22:in `<main>'

I'm happy to submit a PR which wrapped the relevant block of code in something like if p.responds_to? "date", but my Ruby knowledge is not strong enough to know if that is an idiomatic way to solve this problem.

No index.html is generated if there are no posts = 404

If jekyll-paginate-v2 is enabled and there are no posts (e.g. a fresh site) or all the posts are hidden: true, an index.html will not be generated at all (unlike when it is disabled). This makes hosting services like GitHub or GitLab Pages return a 404 on the homepage URL, e.g. domain name.

Expected result: the page is still rendered, but with no items in it.

migrating from jekyll-paginate to v2 with a bundle theme

Using minimal-mistakes gem theme and trying to move to jekyll-paginate-v2. This theme uses jekyll-data to populate defaults in _config.yml. I should be able to wipe out the theme's values with:

paginate: nil
paginate_path: nil

This does not seem to do the trick. Jekyll build throws the following:

Config Warning: The paginate key must be a positive integer or nil. It's currently set to 'nil'.

Default values keep pushing through as if jekyll-paginate-v2 doesn't read the nil correctly.

Any workaround or fix?

Reference issue: mmistakes/minimal-mistakes#1240

filtering a collection

We have a use case where we want to allow the content creators the ability to set display: true in the frontmatter of a collection item. Is it possible to ask the paginator to only fetch members of the collection with display set to true?

Markdown not being rendered

Hello,

first of all: what a great plugin! It has opened a bunch possibilities around here, thanks!

One question though: the pagination is working without any problems, but I use some markdown on the top (just a header, a quote and a paragraph), after the front matter and before looping. Is it a normal and expected behaviour or is it just me messing with html?

I have though about turning these markdown's sections into include files that would be in included in _layout/page.html (with an if statement, but that seems to be pretty counter-intuitive, since it would add a lot of verbosity (meanwhile Jekyll-paginate-v2 has just allowed me to reduce a lot of verbosity, ehe).

Thanks again and keep it going (:

Need assistance - Clicking on individual paginate page breaks the path

First, I would like to say thank you very much for making the updated gem and keeping the pagination for Jekyll alive. I'm new to Jekyll and I've been able to design my blog exactly how I want it to but pagination is giving me a hard time and I been banging my head for the last two weeks trying to figure out why my pages are breaking when I click on a specific page besides page 1.

I'm a intermediate programmer and trying to wrap my head around how pagniation works and even though I don't thorough understand how it works even after spending 3 days reading about it I was able to get the pagination working using your gem, but I'm getting more confused trying to fix the individual page breaking. I know it should just be a few lines of codes to fix it, .

I've successfully enable pagniation on the index.html page that I wanted and the Prev, Next, and page 1 buttons work just fine, but if I decided that I wanted to go from Page 4 directly to Page 2 by clicking on Page 2 button it breaks. Or from any other pages to another page beside page 1 it breaks. What code do I need to add to enable the individual pages to pick up the path correctly? Thanks in advance....I'm currently using the default code from Jekyll website:

{% if paginator.total_pages > 1 %}

{% if paginator.previous_page %} « Prev {% else %} « Prev {% endif %}

{% for page in (1..paginator.total_pages) %}
{% if page == paginator.page %}
{{ page }}
{% elsif page == 1 %}
{{ page }}
{% else %}
{{ page }}
{% endif %}
{% endfor %}

{% if paginator.next_page %}
Next »
{% else %}
Next »
{% endif %}

{% endif %}

Here is the path I have my pagination code on:
1

2

Below image is what happen when clicking on any other page beside page 1
3

Migration tasks for jekyll-paginate-v2 project to jekyll

As discussed in this issue thread #257 then people seem relatively happy with the jekyll-paginate-v2 project taking over for the old jekyll-paginate. There are some improvements needed though before this can happen.

In this issue I want to collect the steps necessary to migrate this project to the larger Jekyll project umbrella. From this Epic-issue I'd then like to create and link actionable issues/tasks that break down the work into manageable chunks.

Tasks

  1. Test coverage needs to be improved
    1.1. Unit tests need to be added to all major code paths. TODO Break down necessary areas for tests.
    1.2. Integration tests should be considered. Actually testing how the plugin renders an example website may be necessary and useful as some idiosyncratic behaviors arise from interaction with Jekyll itself (e.g. date fields for drafts).

  2. Introduction of new active collaborators to the project.

  3. Improving documentation. Some areas of the documentation could do with updating and a once-over to ensure that they're consistent and written in roughly the same style.

  4. Adding more example projects. The examples have been a great resource for many people starting out with the plugin. A few more advanced ones or even fewer but more organized/aesthetically pleasing might be even more helpful.

Unable to find index.html

On build, I keep getting 'Pagination: is enabled, but I couldn't find any index.html page to use as the pagination template. Skipping pagination.'

I have a jekyll project with the following (pertinent) structure:
_layouts/blog.html (with the for loop on)
_site/blog/index.html

In _config.yml I have:
pagination:
enabled: true
per_page: 2

I've put the for loop as per the docs on my blog.html but nothing shows up on the built blog/index.html

Posts not built on upload

first off, thanks for updating paginate for jekyll 3!

i'm running into an issue where pages are not generated when i push to github, but when i run locally, everything works fine. on github, the feed.xml has the blog posts in there, but the index.html has none.

when i revert back to the original paginate gem it starts working again, so i thought it could be related to this paginate-v2 gem. it's super hard to debug on github, but one thing i see locally is AutoPages: Disabled/Not configured in site.config. do i need to explicitly disable AutoPages to get it to run on github?

Autopages won't work with tags that include special characters e.g + or &

Hi

I spotted a quirk in the Autopages - when a tag such as 'b+w' (short for 'black and white') is used, the Autopages tag page generated omits the '+' special character and will create the directory '/tag/b-w/' instead of the expected '/tag/b+w/'. Therefore, the tag links don't correspond.

Tried with other special characters such as '&' and also with tags that contains numbers. With tags that contain numbers, an error is generated.

Do you have any suggestions on how I can get around this

Thanks

Phil

Non-slugified tag page titles?

Hello. I'm currently experimenting with Autopages to create paginated tag page archives. That's working great but I've run into a small snag.

It appears site.tags are being slugified (which is great for permalinks), but when using page.title in my layouts and includes it's not as desirable as the tags are no longer initial capped, now have hyphens, etc.

_config.yml

autopages:
  tags:
    enabled: true
    layouts:
      - 'autopage_tags.html'
    title: ':tag'
    permalink: '/tag/:tag'

Example post YAML

tags: [Foo Bar, test, Uppercase]

Which outputs page.titles like these

foo-bar
test
uppercase

Is there a page. variable available to Autopages that can output the tag name without being slugified, downcased, and without page numbers?

Previously I was using the jekyll-archives plugin to generate my tag pages which now gives me something like this:

<h1>foo-bar</h1>
<p class="excerpt">Posts tagged with foo-bar - page 1 of 62</p>

When I'd rather have

<h1>Foo Bar</h1>
<p class="excerpt">Posts tagged with Foo Bar</p>

Thanks for your time! This is a great plugin and I hope it finds its way into Jekyll's core.

Pagination with future enabled gives errors

I'm not entirely sure if this is accurate. But my situation is that the pagination with debug information indicated it processed the future page but failed to finish when building..

±bundle exec jekyll build --drafts
Configuration file: /home/raytray/Development/raysite/_config.yml
            Source: /home/raytray/Development/raysite
       Destination: /home/raytray/Development/raysite/_site
 Incremental build: disabled. Enable with --incremental
      Generating... 
         AutoPages: Disabled/Not configured in site.config.
        Pagination: ----------------------------
        Pagination: Page: blog/index.html
        Pagination:  Active configuration
        Pagination:   Enabled:          true
        Pagination:   Items per page:   5
        Pagination:   Permalink:        /page/:num/
        Pagination:   Title:            :title - page :num
        Pagination:   Limit:            0
        Pagination:   Sort by:          date
        Pagination:   Sort reverse:     true
        Pagination:  Active Filters
        Pagination:   Collection:       posts
        Pagination:   Category:         [Not set]
        Pagination:   Tag:              [Not set]
        Pagination:   Locale:           [Not set]
        Pagination:  Filtering by: Category   42 => 42
        Pagination:  Filtering by: Tag        42 => 42
        Pagination:  Filtering by: Locale     42 => 42
jekyll 3.4.0 | Error:  comparison of Jekyll::Document with Jekyll::Document failed

With future turned on, even with no future posts to build this error occurred.
With future turned off, with both future and no future posts, this error did not appear.

Paginating of blog posts does not work for category folders

Hi there!

Thanks a lot for your updated and more featured paginator gem for Jekyll. I'd tested a lot (based on the examples - another thanks a lot :). I'm currently developing a gem-based template (Open Source/MIT license) and found your project by searching for a better solution for auto-pages (in different flavours).

All went fine beside one thing: your gem seems not supporting - I've called that way - posts organized in category folders.

The default folder for (all) post is _posts - as you know. A much better way to organize (larger numbers of) articles are category folders like this structure:

/parent_folder/category_folder/_posts

For example all articles that belongs to Jekyll would go:

/articles/jekyll/_posts

The Jekyll engine assigns auto-magic a catetegory (jekyll) to the posts that folder and all these articles are well separated from other posts focussing other topics (categories). That's why I like this way much. I tried your paginator using such a folder structure for posts but no luck.

If all posts are stored under _posts all is fine, the pagination is done as expected but ...

Do you see a chance to support this type of folder structure by your gem as well? I'm NOT a Ruby programmer. For that reason a can not do much in terms of Ruby.

A short notice would be heplful.

Thanks in advance,
Juergen

generate page "view-all"

Hello!!!
Pagination works as expected.
For SEO you need to generate a pages with all the blog posts or category:

blog/ (20 posts)
|
|_blog/page2/ (20 posts)
|
|_blog/page3/ (20 posts)
|
|_blog/page3/ (20 posts)
|
|_blog/view-all/ (all posts)
|
|____yahoooooooo/ (20 posts, category: yahoooooooo)
|
|____yahoooooooo/page2/ (20 posts)
|
|____yahoooooooo/page3/ (20 posts)
|
|____yahoooooooo/view-all/ (all posts)
|
|____tro-lo-lo/ (20 posts, category: tro-lo-lo)
|
|____tro-lo-lo/page2/ (20 posts)
|
|____tro-lo-lo/page3/ (20 posts)
|
|____tro-lo-lo/view-all/ (all posts)

How to generate page "view-all" ? Please help me

P.S. google recommendations for pagination

Support the notion of "first" or "last" pages

It is quite common to have a paginator which, in addition to "next" and "previous" (already supported by jekyll-paginate-v2), also includes "first" and "last". I initially tried to hack this together using the total_posts variable, which almost works, but not quite, for the following reasons:

  • "First" button:
    • When page == 1, the button for page 1 is highilghted and unclickable.
    • On page 2 or higher, link the "first" button to permalink | append: ../
  • "Last" button:
    • When page == paginator.total_pages, on the last page the button for page total_pages is highlighted and unclickable.
    • On every other page, link to permalink: append: ../ | append: paginator.total_pages.

The reason this almost works is because when you are on all but the first page, then permalink: append: ../ takes you to /my-paginator-link/12/../50 (for current page 12, and total pages is 50).
However on the first page, it takes you to /my-paginator-link/../50 which is incorrect, due to the lack of page number for page 1.

This can be worked around with lots of if statements, but it would be preferable if there was a paginator.first_path and paginator.last_path variable available.

Autopage title doesn't include site name

Hi, I just got started with this gem - thanks!

I use autopages for my collection pagination generation. All works fine, apart from that the title of the page using :coll only includes the collection name. I guess this is a feature, not a bug, but is there a way to let it include the main site title? For example, my site title is FooBar, my collection is Books. I want the title attribute to read "Foobar - Books" (or similar). Any way to do this?

EDIT: I'm talking about the HTML <title> attribute, not as per my_page.title, as seen in header.html in the examples. It would be superfluous inside my_page.title... I suspect this is in some way a stupid question, but I'd like to hear what you think. :)

Refactor for better maintainability [dev]

IMO, the current codebase requires some serious refactoring to improve maintainablity.

  • Use shorter Lines of Code, consistently.
    Currently, some lines are miles long.. e.g.

    # Compatibility Note: (REMOVE AFTER 2018-01-01)
    # If the legacy paginate logic is configured then read those values and merge with config
    if !site.config['paginate'].nil?
    Jekyll.logger.info "Pagination:","Legacy paginate configuration settings detected and will be used."
    # You cannot run both the new code and the old code side by side
    if !site.config['pagination'].nil?
    err_msg = "The new jekyll-paginate-v2 and the old jekyll-paginate logic cannot both be configured in the site config at the same time. Please disable the old 'paginate:' config settings by either omitting the values or setting them to 'paginate:off'."
    Jekyll.logger.error err_msg
    raise ArgumentError.new(err_msg)
    end

  • Break up large functions / methods into smaller manageable (private) methods
    e.g. PaginationGenerator.rb#generate runs from L21-L138

  • Use faster Enumerable#each and similar instead of for..in loops

  • Prefer using private keyword instead of using leading underscores in method names. e.g.

    def _fix_deprecated_config_features(config)
    keys_to_delete = []
    # As of v1.5.1 the title_suffix is deprecated and 'title' should be used
    # but only if title has not been defined already!
    if( !config['title_suffix'].nil? )
    if( config['title'].nil? )
    config['title'] = ":title" + config['title_suffix'].to_s # Migrate the old key to title
    end
    keys_to_delete << "title_suffix" # Always remove the depricated key if found
    end
    # Delete the depricated keys
    config.delete_if{ |k,| keys_to_delete.include? k }
    end

Multiple "or" categories?

I'm working on updating a project from the deprecated jekyll-paginate to this one and running into an issue where we want our homepage to feature posts from any of multiple categories. When I list out the five plus categories in our frontmatter, the index page is straight up removed.

I've pulled in the latest from master since the last release and that indeed keeps the page, but there are no posts. I'm guessing this is because the multiple categories is doing an "and" join on them?

Example frontmatter:

---
layout: blog
home: true
pagination:
  enabled: true
  category: ship, engineering, enterprise, education, conferences
---

Filter by category and lang?

Hi! First of all, let me thank you for the work you've done with this plugin. It is by far the more easy plugin I have used for monthes with Jekyll in order to accomplish my blog's pagination and I have never been this close to accomplish my objectives.

I try to use the pagination with both cateogies and lang. For example, having an index for the "cars" category with only the english posts, and another for the "cars" category with only the french posts. Can I do that with the plugin?

Get rid of `index.html` in previous_page_path and next_page_path

I would like to have links to my pages without the index.html.
Right now previous_page_path and next_page_path add index.html at the end. For example:

http://localhost:4000/page/2/index.html

I would like to have:

http://localhost:4000/pepe/2/

I'm currently making use of this code for the pagination links I found on the typical blog example:

  <!--
    Showing buttons to move to the next and to the previous list of posts (pager buttons).
  -->
  {% if paginator.total_pages > 1 %}
  <ul class="pager">
      {% if paginator.previous_page %}
      <li class="previous">
          <a href="{{ paginator.previous_page_path | prepend: site.baseurl | replace: '//', '/' }}">&larr; Newer Posts</a>
      </li>
      {% endif %}
      {% if paginator.next_page %}
      <li class="next">
          <a href="{{ paginator.next_page_path | prepend: site.baseurl | replace: '//', '/' }}">Older Posts &rarr;</a>
      </li>
      {% endif %}
  </ul>
  {% endif %}

Generator order when generating collections?

Hey, we're trying to develop a Jekyll plugin for the F-Droid website which creates a lot of Jekyll pages that belong to the collection "apps". Now we want to make a paginated list of these apps:

---
layout: page
title: Browse
permalink: /packages/
pagination:
  enabled: true
  debug: true
  collection: apps
  per_page: 30
  permalink: '/:num/'
  sort_field: 'title'
  title: ':title'
---

{% for app in paginator.posts %}
  {% include app-list-item.html app=app %}
{% endfor %}

This code has already successfully been tested with pre-generated files for each page. But now, when generating these pages with a plugin, our generator takes very long and and the paginate generator does his job when the pages haven't been created yet. So, is there a possibility (and if not, this might be a feature request) to tell the paginate generator to basically run later, when all the other generators have already finished?

Paginate other than index.md file

My site index.md is a static page, and I need pagination in the blog.md file
Here is my index.md

---
# You don't need to edit this file, it's empty on purpose.
# Edit theme's home layout instead if you wanna make some changes
# See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults
layout: page
---

blog.md

---
layout: home
pagination: 
  enabled: true
---

_layout/home.html

<div class="home">

  <h1 class="page-heading">Posts</h1>
  
  {{ content }}

  <ul class="post-list">
    {% for post in paginator.posts %}
      <li>
        <span class="post-meta">{{ post.date | date: "%b %-d, %Y" }}</span>

        <h2>
          <a class="post-link" href="{{ post.url | relative_url }}">{{ post.title | escape }}</a>
        </h2>
      </li>
    {% endfor %}
  </ul>

  {% if paginator.total_pages > 1 %}
<ul>
  {% if paginator.previous_page %}
  <li>
    <a href="{{ paginator.previous_page_path | prepend: site.baseurl }}">Newer</a>
  </li>
  {% endif %}
  {% if paginator.next_page %}
  <li>
    <a href="{{ paginator.next_page_path | prepend: site.baseurl }}">Older</a>
  </li>
  {% endif %}
</ul>
{% endif %}


  <p class="rss-subscribe">subscribe <a href="{{ "/feed.xml" | relative_url }}">via RSS</a></p>

</div>

config.yml

# Welcome to Jekyll!
#
# This config file is meant for settings that affect your whole blog, values
# which you are expected to set up once and rarely edit after that. If you find
# yourself editing this file very often, consider using Jekyll's data files
# feature for the data you need to update frequently.
#
# For technical reasons, this file is *NOT* reloaded automatically when you use
# 'bundle exec jekyll serve'. If you change this file, please restart the server process.

# Site settings
# These are used to personalize your new site. If you look in the HTML files,
# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
# You can create any custom variable you would like, and they will be accessible
# in the templates via {{ site.myvariable }}.
title: Your awesome title
email: [email protected]
description: > # this means to ignore newlines until "baseurl:"
  Write an awesome description for your new site here. You can edit this
  line in _config.yml. It will appear in your document head meta (for
  Google search results) and in your feed.xml site description.
baseurl: "" # the subpath of your site, e.g. /blog
url: "" # the base hostname & protocol for your site, e.g. http://example.com
twitter_username: jekyllrb
github_username:  jekyll

# Build settings
markdown: kramdown
theme: minima
gems:
  - jekyll-feed
gems: [jekyll-paginate-v2]
exclude:
  - Gemfile
  - Gemfile.lock
  
sass:
 load_paths:
  - _sass
  - bower_components
  
  
############################################################
# Site configuration for the Jekyll 3 Pagination Gem
# The values here represent the defaults if nothing is set
pagination:
  
  # Site-wide kill switch, disabled here it doesn't run at all 
  enabled: true

  # Set to 'true' to enable pagination debugging. This can be enabled in the site config or only for individual pagination pages
  debug: false

  # The default document collection to paginate if nothing is specified ('posts' is default)
  collection: 'posts'

  # How many objects per paginated page, used to be `paginate` (default: 0, means all)
  per_page: 10

  # The permalink structure for the paginated pages (this can be any level deep)
  permalink: '/page/:num/' # Pages are index.html inside this folder (default)
  #permalink: '/page/:num.html' # Pages are simple html files 
  #permalink: '/page/:num' # Pages are html files, linked jekyll extensionless permalink style.

  # Optional the title format for the paginated pages (supports :title for original page title, :num for pagination page number, :max for total number of pages)
  title: ':title - page :num'

  # Limit how many pagenated pages to create (default: 0, means all)
  limit: 0
  
  # Optional, defines the field that the posts should be sorted on (omit to default to 'date')
  sort_field: 'date'

  # Optional, sorts the posts in reverse order (omit to default decending or sort_reverse: true)
  sort_reverse: true

  # Optional, the default category to use, omit or just leave this as 'posts' to get a backwards-compatible behavior (all posts)
  category: 'posts'

  # Optional, the default tag to use, omit to disable
  tag: ''

  # Optional, the default locale to use, omit to disable (depends on a field 'locale' to be specified in the posts, 
  # in reality this can be any value, suggested are the Microsoft locale-codes (e.g. en_US, en_GB) or simply the ISO-639 language code )
  locale: '' 

 # Optional,omit or set both before and after to zero to disable. 
 # Controls how the pagination trail for the paginated pages look like. 
  trail: 
    before: 2
    after: 2

############################################################

My problem is posts are showing on index.md not in blog.md

maybe jekyll-paginate-v2 have conflict with jekyll-sitemap

when i run jekyll serve. it tells me that:

Liquid Exception: The URL template doesn't have num keys. Check your permalink template! in sitemap.xml

and

jekyll 3.3.1 | Error:  The URL template doesn't have num keys. Check your permalink template!

what is permalink template? where is it ?

hidden:true does not seem to hide posts from paginator.posts

I might be reading the documentation wrong, but this seems to imply that paginator.posts should not contain hidden posts. Or is this saying that other counters like paginator.total_pages won't count hidden pages even though paginator.posts will contain them?

accessing pagination permalink path?

The original jekyll paginate implementation had a single permalink which we can access in our includes/layouts with site.paginate_path

Does jekyll-paginate-v2 provide the permalink path down?

My goal is to be able to provide a list of links: similar to the below.

Previous, 1, 2, 3, 4, 5, Next

The example files only show Previous/Next and I'm unable to generate links for 1-5 without access to the paginate_path. I can hardcode it, but that prevents me from using the same includes file for everything I want paged.

Thanks

Category pagination not showing on Github but showing locally

Thanks for the awesome repo.
I was able to get pagination to work for two collections locally.
When I push my _site folder to github, the files and index.html are in the collection folder.
However, the collection root page does not show.

For example, here is the "round 2" collection root on the local server:
screen shot 2017-10-16 at 16 45 49

And here it is served at github.
screen shot 2017-10-16 at 16 46 01

I am uploading the site after bundle exec jekyll serve and the site folder is on github with the index. I'm not sure where I'm going wrong here. I tried changing the permalinks, but nothing I could come up with solved it.

I'm not sure if this is a paginate issue, a github issue, or (more likely) operator error.

Pagination with TagGenerator

I'm currently using the following code to generate a page for all my tags:

module Jekyll
  class TagIndex < Page
    def initialize(site, base, dir, tag)
      @site = site
      @base = base
      @dir = dir
      @name = 'index.html'
      self.process(@name)
      self.read_yaml(File.join(base, '_layouts'), 'tag_index.html')
      self.data['tag'] = tag
    end
  end

  class TagGenerator < Generator
    safe true
    def generate(site)
      if site.layouts.key? 'tag_index'
        dir = site.config['tag_dir'] || 'tag'
        site.tags.keys.each do |tag|
          write_tag_index(site, File.join(dir, tag), tag)
        end
      end
    end
    def write_tag_index(site, dir, tag)
      index = TagIndex.new(site, site.source, dir, tag)
      index.render(site.layouts, site.site_payload)
      index.write(site.dest)
      site.pages << index
    end
  end
end

This code will generate /:tag-name/index.html for each tag on the site. So I get something like:

  • /tags/tag1/index.html
  • /tags/tag2/index.html
  • /tags/tag3/index.html

What I'm trying to do is to paginate each of these indexes, to get something like:

  • /tags/tag1/index.html
  • /tags/tag1/page/2/index.html
  • /tags/tag2/index.html
  • /tags/tag2/page/2/index.html
  • /tags/tag2/page/3/index.html
  • /tags/tag3/index.html

Any help you can provide to achieve this?

Previous / Next post

Is there a way to have a paginator inside each post? Or inside their common layout? I would like to add a Previous and Next button on each post but couldn't find a way to do so. Otherwise, really cool plugin, autopages are super useful.

Make autopages.display_name available to title

Is there a way to output the display name along with the page x of x string? I tried swapping page.title with page.autopages.display_name but it loses the Page :num of :max bit.

page.tag = "Foo Bar"

<title>{{ page.title }}<title> ~> <title>foo-bar - Page x of x</title> <title>{{ page.autopages.display_name }}</title> ~> <title>Foo Bar</title>

Pagination for authors

Hey again,

another problem of me is, I want to have a multi-author-blog and want to autogenerate pages with all articles for a specific author. I know of the autopages "optional pagination addon", but I'm not sure if this is already designed for this kind of issue. Cool would be, if this autogenerated page could include something like a description and maybe even a picture of the author.
If this is already possible, how would I do this?

Or is it one more feature request?

when run 02-category there is problem

there is problem

/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/resolver.rb:366:in `block in verify_gemfile_dependencies_are_found!': Could not find gem 'jekyll (= 3.3.0)' in any of the gem sources listed in your Gemfile or available on this machine. (Bundler::GemNotFound)
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/resolver.rb:341:in `each'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/resolver.rb:341:in `verify_gemfile_dependencies_are_found!'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/resolver.rb:199:in `start'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/resolver.rb:181:in `resolve'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/definition.rb:250:in `resolve'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/definition.rb:174:in `specs'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/definition.rb:233:in `specs_for'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/definition.rb:222:in `requested_specs'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:118:in `block in definition_method'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:19:in `setup'
	from /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.13.6/lib/bundler.rb:99:in `setup'
	from /usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.3.1/lib/jekyll/plugin_manager.rb:36:in `require_from_bundler'
	from /usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.3.1/exe/jekyll:9:in `<top (required)>'
	from /usr/local/bin/jekyll:22:in `load'
	from /usr/local/bin/jekyll:22:in `<main>'

by the way, i am sure i have installed jekyll-paginate-v2.

i have installed it before jekyll serve.

02-category >sudo gem install jekyll-paginate-v2
Password:
Successfully installed jekyll-paginate-v2-1.7.4
Parsing documentation for jekyll-paginate-v2-1.7.4
Done installing documentation for jekyll-paginate-v2 after 0 seconds

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.