{"id":15564081,"url":"https://github.com/dahlia/jikji","last_synced_at":"2025-05-05T17:38:37.363Z","repository":{"id":40344255,"uuid":"389723370","full_name":"dahlia/jikji","owner":"dahlia","description":"Small static site generator toolkit","archived":false,"fork":false,"pushed_at":"2024-12-20T08:14:41.000Z","size":589,"stargazers_count":22,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-07T20:21:27.678Z","etag":null,"topics":["deno","static-site-generator","typescript"],"latest_commit_sha":null,"homepage":"https://jsr.io/@hongminhee/jikji","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dahlia.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-07-26T17:56:38.000Z","updated_at":"2024-12-20T08:58:35.000Z","dependencies_parsed_at":"2025-01-05T11:41:52.978Z","dependency_job_id":"9b34c26d-9fd9-45ba-9541-8c5d847d77b8","html_url":"https://github.com/dahlia/jikji","commit_stats":{"total_commits":142,"total_committers":1,"mean_commits":142.0,"dds":0.0,"last_synced_commit":"93f1b75b4c49dde007805fe3674de6f3c3a83200"},"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dahlia%2Fjikji","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dahlia%2Fjikji/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dahlia%2Fjikji/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dahlia%2Fjikji/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dahlia","download_url":"https://codeload.github.com/dahlia/jikji/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252543905,"owners_count":21765241,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["deno","static-site-generator","typescript"],"created_at":"2024-10-02T16:36:04.298Z","updated_at":"2025-05-05T17:38:37.340Z","avatar_url":"https://github.com/dahlia.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- deno-fmt-ignore-file --\u003e\n\u003cimg src=\"jikji.png\" width=\"95\" height=\"190\" align=\"right\" alt=\"\"\u003e\n\nJikji: small static site generator toolkit\n==========================================\n\n[![JSR][JSR badge]][JSR]\n[![LGPL 3.0][License badge]](./LICENSE)\n[![GitHub Actions][GitHub Actions status badge]][GitHub Actions]\n[![Codecov][Codecov badge]][Codecov]\n\nJikji is a small toolkit for building your own static site generators on [Deno].\n\nCurrently, it provides the below *composable building blocks*:\n\n -  Parallel generation\n -  Partial generation\n -  Flexible permalinks\n -  Watch changes \u0026 reload\n -  First-class support for [content negotiation] on type \u0026 language\n -  Markdown (powered by [markdown-it])\n -  EJS/ETS template engine (powered by [dejs])\n -  [SCSS] stylesheet preprocessor\n\n[JSR badge]: https://jsr.io/badges/@hongminhee/jikji\n[JSR]: https://jsr.io/@hongminhee/jikji\n[License badge]: https://img.shields.io/github/license/dahlia/jikji\n[GitHub Actions]: https://github.com/dahlia/jikji/actions/workflows/main.yaml\n[GitHub Actions status badge]: https://github.com/dahlia/jikji/actions/workflows/main.yaml/badge.svg\n[Codecov badge]: https://codecov.io/gh/dahlia/jikji/branch/main/graph/badge.svg?token=UBDX4Inrz6\n[Codecov]: https://codecov.io/gh/dahlia/jikji\n[Deno]: https://deno.com/\n[content negotiation]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation\n[markdown-it]: https://github.com/markdown-it/markdown-it\n[dejs]: https://github.com/syumai/dejs\n[SCSS]: https://sass-lang.com/\n\n\nExample\n-------\n\n~~~~ typescript\nimport {\n  intoDirectory,\n  scanFiles,\n  rebase,\n  writeFiles\n} from \"https://deno.land/x/jikji/mod.ts\";\nimport { markdown } from \"https://deno.land/x/jikji/markdown.ts\";\n\nconst baseUrl = new URL(\"http://localhost:8000/\");\nconst outDir = \"public_html\";\n\n// Scans for Markdown files in the posts/ directory:\nawait scanFiles([\"posts/**/*.md\"])\n  // Renders posts written in Markdown to HTML:\n  .transform(markdown(), { type: \"text/markdown\" })\n  // Makes permalinks like posts/foobar/ instead of posts/foobar.md\n  .move(intoDirectory())\n  // Maps the current directory to the target URL \u003chttps://example.com/\u003e:\n  // E.g., ./posts/foobar.md -\u003e https://example.com/posts/foobar/\n  .move(rebase(\"posts/\", baseUrl))\n  // Writes the files to the output directory (public_html/):\n  .forEach(writeFiles(outDir, baseUrl));\n  // If you want watch mode, use forEachWithReloading() instead:\n  // .forEachWithReloading(writeFiles(outDir, baseUrl));\n~~~~\n\nMore realistic examples are placed in the [*examples/* directory](examples/).\n\n\nKey concepts\n------------\n\nBuilding blocks that Jikji provides are based on the following concepts:\n\n -  [`Pipeline`] represents the entire steps from the input to the output.\n    It's like a stream of zero or more `Resource`s.  Its whole process is\n    lazy so that if some parts don't need to be generated again they are even\n    not loaded at all.\n    (In the above example, a new `Pipeline` is acquired using `scanFiles()`\n    function, but `scanFiles()` does not immediately list files nor load\n    their contents.)\n -  [`Resource`] represents an abstract resource which is mapped to a unique\n    `path`.  Its `path` is a rather URL than a filesystem path, which means\n    it has a scheme like `https` or `file` and can end with a slash.\n    (Note that `intoDirectory()` function turns *posts/foobar.md* into\n    *posts/foobar/* in the above example.) `Resource` also can has multiple\n    representations for [content negotiation] on type and language.\n -  [`Content`] represents an actual content which can belong to `Resource`s\n    as a representation.  The `ContentBody` can be lazily loaded and either\n    a Unicode text or binary data.  They are typed through IANA [`MediaType`s]\n    (formerly known as MIME types).  Optionally, they can have their\n    RFC 5656 [`LanguageTag`] to describe their natural language.  If you want\n    you can put additional `metadata` like `title` or `published` as well.\n -  [`ResourceTransformer`] transforms a `Resource` into a modified `Resource`.\n    It purposes to change multiple `Resources` into new ones in immutable style\n    by being passed to `Pipeline#map()` method.\n -  [`PathTransformer`] transforms a `URL` into a modified `URL`.  It purposes\n    to change multiple `Resource`s `path`s into new ones in immutable style by\n    being passed to `Pipeline#move()` method.\n    (In the above example, `intoDirectory()` and `rebase()` functions return\n    `PathTransformer`s.)\n -  [`ContentTransformer`] transforms a `Content` into a modified `Content`.\n    It purposes to change multiple representations of `Resource`s into new ones\n    in immutable style by being passed to `Pipeline#transform()` method.\n    (In the above example, `markdown()` function returns a\n    `ContentTransformer`.)\n\nSee also [API docs].\n\n\n[`Pipeline`]: https://jsr.io/@hongminhee/jikji/doc/pipeline/~/Pipeline\n[`Resource`]: https://jsr.io/@hongminhee/jikji/doc/resource/~/Resource\n[`Content`]: https://jsr.io/@hongminhee/jikji/doc/content/~/Content\n[`MediaType`s]: https://jsr.io/@hongminhee/jikji/doc/media-type/~/MediaType\n[`LanguageTag`]: https://jsr.io/@hongminhee/jikji/doc/language-tag/~/LanguageTag\n[`ResourceTransformer`]: https://jsr.io/@hongminhee/jikji/doc/pipeline/~/ResourceTransformer\n[`PathTransformer`]: https://jsr.io/@hongminhee/jikji/doc/pipeline/~/PathTransformer\n[`ContentTransformer`]: https://jsr.io/@hongminhee/jikji/doc/pipeline/~/ContentTransformer\n[API docs]: https://jsr.io/@hongminhee/jikji/doc\n\n\nChangelog\n---------\n\nSee [*CHANGES.md*](CHANGES.md).\n\n\nLicense\n-------\n\nDistributed under [LGPL 3.0].\n\n[LGPL 3.0]: https://www.gnu.org/licenses/lgpl-3.0.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdahlia%2Fjikji","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdahlia%2Fjikji","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdahlia%2Fjikji/lists"}