Unfortunately Carbon has been without an API for too long, and I've run into a few cases where one would be useful for a project. So I present to you, Inkify, an API for generating beautiful pictures of your code.
Inkify relies on the silicon library for generating photos, and takes much the same arguments as the silicon CLI does. Arguments are passed as query parameters to the /generate
route, and are as follows:
- code: The code to generate an image from. Required.
- language: The language to use for syntax highlighting. Optional, will attempt to guess if not provided.
- theme: The theme to use for syntax highlighting. Optional, defaults to Dracula.
- font: The font to use. Optional, defaults to Fira Code.
- shadow_color: The color of the shadow. Optional, defaults to transparent.
- background: The background color. Optional, defaults to transparent.
- tab_width: The tab width. Optional, defaults to 4.
- line_pad: The line padding. Optional, defaults to 2.
- line_offset: The line offset. Optional, defaults to 1.
- window_title: The window title. Optional, defaults to "Inkify".
- no_line_number: Whether to hide the line numbers. Optional, defaults to false.
- no_round_corner: Whether to round the corners. Optional, defaults to false.
- no_window_controls: Whether to hide the window controls. Optional, defaults to false.
- shadow_blur_radius: The shadow blur radius. Optional, defaults to 0.
- shadow_offset_x: The shadow offset x. Optional, defaults to 0.
- shadow_offset_y: The shadow offset y. Optional, defaults to 0.
- pad_horiz: The horizontal padding. Optional, defaults to 80.
- pad_vert: The vertical padding. Optional, defaults to 100.
- highlight_lines: The lines to highlight. Optional, defaults to none.
- background_image: The background image for the padding area as a URL. Optional, defaults to none.
The index route is used as a help/ping route. It will always return a 200 response if the API is live, and the body is a JSON object containing a message and a list of routes.
The generate route is used to generate images. It takes the arguments listed above as query parameters, and returns a PNG image.
The detect route is used to detect the language of a code snippet. It takes a single argument, code
, which is the code to detect the language of. It returns a sorted list of languages, along with the confidence of the detection (as a number between 0 and 100).
The themes route is used to get a list of available themes. It takes no arguments, and returns a JSON object containing a list of themes.
The fonts route is used to get a list of available fonts. It takes no arguments, and returns a JSON object containing a list of fonts.
The languages route is used to get a list of available languages. It takes no arguments, and returns a JSON object containing a list of languages supported by the syntect library (which is used by silicon under the hood).
Inkify is written in Rust using the actix-web framework, and can be deployed as a standalone binary. It can also be deployed as a Docker container, and a Dockerfile is provided for this purpose. The Dockerfile also installs all nerd fonts by default, allowing you to use any of them as the font for your code.
Contributions are welcome, and can be made by opening a pull request. Please make sure to lint your code using cargo clippy
before submitting a pull request.
Inkify is licensed under the MIT license. See the LICENSE file for more information.