{"id":13612354,"url":"https://github.com/mslinn/jekyll_outline","last_synced_at":"2026-01-19T12:33:58.029Z","repository":{"id":62559519,"uuid":"487852573","full_name":"mslinn/jekyll_outline","owner":"mslinn","description":"Organizes the index of a collection into chapters.","archived":false,"fork":false,"pushed_at":"2025-09-29T15:32:42.000Z","size":5402,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-14T21:51:52.369Z","etag":null,"topics":["jekyll","jekyll-plugin"],"latest_commit_sha":null,"homepage":"https://www.mslinn.com/jekyll_plugins/jekyll_outline.html","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mslinn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-05-02T13:19:58.000Z","updated_at":"2025-09-29T15:32:46.000Z","dependencies_parsed_at":"2025-07-14T19:20:06.064Z","dependency_job_id":"0035025e-694e-4517-98cc-c1224cea7b8f","html_url":"https://github.com/mslinn/jekyll_outline","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":0.4285714285714286,"last_synced_commit":"1812b152c8652685a84c7120eb29f399e3ac47bc"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/mslinn/jekyll_outline","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mslinn%2Fjekyll_outline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mslinn%2Fjekyll_outline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mslinn%2Fjekyll_outline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mslinn%2Fjekyll_outline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mslinn","download_url":"https://codeload.github.com/mslinn/jekyll_outline/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mslinn%2Fjekyll_outline/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28567903,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T08:53:44.001Z","status":"ssl_error","status_checked_at":"2026-01-19T08:52:40.245Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["jekyll","jekyll-plugin"],"created_at":"2024-08-01T20:00:28.563Z","updated_at":"2026-01-19T12:33:58.016Z","avatar_url":"https://github.com/mslinn.png","language":"Ruby","funding_links":[],"categories":["Tags"],"sub_categories":[],"readme":"# `jekyll_outline` [![Gem Version](https://badge.fury.io/rb/jekyll_outline.svg)](https://badge.fury.io/rb/jekyll_outline)\n\n`jekyll_outline` Jekyll tag plugin that creates a clickable table of contents.\n\n\n## Order\n\nThis plugin requires every page in a collection to have an entry for\n\u003ccode\u003eorder\u003c/code\u003e in its front matter.\nThe value of \u003ccode\u003eorder\u003c/code\u003e must be an integer.\nThis entry is normally used for sorting the pages.\n\nThe front matter for [this page](https://mslinn.com/jekyll_plugins/jekyll_outline.html) is:\n\n```yaml\n---\ncategories: [Jekyll]\ndate: 2020-10-03\ndescription: \"Organizes the index of a collection into chapters.\"\nlast_modified_at: 2025-01-09\nlayout: jekyll\norder: 100\ntitle: \u003cspan class=\"code\"\u003ejekyll_outline\u003c/span\u003e\n---\n```\n\n\n## Examples\n\nYou can see this plugin in action in most of the index pages of [`mslinn.com`](https://mslinn.com).\nFollowing is the source for two of them:\n\n### [Django / Oscar](https://mslinn.com/django/index.html)\n\nThis is the simplest possible outline, without images.\n\n```text\n{% outline attribution django %}\n0: Django / Oscar Evaluation\n400: Notes\n800: Digging Deeper\n1900: Debugging\n2700: Production\n{% endoutline %}\n```\n\n### [A/V Studio Technology](https://mslinn.com/av_studio/index.html)\n\nThis outline features images associated with specific entries.\n\n```html\n{% outline attribution av_studio %}\n0: Production Infrastructure\n150: Audio\n200: Video\n300: RME TotalMix\n400: OBS Studio\n500: Pro Tools\n550: Ableton Live \u0026amp; Push\n600: Other Music Software\n700: MIDI Hardware \u0026amp; Software\n800: Davinci Resolve\n1000: Computer Analysis\n2000: Music Theory\n3000: Business\n4000: General\n{% endoutline %}\n\n\u003cdiv style=\"display: none\"\u003e\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_150\"\n    src=\"/av_studio/images/everse8/everse8d.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_200\"\n    src=\"./images/equipment/sony_a7iii/sony_a7iii.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_300\"\n    src=\"./images/rme/rme_logo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_400\"\n    src=\"./images/obsStudio/obs_logo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_500\"\n    src=\"./images/proTools/proToolsLogo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_550\"\n    src=\"./images/ableton/ableton_live_logo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"rounded\"\n    id=\"outline_600\"\n    src=\"./images/music21.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_700\"\n    src=\"./images/midi/MIDI_logo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_800\"\n    src=\"./images/davinci_resolve/daVinci_resolve_logo.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"rounded\"\n    id=\"outline_2000\"\n    src=\"./images/music_theory.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n  {% img\n    align=\"right\"\n    class=\"\"\n    id=\"outline_4000\"\n    src=\"./images/handsfree/pageflip_firefly.webp\"\n    size=\"eighthsize\"\n    style=\"margin-top: 0\"\n    wrapper_class=\"clear\"\n  %}\n\u003c/div\u003e\n\n{% outline_js wrap_in_script_tag %}\n```\n\n\n## Usage\n\nAll files in a collection are included in the outline,\nexcept for those whose name starts with `index`,\nand those with the following in their front matter:\n\n```yaml\nexclude_from_outline: true\n```\n\nNote that Jekyll requires all documents in a collection to have a value for `order` in their front matter.\nThis value is ignored by `outline_tag` if `exclude_from_outline` has a truthy value.\n\nThe following examples are taken from [`demo/index.html`](demo/index.html).\n\nSort by the `order` field:\n\n```html\n{% outline attribution pattern=\"\u003cb\u003e title \u003c/b\u003e \u0026ndash; \u003ci\u003e description \u003c/i\u003e\" stuff %}\n000: A Topic 0..19\n020: A Topic 20..39\n040: A Topic 40..\n{% endoutline %}\n```\n\nSort by `title` field:\n\n```html\n{% outline attribution sort_by_title pattern=\"\u003cb\u003e title \u003c/b\u003e \u0026ndash; \u003ci\u003e description \u003c/i\u003e\" stuff %}\n000: B Topic 0..19\n020: B Topic 20..39\n040: B Topic 40..\n{% endoutline %}\n```\n\n\n## Installation\n\nAdd the following line to your Jekyll project's Gemfile, within the `jekyll_plugins` group:\n\n```ruby\ngroup :jekyll_plugins do\n  gem 'jekyll_outline'\nend\n```\n\nAnd then execute:\n\n```shell\n$ bundle\n```\n\n\n## Fields\n\nBy default, each displayed entry consists of a document title,\nwrapped within an \u0026lt;a href\u0026gt; HTML tag that links to the page for that entry,\nfollowed by an indication of whether the document is visible (a draft) or not.\n\nEntry can also include following pattern:\n`draft`, `categories`, `description`, `date`, `last_modified` or `last_modified_at`, `layout`, `order`, `title`, `slug`,\n`ext`, and `tags`.\n\nSpecify the pattern like this:\n\n```html\n{% outline pattern=\"title \u0026ndash; \u003ci\u003e description \u003c/i\u003e\" %}\n000: Topic 0..19\n020: Topic 20..39\n040: Topic 40..\n{% endoutline %}\n```\n\nWords in the `pattern` argument that are not recognized as a field are transcribed into the output.\n\nIn the above example, notice that the HTML is space delimited from the field names.\nThe parser is simple and stupid: each token is matched against the known keywords.\nTokens are separated by white space.\n\n\n### CSS\n\nThe CSS used for the demo website should be copied to your project.\nSee [`demo/assets/css/jekyll_outline.css`](https://github.com/mslinn/jekyll_outline/blob/master/demo/assets/css/jekyll_outline.css).\n\n\n### JavaScript\n\nCopy [`jekyll_outline.js`](https://github.com/mslinn/jekyll_outline/blob/master/demo/assets/js/jekyll_outline.js)\nto your Jekyll website's JavaScript directory.\n\nThis project's `outline_js` tag returns the Javascript necessary to position images relating to the outline.\nIf used without parameters it just returns the JavaScript.\nUse the tag this way:\n\n```html\n\u003cscript\u003e\n  {%= outline_js %}\n\u003c/script\u003e\n```\n\nIf passed the `wrap_in_script_tag` parameter, it wraps the JavaScript in `\u003cscript\u003e\u003c/script\u003e`.\nUse the tag this way:\n\n```html\n{% outline_js wrap_in_script_tag %}\n```\n\n\n## Explanation\n\nGiven an outline that looks like this:\n\n```html\n{% outline stuff %}\n000: Topic 0..19\n020: Topic 20..39\n040: Topic 40..\n{% endoutline %}\n```\n\n...and given pages in the `stuff` collection with the following names:\n\n- `010-published.html` has title **Published Stuff Post 010**\n- `020-unpublished.html` has title **Unpublished Post 020**\n- `030-unpublished.html` has title **Unpublished Post 030**\n\nThen links to the pages in the `stuff` collection's pages are interleaved into the generated outline like this:\n\n```html\n\u003cdiv class=\"outer_posts\"\u003e\n  \u003ch3 class='post_title clear' id=\"title_0\"\u003eTopic 0..19\u003c/h3\u003e\n  \u003cdiv id='posts_wrapper_0' class='clearfix'\u003e\n    \u003cdiv id='posts_0' class='posts'\u003e\n      \u003cspan\u003e2022-04-01\u003c/span\u003e \u003cspan\u003e\u003ca href='/stuff/010-published.html'\u003ePublished Stuff Post 010\u003c/a\u003e\u003c/span\u003e\n      \u003cspan\u003e2022-04-17\u003c/span\u003e \u003cspan\u003e\u003ca href='/stuff/020-unpublished.html'\u003eUnpublished Post 020\u003c/a\u003e \u003ci class='jekyll_draft'\u003eDraft\u003c/i\u003e\u003c/span\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n  \u003ch3 class='post_title clear' id=\"title_20\"\u003eTopic 20..39\u003c/h3\u003e\n  \u003cdiv id='posts_wrapper_20' class='clearfix'\u003e\n    \u003cdiv id='posts_20' class='posts'\u003e\n      \u003cspan\u003e2022-04-17\u003c/span\u003e \u003cspan\u003e\u003ca href='/stuff/030-unpublished.html'\u003eUnpublished Post 030\u003c/a\u003e \u003ci class='jekyll_draft'\u003eDraft\u003c/i\u003e\u003c/span\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/div\u003e\n```\n\nThe JavaScript searches for images in the current page that were created by the\n[`img`](https://github.com/mslinn/jekyll_img) tag plugin,\nand have `id`s that correspond to outline sections.\n\nEach of following image's `id`s have an `outline_` prefix, followed by a number, which corresponds to one of the sections.\nNote that leading zeros in the first column above are not present in the `id`s below.\n\nHeadings that do not have corresponding pages are not displayed.\n\nIf you want to provide images to embed at appropriate locations within the outline,\nwrap them within an invisible `div` so the web page does not jump around as the images are loaded.\n\n```html\n\u003cdiv style=\"display: none;\"\u003e\n{% img align=\"right\"\n  id=\"outline_0\"\n  size=\"quartersize\"\n  src=\"/assets/images/porcelain_washbasin.webp\"\n  style=\"margin-top: 0\"\n  wrapper_class=\"clear\"\n%}\n{% img align=\"right\"\n  id=\"outline_20\"\n  size=\"quartersize\"\n  src=\"/assets/images/pipes.webp\"\n  style=\"margin-top: 0\"\n  wrapper_class=\"clear\"\n%}\n{% img align=\"right\"\n  id=\"outline_40\"\n  size=\"quartersize\"\n  src=\"/assets/images/libgit2.webp\"\n  style=\"margin-top: 0\"\n  wrapper_class=\"clear\"\n%}\n\u003c/div\u003e\n```\n\nThe JavaScript identifies the images and repositions them in the DOM such that they follow the appropriate heading.\nIf no image corresponds to a heading, no error or warning is generated.\nThe images can be located anywhere on the page; they will be relocated appropriately.\nIf an image does not correspond to a heading, it is deleted.\n\n\n## Attribution\n\nSee [`jekyll_plugin_support` for `attribution`](https://github.com/mslinn/jekyll_plugin_support#subclass-attribution)\n\n\n## Additional Information\n\nMore information is available on\n[Mike Slinn\u0026rsquo;s website](https://www.mslinn.com/jekyll/3000-jekyll-plugins.html#outline).\n\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install development dependencies.\n\nThen you can run `bin/console` for an interactive prompt that will allow you to experiment using `irb`.\n\n### Build and Install Locally\n\nTo build and install this gem onto your local machine, run:\n\n```shell\n$ bundle exec rake install\njekyll_outline 0.1.0 built to pkg/jekyll_outline-0.1.0.gem.\njekyll_outline (0.1.0) installed.\n\n$ gem info jekyll_outline\n\n*** LOCAL GEMS ***\n\njekyll_outline (0.1.0)\n    Author: Mike Slinn\n    Homepage:\n    https://github.com/mslinn/jekyll_outline\n    License: MIT\n    Installed at: /home/mslinn/.gems\n\n    Generates Jekyll logger with colored output.\n```\n\n\n## Demo\n\nA demo / test website is provided in the `demo` directory.\nIt can be used to debug the plugin or to run freely.\n\n\n### Run Freely\n\n1. Run from the command line:\n\n   ```shell\n   $ demo/_bin/debug -r\n   ```\n\n2. View the generated website at [`http://localhost:4444`](http://localhost:4444)\n\n\n### Plugin Debugging\n\n1. Set breakpoints in Visual Studio Code.\n\n2. Initiate a debug session from the command line:\n\n   ```shell\n   $ demo/_bin/debug\n   ```\n\n3. Once the `Fast Debugger` signon appears, launch the Visual Studio Code launch\n   configuration called `Attach rdebug-ide`.\n4. View the generated website at [`http://localhost:4444`](http://localhost:4444)\n\n\n## Release\n\nTo release a new version,\n\n1. Update the version number in `version.rb`.\n2. Describe the changes in `CHANGELOG.md`.\n3. Commit all changes to git; if you don't the next step might fail with an unexplainable error message.\n4. Run the following:\n\n    ```shell\n    $ bundle exec rake release\n    ```\n\n    The above creates a git tag for the version, commits the created tag,\n    and pushes the new `.gem` file to [RubyGems.org](https://rubygems.org).\n\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/mslinn/jekyll_outline.\n\n1. Fork the project\n2. Create a descriptively named feature branch\n3. Add your feature\n4. Submit a pull request\n\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmslinn%2Fjekyll_outline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmslinn%2Fjekyll_outline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmslinn%2Fjekyll_outline/lists"}